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:

  1. Ü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.
  2. 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 Festplatte SELECT <columns> FROM <table> .
  3. 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
  4. 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 Namen displayname hinzugefügt wird, damit Benutzer ihren Bestellungen aussagekräftige Namen für die spätere Bezugnahme geben können, wird der Spaltenname displayname zweimal in der Ausgabe, so dass die ORDER 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 Email PreferredContact
3347927472 [email protected] TELEFON
2137921892 [email protected] EMAIL
NULL [email protected] EMAIL

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 Aggregatfunktion AVG() 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 Aggregatfunktion MIN() gibt das Minimum der ausgewählten Werte zurück.
SELECT MIN(Salary) FROM Employees

Maximal

Die Aggregatfunktion MAX() gibt das Maximum der ausgewählten Werte zurück.
SELECT MAX(Salary) FROM Employees

Anzahl

Die Aggregatfunktion COUNT() 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 Aggregatfunktion SUM() 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

SQLFiddle-Demo

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow