SQL Wo: Anwendungen und Beispiele. SQL Where-Anwendungen und Beispiele Beispielabfrage zur Auswahl numerischer Werte

Suche nach Objekten in allen Serverdatenbanken

Mussten Sie schon einmal eine Tabelle finden, um Daten oder eine Struktur nachzuschlagen, wissen aber nicht genau, in welcher Datenbank sie sich befinden? Das passiert mir ab und zu. Ein Beispiel ist, Tabellen aus einem fünf Jahre alten Projekt zu finden, um zu sehen, wie das aktuelle Problem damals gelöst wurde.

Glücklicherweise gibt es ein Verfahren sp_MSforeachdb, wodurch Sie ein solches Skript recht kompakt schreiben können:

DECLARE @name AS SYSNAME,
@strSQL AS VARCHAR(MAX)
SET @name = "Hierarchie"

SET @strSQL = "
IF EXISTS(SELECT * FROM ?..sysobjects WHERE name LIKE "
"%" [E-Mail geschützt]+"%" ")
START
WÄHLEN " "?" " db, name FROM ?..sysobjects WHERE name LIKE ""%" [E-Mail geschützt]+"%" "
ENDE
"
TABELLE ERSTELLEN #Ergebnis (
dbSYSNAME,
Name SYSNAME,
PRIMÄRSCHLÜSSEL (db,name))

INSERT #result EXEC sp_MSforeachdb @strSQL
WÄHLE * AUS #Ergebnis

DROP TABLE #Ergebnis

Hier ist alles ganz einfach:

  1. Wir legen den Teil des Namens fest, nach dem wir suchen werden (in diesem Fall - Hierarchie).
  2. Wir erfassen dynamisches SQL, das nach Sysobjects sucht (für einige ältere Versionen von MS SQL können Sie beispielsweise VARCHAR(2000) anstelle von VARCHAR(MAX) verwenden).
    In diesem Fall wird das Symbol "?" wird durch den Namen der Datenbank ersetzt.
  3. Mit dem Konstrukt INSERT ... EXEC speichern wir alle Ergebnisse in einer temporären Tabelle, um als Ergebnis ein einziges Ergebnis anzuzeigen.

Suche nach einer Teilzeichenfolge in Texten von gespeicherten Prozeduren

Wie Sie wissen, finden Sie in der Tabelle die Texte von Stored Procedures, Triggern und Views Systemkommentare.

Damit unsere vorherige Anfrage es uns ermöglicht, in Systemkommentaren eine Erwähnung einiger Teilzeichenfolgen zu finden, kann sie wie folgt umgeschrieben werden:

SET @strSQL="
AUSWÄHLEN DISTINCT " "?" "als db, o.name FROM [?].dbo.sysKommentare s
JOIN [?].dbo.sysobjects o ON o.id = s.id WHERE s. WIE"
"%" [E-Mail geschützt]+"%" ""

Achten Sie auf DISTINCT - es kann sich als nützlich erweisen, da es manchmal mehrere Einträge in Systemkommentaren für ein Objekt gibt.

Suchen Sie in allen Zeichenfolgenfeldern aller Tabellen nach einer Teilzeichenfolge

Ein solches Skript hilft, nach dem "Säubern" der Datenbank vor dem Senden an den Client ruhig zu schlafen. Selbstverständlich ist seine Anwendung nicht auf diesen Bereich beschränkt.

Für diesen Fall wurde kein Assistent in Form einer Prozedur von MS gefunden, also musste ich Cursor verwenden:

deklariere @pattern als nvarchar(MAX )
set @pattern = N"%Test%"
keine Zählung setzen
deklarieren Sie @sql als nvarchar(MAX )
Deklarieren Sie @table als Sysname
Deklarieren Sie den Tabellen-Cursor lokal statisch read_only für den ausgewählten Namen aus sys.tables t, wobei t.is_ms_shipped = 0 ist
offene Tische

erstelle Tabelle #results (name sysname not null , value nvarchar(MAX ) not null )
während @@FETCH_STATUS = 0
Start
setze @sql=""
wählen Sie @sql = @sql + "
in #Ergebnisse einfügen auswählen"
"" + @table + "." + name + "" " as name, [" + name + "] from [" + @table + "] where [" + name + "] like " "" + @pattern + "" ""
aus sys.columns c wobei c.object_id = OBJECT_ID(@table ) und c.system_type_id in
(wählen Sie system_type_id aus sys.types aus, wobei collation_name nicht null ist)
exec (@sql)
holen Sie sich den nächsten von Tabellen in @table
Ende
Wählen Sie * aus #Ergebnissen aus
Tische schließen
Drop-Tabelle #Ergebnisse

