Suche…
Einführung
Die SELECT-Anweisung steht im Mittelpunkt der meisten SQL-Abfragen. Sie definiert, welche Ergebnismenge von der Abfrage zurückgegeben werden soll, und wird fast immer in Verbindung mit der FROM-Klausel verwendet, die definiert, welche Teile der Datenbank abgefragt werden sollen.
Syntax
SELECT [DISTINCT] [Spalte1] [, [Spalte2] ...]
FROM [Tabelle]
[WO Bedingung]
[GROUP BY [Spalte1] [, [Spalte2] ...][HABEN [Spalte1] [, [Spalte2] ...]
[BESTELLEN VON ASC | DESC]
Bemerkungen
SELECT bestimmt, welche Spaltendaten in welcher Reihenfolge FROM in einer bestimmten Tabelle zurückgegeben werden sollen (vorausgesetzt, sie entsprechen den anderen Anforderungen Ihrer Abfrage, und zwar wo und mit Filtern und Verknüpfungen).
SELECT Name, SerialNumber
FROM ArmyInfo
gibt nur Ergebnisse aus den Spalten Name
und Serial Number
, nicht jedoch aus der Spalte Rank
SELECT *
FROM ArmyInfo
zeigt an, dass alle Spalten zurückgegeben werden. Beachten Sie jedoch, dass es üblich ist, SELECT *
da Sie buchstäblich alle Spalten einer Tabelle zurückgeben.
Verwenden Sie das Platzhalterzeichen, um alle Spalten in einer Abfrage auszuwählen.
Betrachten Sie eine Datenbank mit den folgenden zwei Tabellen.
Mitarbeiter-Tabelle:
Ich würde | FName | LName | DeptId |
---|---|---|---|
1 | James | Schmied | 3 |
2 | John | Johnson | 4 |
Abteilungen Tabelle:
Ich würde | Name |
---|---|
1 | Der Umsatz |
2 | Marketing |
3 | Finanzen |
4 | ES |
Einfache select-Anweisung
*
ist das Platzhalterzeichen , mit dem alle verfügbaren Spalten in einer Tabelle ausgewählt werden.
Bei der Verwendung als Ersatz für explizite Spaltennamen werden alle Spalten in allen Tabellen zurückgegeben, für die eine Abfrage FROM
. Dieser Effekt gilt für alle Tabellen, auf die die Abfrage über ihre JOIN
Klauseln zugreift.
Betrachten Sie die folgende Abfrage:
SELECT * FROM Employees
Es werden alle Felder aller Zeilen der Employees
Tabelle zurückgegeben:
Ich würde | FName | LName | DeptId |
---|---|---|---|
1 | James | Schmied | 3 |
2 | John | Johnson | 4 |
Punktnotation
Um alle Werte aus einer bestimmten Tabelle auszuwählen, kann das Platzhalterzeichen mit Punktnotation auf die Tabelle angewendet werden .
Betrachten Sie die folgende Abfrage:
SELECT
Employees.*,
Departments.Name
FROM
Employees
JOIN
Departments
ON Departments.Id = Employees.DeptId
Dadurch wird ein Datensatz mit allen Feldern in der Employee
Tabelle zurückgegeben, gefolgt von dem Feld Name
in der Departments
Tabelle:
Ich würde | FName | LName | DeptId | Name |
---|---|---|---|---|
1 | James | Schmied | 3 | Finanzen |
2 | John | Johnson | 4 | ES |
Warnungen vor dem Gebrauch
Im Allgemeinen wird empfohlen, die Verwendung von *
im Produktionscode möglichst zu vermeiden, da dies eine Reihe potenzieller Probleme verursachen kann, darunter:
- Überschüssiges E / A, Netzwerklast, Speicherauslastung usw., da die Datenbank-Engine nicht benötigte Daten liest und an den Front-End-Code überträgt. Dies ist insbesondere dann von Belang, wenn große Felder vorhanden sind, beispielsweise zum Speichern langer Notizen oder angehängter Dateien.
- Weitere übermäßige E / A-Belastung, wenn die Datenbank interne Ergebnisse als Teil der Verarbeitung für eine komplexere Abfrage als
SELECT <columns> FROM <table>
auf die FestplatteSELECT <columns> FROM <table>
. - Zusätzliche Verarbeitung (und / oder sogar mehr E / A), wenn einige der nicht benötigten Spalten folgende sind:
- berechnete Spalten in Datenbanken, die sie unterstützen
- Im Falle der Auswahl aus einer Ansicht Spalten aus einer Tabelle / Ansicht, die der Abfrageoptimierer ansonsten optimieren könnte
- Das Potenzial für unerwartete Fehler, wenn zu Tabellen und Ansichten später Spalten hinzugefügt werden, die mehrdeutige Spaltennamen ergeben. Zum Beispiel
SELECT * FROM orders JOIN people ON people.id = orders.personid ORDER BY displayname
- Wenn der Spalte "displayname
eine Spalte mit dem Namendisplayname
hinzugefügt wird, damit Benutzer ihren Bestellungen aussagekräftige Namen für die spätere Bezugnahme geben können, wird der Spaltennamedisplayname
zweimal in der Ausgabe, so dass dieORDER BY
Klausel mehrdeutig ist, was zu Fehlern führen kann ("mehrdeutiger Spaltenname" in den letzten MS SQL Server-Versionen), und wenn dies nicht der Fall ist, zeigt der Anwendungscode möglicherweise den Auftragsnamen an, in dem sich der Personenname befindet bestimmt, weil die neue Spalte der erste Name dieses Namens ist und so weiter.
Wann können Sie *
, um die obige Warnung zu beachten?
In Produktionscode am besten vermieden, ist die Verwendung von *
als Abkürzung für manuelle Abfragen der Datenbank für Untersuchungen oder Prototypen geeignet.
Designentscheidungen in Ihrer Anwendung machen es manchmal unvermeidlich (bevorzugen tablealias.*
in solchen Fällen tablealias.*
nur *
wenn möglich).
Wenn Sie EXISTS
, z. B. SELECT A.col1, A.Col2 FROM A WHERE EXISTS (SELECT * FROM B where A.ID = B.A_ID)
, werden keine Daten von B zurückgegeben. Daher ist ein Join nicht SELECT A.col1, A.Col2 FROM A WHERE EXISTS (SELECT * FROM B where A.ID = B.A_ID)
Engine weiß, dass keine Werte von B zurückgegeben werden sollen, daher wird für die Verwendung von *
kein Performance-Treffer erzielt. Ebenso ist COUNT(*)
in Ordnung, da es auch keine der Spalten zurückgibt. Es müssen also nur diejenigen gelesen und verarbeitet werden, die für Filterzwecke verwendet werden.
Auswahl mit Bedingung
Die Grundsyntax der Klausel SELECT mit WHERE lautet:
SELECT column1, column2, columnN
FROM table_name
WHERE [condition]
Die [Bedingung] kann ein beliebiger SQL-Ausdruck sein, der mit Vergleichs- oder logischen Operatoren wie>, <, =, <>,> =, <=, LIKE, NOT, IN, BETWEEN usw. angegeben wird
Die folgende Anweisung gibt alle Spalten aus der Tabelle 'Cars' zurück, in der die Statusspalte 'READY' lautet:
SELECT * FROM Cars WHERE status = 'READY'
Weitere Beispiele finden Sie unter WO und HAVING .
Wählen Sie einzelne Spalten aus
SELECT
PhoneNumber,
Email,
PreferredContact
FROM Customers
Diese Anweisung gibt die Spalten PhoneNumber
, Email
und PreferredContact
aus allen Zeilen der Customers
Tabelle zurück. Die Spalten werden auch in der Reihenfolge zurückgegeben, in der sie in der SELECT
Klausel erscheinen.
Das Ergebnis wird sein:
Telefonnummer | PreferredContact | |
---|---|---|
3347927472 | [email protected] | TELEFON |
2137921892 | [email protected] | |
NULL | [email protected] |
Wenn mehrere Tabellen zusammengefügt werden, können Sie Spalten aus bestimmten Tabellen auswählen, indem Sie den Tabellennamen vor dem Spaltennamen [table_name].[column_name]
: [table_name].[column_name]
SELECT
Customers.PhoneNumber,
Customers.Email,
Customers.PreferredContact,
Orders.Id AS OrderId
FROM
Customers
LEFT JOIN
Orders ON Orders.CustomerId = Customers.Id
* AS OrderId
bedeutet, dass das Id
Feld der Orders
Tabelle als Spalte mit dem Namen OrderId
. Weitere Informationen finden Sie unter Auswählen mit Spaltenalias .
Um zu vermeiden, lange Tabellennamen zu verwenden, können Sie Tabellen-Aliase verwenden. Dadurch wird das Schreiben von langen Tabellennamen für jedes Feld, das Sie in den Joins auswählen, verringert. Wenn Sie eine Selbstverknüpfung durchführen (eine Verknüpfung zwischen zwei Instanzen derselben Tabelle), müssen Sie Tabellenaliasnamen verwenden, um Ihre Tabellen zu unterscheiden. Wir können einen Tabellenalias wie Customers c
oder Customers AS c
schreiben. Hier fungiert c
als Alias für Customers
und wir können Email
wie c.Email
auswählen: c.Email
.
SELECT
c.PhoneNumber,
c.Email,
c.PreferredContact,
o.Id AS OrderId
FROM
Customers c
LEFT JOIN
Orders o ON o.CustomerId = c.Id
SELECT Verwenden Sie Spaltenaliasnamen
Spaltenaliase werden hauptsächlich verwendet, um Code zu verkürzen und Spaltennamen lesbarer zu machen.
Code wird kürzer, da lange Tabellennamen und unnötige Identifizierung von Spalten (z. B. zwei IDs in der Tabelle, aber nur eine in der Anweisung verwendet wird) vermieden werden können. Zusammen mit Tabellenaliasnamen können Sie in der Datenbankstruktur längere beschreibende Namen verwenden, während die Abfragen für diese Struktur kurz gehalten werden.
Darüber hinaus sind sie manchmal erforderlich , zum Beispiel in Ansichten, um berechnete Ausgaben zu benennen.
Alle Versionen von SQL
Aliase können in allen SQL-Versionen mit Anführungszeichen ( "
) erstellt werden.
SELECT
FName AS "First Name",
MName AS "Middle Name",
LName AS "Last Name"
FROM Employees
Verschiedene SQL-Versionen
Sie können einfache Anführungszeichen ( '
), doppelte Anführungszeichen ( "
) und eckige Klammern ( []
) verwenden, um einen Alias in Microsoft SQL Server zu erstellen.
SELECT
FName AS "First Name",
MName AS 'Middle Name',
LName AS [Last Name]
FROM Employees
Beides führt zu:
Vorname | Zweiter Vorname | Nachname |
---|---|---|
James | John | Schmied |
John | James | Johnson |
Michael | Marcus | Williams |
Diese Anweisung LName
Spalten FName
und LName
mit einem angegebenen Namen (einem Alias) zurück. Dies wird erreicht, indem der AS
Operator gefolgt von dem Alias verwendet wird oder indem der Alias direkt nach dem Spaltennamen geschrieben wird. Dies bedeutet, dass die folgende Abfrage dasselbe Ergebnis wie oben ergibt.
SELECT
FName "First Name",
MName "Middle Name",
LName "Last Name"
FROM Employees
Vorname | Zweiter Vorname | Nachname |
---|---|---|
James | John | Schmied |
John | James | Johnson |
Michael | Marcus | Williams |
Die explizite Version (dh die Verwendung des AS
Operators) ist jedoch besser lesbar.
Wenn der Alias ein einzelnes Wort hat, das kein reserviertes Wort ist, können wir es ohne einfache Anführungszeichen, doppelte Anführungszeichen oder Klammern schreiben:
SELECT
FName AS FirstName,
LName AS LastName
FROM Employees
Vorname | Nachname |
---|---|
James | Schmied |
John | Johnson |
Michael | Williams |
Eine weitere Variante, die unter anderem in MS SQL Server verfügbar ist, ist <alias> = <column-or-calculation>
, zum Beispiel:
SELECT FullName = FirstName + ' ' + LastName,
Addr1 = FullStreetAddress,
Addr2 = TownName
FROM CustomerDetails
was äquivalent ist zu:
SELECT FirstName + ' ' + LastName As FullName
FullStreetAddress As Addr1,
TownName As Addr2
FROM CustomerDetails
Beides führt zu:
Vollständiger Name | Addr1 | Addr2 |
---|---|---|
James Smith | 123 AnyStreet | Townville |
John Johnson | 668 MyRoad | Irgendeine Stadt |
Michael Williams | 999 High End Dr | Williamsburgh |
Einige finden using =
anstelle von As
einfacher zu lesen, obwohl viele dieses Format empfehlen, vor allem, weil es nicht standardmäßig ist und daher nicht von allen Datenbanken unterstützt wird. Es kann zu Verwechslungen mit anderen Verwendungen des Zeichens =
.
Alle Versionen von SQL
Auch, wenn Sie reservierte Wörter verwenden müssen, können Sie Klammern oder Anführungszeichen zu entkommen:
SELECT
FName as "SELECT",
MName as "FROM",
LName as "WHERE"
FROM Employees
Verschiedene SQL-Versionen
Ebenso können Sie Schlüsselwörter in MSSQL mit allen unterschiedlichen Ansätzen schützen:
SELECT
FName AS "SELECT",
MName AS 'FROM',
LName AS [WHERE]
FROM Employees
WÄHLEN | VON | WOHER |
---|---|---|
James | John | Schmied |
John | James | Johnson |
Michael | Marcus | Williams |
Ein Spaltenalias kann auch eine der abschließenden Klauseln derselben Abfrage verwenden, beispielsweise eine ORDER BY
:
SELECT
FName AS FirstName,
LName AS LastName
FROM
Employees
ORDER BY
LastName DESC
Sie dürfen jedoch nicht verwenden
SELECT
FName AS SELECT,
LName AS FROM
FROM
Employees
ORDER BY
LastName DESC
So erstellen Sie einen Alias aus diesen reservierten Wörtern ( SELECT
und FROM
).
Dies führt zu zahlreichen Fehlern bei der Ausführung.
Auswahl mit sortierten Ergebnissen
SELECT * FROM Employees ORDER BY LName
Diese Anweisung gibt alle Spalten aus der Tabelle Employees
.
Ich würde | FName | LName | Telefonnummer |
---|---|---|---|
2 | John | Johnson | 2468101214 |
1 | James | Schmied | 1234567890 |
3 | Michael | Williams | 1357911131 |
SELECT * FROM Employees ORDER BY LName DESC
Oder
SELECT * FROM Employees ORDER BY LName ASC
Diese Anweisung ändert die Sortierrichtung.
Man kann auch mehrere Sortierspalten angeben. Zum Beispiel:
SELECT * FROM Employees ORDER BY LName ASC, FName ASC
In diesem Beispiel werden die Ergebnisse zuerst nach LName
und dann für Datensätze mit demselben LName
nach FName
. Dadurch erhalten Sie ein ähnliches Ergebnis wie in einem Telefonbuch.
Um die erneute Eingabe des Spaltennamens in der ORDER BY
Klausel zu speichern, können Sie stattdessen die Spaltennummer verwenden. Beachten Sie, dass die Spaltennummern mit 1 beginnen.
SELECT Id, FName, LName, PhoneNumber FROM Employees ORDER BY 3
Sie können auch eine CASE
Anweisung in die ORDER BY
Klausel einbetten.
SELECT Id, FName, LName, PhoneNumber FROM Employees ORDER BY CASE WHEN LName='Jones` THEN 0 ELSE 1 END ASC
Dadurch werden Ihre Ergebnisse so sortiert, dass alle Datensätze mit dem LName
von "Jones" oben LName
.
Wählen Sie Spalten aus, die nach reservierten Schlüsselwörtern benannt sind
Wenn ein Spaltenname mit einem reservierten Schlüsselwort übereinstimmt, müssen Sie für Standard-SQL-Anführungszeichen doppelte Anführungszeichen verwenden:
SELECT
"ORDER",
ID
FROM ORDERS
Beachten Sie, dass der Spaltenname zwischen Groß- und Kleinschreibung unterscheidet.
Einige Datenbankverwaltungssysteme verfügen über proprietäre Möglichkeiten, Namen anzugeben. Beispielsweise verwendet SQL Server für diesen Zweck eckige Klammern:
SELECT
[Order],
ID
FROM ORDERS
Während MySQL (und MariaDB) standardmäßig Backticks verwenden:
SELECT
`Order`,
id
FROM orders
Festlegen der angegebenen Anzahl von Datensätzen
Der SQL 2008-Standard definiert die Klausel FETCH FIRST
, um die Anzahl der zurückgegebenen Datensätze zu begrenzen.
SELECT Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC
FETCH FIRST 10 ROWS ONLY
Dieser Standard wird nur in neueren Versionen einiger RDMS unterstützt. In anderen Systemen wird herstellerspezifische Nicht-Standardsyntax bereitgestellt. Progress OpenEdge 11.x unterstützt auch die Syntax FETCH FIRST <n> ROWS ONLY
.
Darüber hinaus OFFSET <m> ROWS
vor FETCH FIRST <n> ROWS ONLY
Überspringen von Zeilen, bevor Zeilen OFFSET <m> ROWS
.
SELECT Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC
OFFSET 5 ROWS
FETCH FIRST 10 ROWS ONLY
Die folgende Abfrage wird in SQL Server und MS Access unterstützt:
SELECT TOP 10 Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC
Um dies in MySQL oder PostgreSQL zu tun, muss das Schlüsselwort LIMIT
verwendet werden:
SELECT Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC
LIMIT 10
In Oracle kann das gleiche mit ROWNUM
:
SELECT Id, ProductName, UnitPrice, Package
FROM Product
WHERE ROWNUM <= 10
ORDER BY UnitPrice DESC
Ergebnisse : 10 Datensätze.
Id ProductName UnitPrice Package
38 Côte de Blaye 263.50 12 - 75 cl bottles
29 Thüringer Rostbratwurst 123.79 50 bags x 30 sausgs.
9 Mishi Kobe Niku 97.00 18 - 500 g pkgs.
20 Sir Rodney's Marmalade 81.00 30 gift boxes
18 Carnarvon Tigers 62.50 16 kg pkg.
59 Raclette Courdavault 55.00 5 kg pkg.
51 Manjimup Dried Apples 53.00 50 - 300 g pkgs.
62 Tarte au sucre 49.30 48 pies
43 Ipoh Coffee 46.00 16 - 500 g tins
28 Rössle Sauerkraut 45.60 25 - 825 g cans
Verkäufer Nuances:
Es ist wichtig , dass die beachten TOP
in Microsoft SQL nach der arbeitet WHERE
- Klausel und die angegebene Anzahl der Ergebnisse zurück , wenn sie überall in der Tabelle existieren, während ROWNUM
im Rahmen der Arbeiten WHERE
- Klausel so , wenn andere Bedingungen existieren nicht in dem Wenn Sie eine bestimmte Anzahl von Zeilen am Anfang der Tabelle angeben, erhalten Sie null Ergebnisse, wenn andere gefunden werden können.
Auswahl mit Tabellenalias
SELECT e.Fname, e.LName
FROM Employees e
Die Employees-Tabelle erhält den Alias 'e' direkt nach dem Tabellennamen. Dies hilft, Mehrdeutigkeiten in Szenarien zu beseitigen, in denen mehrere Tabellen denselben Feldnamen haben und Sie müssen angeben, aus welcher Tabelle Sie Daten zurückgeben möchten.
SELECT e.Fname, e.LName, m.Fname AS ManagerFirstName
FROM Employees e
JOIN Managers m ON e.ManagerId = m.Id
Wenn Sie einen Alias definiert haben, können Sie den kanonischen Tabellennamen nicht mehr verwenden. dh
SELECT e.Fname, Employees.LName, m.Fname AS ManagerFirstName
FROM Employees e
JOIN Managers m ON e.ManagerId = m.Id
würde einen Fehler werfen.
Es ist erwähnenswert, dass Tabellenaliasnamen - formell 'Bereichsvariablen' - in die SQL-Sprache eingeführt wurden, um das Problem der durch INNER JOIN
verursachten doppelten Spalten zu lösen. Der SQL-Standard von 1992 korrigierte diesen früheren Konstruktionsfehler durch Einführung von NATURAL JOIN
(implementiert in mySQL, PostgreSQL und Oracle, aber noch nicht in SQL Server), dessen Ergebnis niemals doppelte Spaltennamen hat. Das obige Beispiel ist ManagerId
interessant, als die Tabellen in Spalten mit unterschiedlichen Namen ( Id
und ManagerId
) zusammengefügt werden, jedoch nicht in den Spalten mit demselben Namen ( LName
, FName
), die die Spalten umbenennen müssen vor dem join:
SELECT Fname, LName, ManagerFirstName
FROM Employees
NATURAL JOIN
( SELECT Id AS ManagerId, Fname AS ManagerFirstName
FROM Managers ) m;
Beachten Sie, dass zwar eine Alias- / Bereichsvariable für die dervied-Tabelle deklariert werden muss (andernfalls löst SQL einen Fehler aus), es ist jedoch niemals sinnvoll, sie in der Abfrage zu verwenden.
Zeilen aus mehreren Tabellen auswählen
SELECT *
FROM
table1,
table2
SELECT
table1.column1,
table1.column2,
table2.column1
FROM
table1,
table2
Dieses Produkt wird in SQL als Kreuzprodukt bezeichnet. Es ist dasselbe wie ein Kreuzprodukt in Sets
Diese Anweisungen geben die ausgewählten Spalten aus mehreren Tabellen in einer Abfrage zurück.
Es gibt keine bestimmte Beziehung zwischen den von jeder Tabelle zurückgegebenen Spalten.
Auswahl mit Aggregatfunktionen
Durchschnittlich
Die AggregatfunktionAVG()
gibt den Durchschnitt der ausgewählten Werte zurück. SELECT AVG(Salary) FROM Employees
Aggregatfunktionen können auch mit der where-Klausel kombiniert werden. SELECT AVG(Salary) FROM Employees where DepartmentId = 1
Aggregatfunktionen können auch mit der Group-by-Klausel kombiniert werden. Wenn ein Mitarbeiter nach mehreren Abteilungen kategorisiert ist und wir für jede Abteilung einen Durchschnittslohn suchen, können wir die folgende Abfrage verwenden.
SELECT AVG(Salary) FROM Employees GROUP BY DepartmentId
Minimum
Die AggregatfunktionMIN()
gibt das Minimum der ausgewählten Werte zurück. SELECT MIN(Salary) FROM Employees
Maximal
Die AggregatfunktionMAX()
gibt das Maximum der ausgewählten Werte zurück. SELECT MAX(Salary) FROM Employees
Anzahl
Die AggregatfunktionCOUNT()
gibt die Anzahl der ausgewählten Werte zurück. SELECT Count(*) FROM Employees
Sie kann auch mit "where" -Bedingungen kombiniert werden, um die Anzahl der Zeilen zu ermitteln, die bestimmte Bedingungen erfüllen. SELECT Count(*) FROM Employees where ManagerId IS NOT NULL
Es können auch bestimmte Spalten angegeben werden, um die Anzahl der Werte in der Spalte abzurufen. Beachten Sie, dass NULL
Werte nicht gezählt werden. Select Count(ManagerId) from Employees
Die Zählung kann auch mit dem eindeutigen Schlüsselwort für eine eindeutige Zählung kombiniert werden. Select Count(DISTINCT DepartmentId) from Employees
Summe
Die AggregatfunktionSUM()
gibt die Summe der für alle Zeilen ausgewählten Werte zurück. SELECT SUM(Salary) FROM Employees
Auswahl mit null
SELECT Name FROM Customers WHERE PhoneNumber IS NULL
Die Auswahl mit Nullen hat eine andere Syntax. Verwenden Sie nicht =
, verwenden Sie stattdessen IS NULL
oder IS NOT NULL
.
Auswahl mit CASE
Wenn für die Ergebnisse eine sofortige Anwendung der Logik erforderlich ist, können Sie die CASE-Anweisung verwenden, um sie zu implementieren.
SELECT CASE WHEN Col1 < 50 THEN 'under' ELSE 'over' END threshold
FROM TableName
kann auch verkettet werden
SELECT
CASE WHEN Col1 < 50 THEN 'under'
WHEN Col1 > 50 AND Col1 <100 THEN 'between'
ELSE 'over'
END threshold
FROM TableName
man kann auch CASE
in einer anderen CASE
Anweisung haben
SELECT
CASE WHEN Col1 < 50 THEN 'under'
ELSE
CASE WHEN Col1 > 50 AND Col1 <100 THEN Col1
ELSE 'over' END
END threshold
FROM TableName
Auswählen ohne die Tabelle zu sperren
Wenn Tabellen meistens (oder nur) für Lesevorgänge verwendet werden, hilft die Indexierung nicht mehr und jedes bisschen zählt, man kann Selects ohne LOCK verwenden, um die Leistung zu verbessern.
SQL Server
SELECT * FROM TableName WITH (nolock)
MySQL
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM TableName;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Orakel
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM TableName;
DB2
SELECT * FROM TableName WITH UR;
wobei UR
für "Uncommitted Read" steht.
Bei Verwendung in einer Tabelle mit laufenden Datensatzänderungen können unvorhersehbare Ergebnisse auftreten.
Wähle eindeutig (nur eindeutige Werte)
SELECT DISTINCT ContinentCode
FROM Countries;
Diese Abfrage gibt alle DISTINCT
Werte (unique, different) aus der ContinentCode
Spalte aus der Countries
Tabelle zurück
ContinentCode |
---|
OC |
EU |
WIE |
N / A |
AF |
Wählen Sie mit der Bedingung mehrerer Werte aus der Spalte
SELECT * FROM Cars WHERE status IN ( 'Waiting', 'Working' )
Dies ist semantisch äquivalent zu
SELECT * FROM Cars WHERE ( status = 'Waiting' OR status = 'Working' )
dh value IN ( <value list> )
ist eine Abkürzung für Disjunktion (logisches OR
).
Sammelt das Ergebnis für Zeilengruppen
Zeilen basierend auf einem bestimmten Spaltenwert zählen:
SELECT category, COUNT(*) AS item_count
FROM item
GROUP BY category;
Durchschnittliches Einkommen nach Abteilungen erzielen:
SELECT department, AVG(income)
FROM employees
GROUP BY department;
Wichtig ist, nur die in der GROUP BY
Klausel angegebenen Spalten auszuwählen oder mit Aggregatfunktionen zu verwenden .
Die WHERE
Klausel kann auch mit GROUP BY
, aber WHERE
filtert Datensätze heraus, bevor eine Gruppierung vorgenommen wird:
SELECT department, AVG(income)
FROM employees
WHERE department <> 'ACCOUNTING'
GROUP BY department;
Wenn Sie die Ergebnisse nach der Gruppierung filtern müssen, um z. B. nur Abteilungen HAVING
, deren durchschnittliches Einkommen mehr als 1000 beträgt, müssen Sie die HAVING
Klausel verwenden:
SELECT department, AVG(income)
FROM employees
WHERE department <> 'ACCOUNTING'
GROUP BY department
HAVING avg(income) > 1000;
Auswahl mit mehr als 1 Bedingung.
Das AND
Schlüsselwort wird verwendet, um der Abfrage weitere Bedingungen hinzuzufügen.
Name | Alter | Geschlecht |
---|---|---|
Sam | 18 | M |
John | 21 | M |
Bob | 22 | M |
Maria | 23 | F |
SELECT name FROM persons WHERE gender = 'M' AND age > 20;
Dies wird zurückkehren:
Name |
---|
John |
Bob |
Verwenden Sie das OR
Schlüsselwort
SELECT name FROM persons WHERE gender = 'M' OR age < 20;
Dies wird zurückkehren:
Name |
---|
Sam |
John |
Bob |
Diese Schlüsselwörter können kombiniert werden, um komplexere Kriterienkombinationen zu ermöglichen:
SELECT name
FROM persons
WHERE (gender = 'M' AND age < 20)
OR (gender = 'F' AND age > 20);
Dies wird zurückkehren:
Name |
---|
Sam |
Maria |