Abgesehen von den Cursorn sind die Prinzipien dieselben. Es gibt ein paar Nuancen:

  • Wir suchen nach Tabellen ohne das is_ms_shipped-Flag, um nur Tabellen anzuzeigen, die während der Entwicklung erstellt wurden.
  • Um Zeichenfolgenspalten auszuwählen, wird anstelle einer Liste von Typen (deren Pflege mühsam ist) der Filter „collation_name is not null“ verwendet.

Zusammenfassung

Der aufmerksame Leser muss anhand der Gestaltung erraten haben, dass das letzte Beispiel nicht gleichzeitig mit den ersten beiden geschrieben wurde. Genauer gesagt habe ich die letzte Anfrage vor einem Monat geschrieben. Das heißt, dass Sie auf der Grundlage dieses Ansatzes selbst nützliche Skripte schreiben können, die Ihre spezifischen Probleme lösen.

Wenn Leser dieses Format mögen, werde ich manchmal nützliche Skripte aus meiner persönlichen Sammlung posten.

Wenn Sie Kommentare, Vorschläge oder neue Themen haben - schreiben Sie in die Kommentare,

Es ist schwierig, die Syntax für die WHERE-Klausel von SQL Server zu erklären, also schauen wir uns einige Beispiele an.

Wir beginnen damit, uns anzusehen, wie die WHERE-Klausel mit nur einer einzigen Bedingung verwendet wird.

SELECT * FROM Mitarbeiter WHERE Vorname = "Jane";

In diesem Beispiel für die WHERE-Klausel von SQL Server haben wir die WHERE-Klausel verwendet, um unsere Ergebnisse aus dem zu filtern Mitarbeiter Tisch. Die obige SELECT-Anweisung würde alle Zeilen aus zurückgeben Mitarbeiter Tisch, wo die Vorname ist „Jane“. Da das * im SELECT verwendet wird, werden alle Felder aus dem Mitarbeiter Tabelle würde in der Ergebnismenge erscheinen.

Beispiel – Verwendung von UND-Bedingungen

Schauen wir uns an, wie die WHERE-Klausel mit der AND-Bedingung verwendet wird.

WÄHLEN Sie * VON Mitarbeitern AUS, WHERE Nachname = "Anderson" UND Mitarbeiter_ID >= 3000;

Dieses Beispiel für eine SQL Server-WHERE-Klausel verwendet die WHERE-Klausel, um mehrere Bedingungen zu definieren. In diesem Fall verwendet diese SELECT-Anweisung die AND-Bedingung, um alle zurückzugeben Mitarbeiter die haben ein Familienname, Nachname von "Anderson" und der Angestellten ID größer oder gleich 3000 ist.

Beispiel – Verwendung einer ODER-Bedingung

Schauen wir uns an, wie die WHERE-Klausel mit der OR-Bedingung verwendet wird.

SELECT employee_id, last_name, first_name FROM employee WHERE last_name = "Johnson" OR first_name = "Danielle";

In diesem SQL Server-Beispiel für eine WHERE-Klausel wird die WHERE-Klausel verwendet, um mehrere Bedingungen zu definieren, aber anstelle der AND-Bedingung wird die OR-Bedingung verwendet. In diesem Fall würde diese SELECT-Anweisung alles zurückgeben Angestellten ID, Familienname, Nachname, Und Vorname Werte aus der Mitarbeiter Tisch, wo die Familienname, Nachname ist "Johnson" oder die Vorname ist "Danielle".

Beispiel - Kombinieren von UND- und ODER-Bedingungen

Schauen wir uns an, wie die WHERE-Klausel verwendet wird, wenn wir die UND- und ODER-Bedingungen in einer einzigen SQL-Anweisung kombinieren.

AUSWÄHLEN * VON Mitarbeitern WO (Staat = "Kalifornien" UND Nachname = "Smith") ODER (Mitarbeiter_ID = 82);

Dieses Beispiel für eine SQL Server-WHERE-Klausel verwendet die WHERE-Klausel, um mehrere Bedingungen zu definieren, kombiniert jedoch die AND-Bedingung und die OR-Bedingung . Dieses Beispiel würde all zurückgeben Mitarbeiter die in wohnen Zustand von "Kalifornien" und dessen Familienname, Nachname ist "Smith" sowie alle Mitarbeiter dessen Angestellten ID ist gleich 82.

Die Klammern bestimmen die Reihenfolge, in der die Und ODER-Bedingungen werden ausgewertet. Genau wie Sie es in der Reihenfolge der Operationen im Matheunterricht gelernt haben!

Beispiel – Join-Tabellen

Schauen wir uns an, wie die WHERE-Klausel verwendet wird, wenn wir mehrere Tabellen zusammenfügen.

SELECT mitarbeiter.mitarbeiter_id, kontakte.nachname FROM mitarbeiter INNER JOIN kontakte EIN mitarbeiter.mitarbeiter_id = kontakte.kontakt_id WHERE mitarbeiter.vorname = "Sarah";

Dieses SQL Server-Beispiel für eine WHERE-Klausel verwendet die WHERE-Klausel, um mehrere Tabellen in einer einzigen SELECT-Anweisung zusammenzuführen. Diese SELECT-Anweisung würde alle Zeilen zurückgeben, in denen die Vorname im Mitarbeiter Tisch ist "Sarah". Und das Mitarbeiter s und Kontakte Tische werden auf dem verbunden Angestellten ID von dem Mitarbeiter Tisch und die Kontakt_ID von dem Kontakte Tisch.

In den meisten Fällen müssen Sie nicht alle Datensätze abrufen, sondern nur diejenigen, die bestimmte Kriterien erfüllen. Daher, um die Auswahl zu filtern SQL Es gibt einen speziellen Operator WO.

1. Einfaches Filtern mit dem WHERE-Operator.

Wählen wir zum Beispiel Datensätze aus unserer Tabelle aus, die sich nur auf ein bestimmtes Produkt beziehen. Dazu geben wir einen zusätzlichen Auswahlparameter an, der den Wert nach der Spalte filtert Produkt.

Beispielabfrage zum Auswählen von Textwerten:

WÄHLEN * VON Summenprodukt WO Produkt = "Fahrräder"

Wie Sie sehen können, ist die Auswahlbedingung in einfache Anführungszeichen eingeschlossen, was beim Filtern von Textwerten obligatorisch ist. Beim Filtern numerischer Werte sind keine Anführungszeichen erforderlich.

Beispielabfrage zur Auswahl numerischer Werte:

WÄHLEN > 40000 SORTIEREN NACH Menge

In diesem Beispiel haben wir Datensätze ausgewählt, bei denen der Verkaufserlös höher war als 40 Tausend $ und zusätzlich werden alle Datensätze aufsteigend nach Feldern sortiert Menge.

Die folgende Tabelle listet die unterstützten Bedingungsanweisungen auf SQL:

2. Filtern nach Wertebereich ( ZWISCHEN).

Verwenden Sie den Operator, um Daten auszuwählen, die in einem bestimmten Bereich liegen ZWISCHEN. Die nächste Abfrage wählt alle Werte dazwischen aus 1000 $ v 2000 $ inklusive, im Feld Menge.

WÄHLEN * FROM Summenprodukt WO Menge ZWISCHEN 1000 UND 2000

Die Sortierreihenfolge hängt von der Reihenfolge der Felder in der Abfrage ab. Das heißt, in unserem Fall werden die Daten zunächst nach Spalten sortiert Menge, und dann vorbei Stadt.

3. Auswahl leerer Datensätze ( IST NULL).

IN SQL Es gibt einen speziellen Operator zum Auswählen leerer Datensätze (genannt NULL). Ein leerer Eintrag ist jede Zelle in einer Tabelle, die keine Zeichen enthält. Wenn die Zelle betreten wird 0 oder Raum, dann gilt das Feld als gefüllt.

WÄHLEN * FROM Summenprodukt WO Menge IST NULL

Im obigen Beispiel haben wir absichtlich zwei Werte im Feld entfernt Menge um die Bedienung des Bedieners zu demonstrieren NULL.

4. Erweiterte Filterung ( UND, ODER).

Sprache SQL beschränkt sich nicht auf das Filtern nach einer Bedingung, für eigene Zwecke können Sie recht komplexe Strukturen verwenden, um Daten gleichzeitig nach vielen Kriterien zu selektieren. Dafür ein SQL Es gibt zusätzliche Operatoren, die die Fähigkeiten des Operators erweitern WO. Diese Operatoren sind: UND, ODER, IN, NICHT. Hier sind einige Beispiele dafür, wie diese Operatoren funktionieren.

WÄHLEN * FROM Summenprodukt WO Menge > 40000 UND Stadt = "Toronto"

WÄHLEN * VON Summenprodukt WO Monat= "April"ODER Monat= "März"

Lassen Sie uns Operatoren kombinieren UND Und ODER. Treffen wir dazu eine Auswahl an Fahrrädern ( Fahrräder ) und Schlittschuhe ( Rollschuhe ), die im März verkauft wurden (Marsch ).

WÄHLEN * VON Summenprodukt WO Produkt= "Fahrräder"ODER Produkt= "Schlittschuhe" UND Monat= "März"

Wir sehen, dass unsere Stichprobe viele Werte enthielt (mit Ausnahme von März ( Marsch), auch Januar ( Januar), Februar ( Februar) und April ( April)). Was ist der Grund? Und darin SQL hat Befehlsausführungsprioritäten. Das heißt, der Betreiber UND hat eine höhere Priorität als der Operator ODER, also wurden zuerst die Platten mit Schlittschuhen ausgewählt, die im März verkauft wurden, und dann alle Platten, die sich auf Fahrräder bezogen.

Um also die richtige Auswahl zu erhalten, müssen wir die Ausführungsprioritäten der Befehle ändern. Dafür verwenden wir Klammern wie in der Mathematik. Dann werden zuerst die Operatoren in Klammern verarbeitet und dann der Rest.

WÄHLEN * VON Summenprodukt WO (Produkt= "Fahrräder"ODER Produkt= "Schlittschuhe") UND Monat= "März"

5. Erweiterte Filterung ( IN-Operator).

WÄHLEN * VON Summenprodukt WO IDIN (4, 12, 58, 67)

Operator IN erfüllt die gleiche Funktion wie ODER, hat jedoch eine Reihe von Vorteilen:

  • Beim Arbeiten mit langen Listen wird der Satz mit IN einfacher zu lesen;
  • Es werden weniger Operatoren verwendet, was die Anfrageverarbeitung beschleunigt;
  • Der wichtigste Vorteil IN, dass es bei seiner Konstruktion möglich ist, eine zusätzliche Konstruktion zu verwenden WÄHLEN, Was
  • eröffnet großartige Möglichkeiten zum Erstellen komplexer Unterabfragen.

6. Erweiterte Filterung ( NICHT-Operator).

WÄHLEN * AUS Summenprodukt WO NICHT StadtIN ("Toronto", "Montreal")

Stichwort NICHT ermöglicht es Ihnen, unnötige Werte aus der Auswahl zu entfernen. Sein Merkmal ist auch, dass es vor dem Namen der Spalte platziert wird, die an der Filterung beteiligt ist, und nicht danach.

In diesem Artikel erzähle ich Ihnen von der bedingten CASE-Anweisung, ohne die die Datenerfassung in einer Reihe von Aufgaben zu Haufen von Codestücken werden würde, und wie Sie sie in SQL-Abfragen verwenden.

Unabhängig davon, wie gut Sie Ihre Datenbank entwerfen, wird es immer Probleme geben, bei denen bedingte Anweisungen unverzichtbar sind. Holen Sie sich beispielsweise anstelle großer Zahlen eine verbale Beschreibung oder fügen Sie je nach Vorhandensein (Fehlen) von Daten zusätzliche Zeichen zur Zeichenfolge hinzu oder weisen Sie als komplexeres Beispiel je nach verschiedenen Nuancen den Datensatz einem zu oder eine andere Gruppe. Viele Situationen.

Dieser Operator hat im Prinzip mindestens zwei Formulare in unterschiedlichen Datenbanken. Die erste Option ähnelt dem üblichen Wechsel von jeder Programmiersprache. Der zweite hängt von booleschen Ausdrücken ab.

In diesem Artikel werde ich jedoch die zweite Option in Betracht ziehen, da sie keine Probleme mit Situationen wie CASE WHEN NULL hat (Null ist kein spezifischer Wert in der Datenbank und kann daher nicht in einer switch-ähnlichen Anweisung verwendet werden). Darüber hinaus treten im Alltag am häufigsten Aufgaben speziell für die zweite Option auf - Berechnung durch logische Ausdrücke. Daher ist es besser, es sofort zu lernen und weiter zu verwenden.

Normalerweise wird es so beschrieben (Syntax kann je nach Datenbank variieren):

CASE WHEN bool_expression1 THEN value1 ..... WHEN bool_expressionN THEN valueN ELSE valueElse END

bool_expressionX ist eine boolesche Bedingung

valueX ist der Wert, der ersetzt wird, wenn die entsprechende boolesche Bedingung erfüllt ist

valueElse ist der Wert, der ersetzt wird, wenn zuvor keine Bedingung erfüllt wurde.

Lassen Sie uns nach so einer kleinen Referenz mit der Praxis fortfahren.

Notiz: Übrigens ist es wichtig zu wissen, dass diese Anweisung normalerweise nicht nur in select verwendet werden kann, sondern überall dort, wo Felder verwendet werden können. Wann zum Beispiel Tische beitreten oder auch filtern (haben) beim Gruppieren (gruppieren nach).

Bedingte Anweisung CASE...WHEN...THEN

Um die Bedingungsanweisung CASE...WHEN...THEN besser zu verstehen, stellen Sie sich ein kleines Problem vor. Nehmen wir an, Sie haben eine Tabelle mit Daten über Kunden und deren Gesamtzahl der Käufe. Und die Aufgabe besteht darin, dynamisch einen Rabatt zu bilden. Es wäre natürlich möglich, den Rabatt manuell einzustellen. Aber Sie haben einen Schwellenwert, und die Schwellenwerte sind fest verdrahtet (etwas wie - bei einem Betrag von mehr als 1000 erhalten Sie einen Rabatt von 2 % und bei einem Betrag von mehr als 5000 erhalten Sie 5 %), und Sie möchten diesen Prozess automatisieren, damit Sie dies tun Sie müssen nicht jedes Mal nach Fehlern suchen, um in die Datenbank einzutauchen (der Kunde hat den erforderlichen Betrag angesammelt - der Rabatt wurde automatisch angezeigt).

Nehmen wir einen bedingten Tabellenclient mit drei Clients. Zum Beispiel werden sie genug sein.

Lassen Sie uns nun mehrere Bedingungen für die automatische Gewährung von Rabatten basierend auf der Aufgabe festlegen. Gleichzeitig glauben wir, dass dem Kunden in jedem Fall der maximale Rabatt gewährt wird.

1. Betrag ab 1000 - 2% Rabatt

2. Betrag ab 5000 - 5% Rabatt

3. Betrag ab 10000 - 8% Rabatt

4. Bestellmenge von 10 - 7% Rabatt

5. Bestellmenge von 20 - 8% Rabatt

Wie Sie sehen, hängt der Rabatt von zwei Faktoren ab: dem Betrag und der Menge. Versuchen wir nun, Bedingungen basierend auf dem Rabatt zu erstellen, dh die Regeln sind umgekehrt, damit sie in einer SQL-Abfrage verwendet werden können. Wir erhalten Folgendes:

1. 2 % - Betrag von 1000 bis 4999 und die Anzahl der Bestellungen beträgt weniger als 10.

2. 5% - Betrag von 5000 bis 9999 und die Anzahl der Bestellungen beträgt weniger als 10.

3. 7% - Anzahl der Bestellungen von 10 bis 19 und der Betrag beträgt weniger als 10000

4. 8% - Menge ab 20 oder Menge ab 10000

Jetzt bleibt nur noch, es aufzuschreiben. Holen Sie sich die folgende SQL-Abfrage

Anzeige des Namens und anderer Daten select name, order_count, total_sum, -- Und jetzt Anzeige des Rabatts CASE -- Erste Regel 2% WHEN c.total_sum >= 1000 und c.total_sum<= 4999 and c.order_count < 10 THEN 2 -- Второе правило 5% WHEN c.total_sum >= 5000 und c.total_sum<= 9999 and c.order_count < 10 THEN 5 -- Третье правило 7% WHEN c.total_sum < 10000 and c.order_count >= 10 und c.order_count<= 19 THEN 5 -- Четвертое правило 8% WHEN c.total_sum >= 10000 oder c.order_count >= 20 THEN 5 -- Keine übereinstimmenden Regeln, daher ist der Rabatt 0. ELSE 0 END als Rabatt von Kunde c

Als Ergebnis der Ausführung erhalten wir die folgende Tabelle:

Wie Sie sehen können, erhielten zwei Kunden einen Rabatt von 8 % und ein Kunde einen Rabatt von 2 %. Gleichzeitig wird der Prozentsatz bei jeder Bestellung automatisch berechnet und Sie müssen nichts anpassen. Erhöht sich beispielsweise Petyas Betrag auf 5000, dann erhöht sich sein Rabatt automatisch auf 5 % (zumindest, da noch eine Reihe von Bestellungen vorliegen).

mob_info