Zoeken…
Invoering
De SELECT-instructie vormt de kern van de meeste SQL-query's. Het definieert welke resultaatset door de query moet worden geretourneerd en wordt bijna altijd gebruikt in combinatie met de clausule FROM, die definieert welke delen van de database moeten worden opgevraagd.
Syntaxis
- SELECTEER [DISTINCT] [kolom1] [, [kolom2] ...] 
 VAN [tafel]
 [WAAR staat]
 [GROUP BY [column1] [, [column2] ...]- [HAVING [column1] [, [column2] ...] - [BESTELLEN BIJ ASC | DESC] 
Opmerkingen
SELECT bepaalt welke gegevens van de kolommen moeten worden geretourneerd en in welke volgorde VAN een gegeven tabel (gegeven dat deze specifiek overeenkomen met de andere vereisten in uw query - waar en met filters en joins).
SELECT Name, SerialNumber
FROM ArmyInfo
 retourneert alleen resultaten uit de kolommen Name en Serial Number , maar bijvoorbeeld niet uit de kolom Rank 
SELECT *
FROM ArmyInfo
 geeft aan dat alle kolommen worden geretourneerd. Houd er echter rekening mee dat het een slechte gewoonte is om SELECT * te SELECT * omdat u letterlijk alle kolommen van een tabel retourneert. 
Het jokerteken gebruiken om alle kolommen in een query te selecteren.
Overweeg een database met de volgende twee tabellen.
Werknemers tabel:
| ID kaart | FName | lname | DeptId | 
|---|---|---|---|
| 1 | James | smid | 3 | 
| 2 | John | Johnson | 4 | 
Afdelingen tabel:
| ID kaart | Naam | 
|---|---|
| 1 | verkoop | 
| 2 | afzet | 
| 3 | Financiën | 
| 4 | HET | 
Eenvoudig select statement
 * is het jokerteken dat wordt gebruikt om alle beschikbare kolommen in een tabel te selecteren. 
 Wanneer het wordt gebruikt als vervanging voor expliciete kolomnamen, retourneert het alle kolommen in alle tabellen die een query FROM selecteert. Dit effect is van toepassing op alle tabellen waartoe de query toegang heeft via de JOIN clausules. 
Overweeg de volgende vraag:
SELECT * FROM Employees
 Het retourneert alle velden van alle rijen van de tabel Employees : 
| ID kaart | FName | lname | DeptId | 
|---|---|---|---|
| 1 | James | smid | 3 | 
| 2 | John | Johnson | 4 | 
Puntnotatie
Om alle waarden uit een specifieke tabel te selecteren, kan het jokerteken met puntnotatie op de tabel worden toegepast.
Overweeg de volgende vraag:
SELECT 
    Employees.*, 
    Departments.Name
FROM 
    Employees
JOIN 
    Departments 
    ON Departments.Id = Employees.DeptId
 Dit retourneert een gegevensset met alle velden in de tabel Employee , gevolgd door alleen het veld Name in de tabel Departments : 
| ID kaart | FName | lname | DeptId | Naam | 
|---|---|---|---|---|
| 1 | James | smid | 3 | Financiën | 
| 2 | John | Johnson | 4 | HET | 
Waarschuwingen tegen gebruik
 Over het algemeen wordt geadviseerd om het gebruik van * waar mogelijk in de productiecode te vermijden, omdat dit een aantal potentiële problemen kan veroorzaken, waaronder: 
- Overmatige IO, netwerkbelasting, geheugengebruik, enzovoort, omdat de database-engine gegevens leest die niet nodig zijn en deze doorsturen naar de front-end code. Dit is met name een probleem als er grote velden zijn, zoals velden die worden gebruikt om lange notities of bijgevoegde bestanden op te slaan.
-  Verdere overmatige IO-belasting als de database interne resultaten naar schijf moet spoolen als onderdeel van de verwerking van een query die complexer is dan SELECT <columns> FROM <table>.
-  Extra verwerking (en / of zelfs meer IO) als sommige van de onnodige kolommen zijn: - berekende kolommen in databases die deze ondersteunen
- in het geval van het selecteren uit een weergave, kolommen uit een tabel / weergave die de queryoptimalisatie anders zou kunnen optimaliseren
 
-  Het potentieel voor onverwachte fouten als kolommen worden toegevoegd aan tabellen en weergaven die later leiden tot dubbelzinnige kolomnamen. Bijvoorbeeld SELECT * FROM orders JOIN people ON people.id = orders.personid ORDER BY displayname- als eendisplaynamemet de naamdisplaynamewordt toegevoegd aan de tabel met bestellingen zodat gebruikers hun bestellingen betekenisvolle namen kunnen geven voor toekomstig gebruik, verschijnt de kolomnaam tweemaal in de uitvoer, zodat deORDER BYcomponent dubbelzinnig is, wat fouten kan veroorzaken ("dubbelzinnige kolomnaam" in recente MS SQL Server-versies), en als dit niet het geval is in dit voorbeeld, kan uw toepassingscode beginnen met het weergeven van de ordernaam waar de persoonsnaam staat bedoeld omdat de nieuwe kolom de eerste van die naam is die wordt geretourneerd, enzovoort.
 Wanneer kunt u * , rekening houdend met bovenstaande waarschuwing? 
 Hoewel dit het beste kan worden vermeden in productiecode, is het gebruik van * prima als afkorting bij het uitvoeren van handmatige query's op de database voor onderzoek of prototypewerk. 
 Soms maken ontwerpbeslissingen in uw toepassing deze onvermijdelijk ( tablealias.* in dergelijke omstandigheden de voorkeur aan tablealias.* alleen * waar mogelijk). 
 Bij gebruik EXISTS , zoals SELECT A.col1, A.Col2 FROM A WHERE EXISTS (SELECT * FROM B where A.ID = B.A_ID) , we geen gegevens uit B. Aldus terugkeer een join overbodig, en engine weet dat er geen waarden van B moeten worden geretourneerd, dus geen prestatiehit voor het gebruik van * . Evenzo is COUNT(*) prima, aangezien het ook geen enkele kolom retourneert, dus alleen de kolommen moet worden gelezen en verwerkt die voor filterdoeleinden worden gebruikt. 
Selecteren met voorwaarde
De basissyntaxis van de SELECT met de clausule WHERE is:
SELECT column1, column2, columnN
FROM table_name
WHERE [condition]
De [voorwaarde] kan elke SQL-expressie zijn, gespecificeerd met behulp van vergelijking of logische operatoren zoals>, <, =, <>,> =, <=, LIKE, NOT, IN, TUSSEN etc.
De volgende instructie retourneert alle kolommen uit de tabel 'Auto's' waarbij de statuskolom 'KLAAR' is:
SELECT * FROM Cars WHERE status = 'READY'
Zie WAAR en HEBBEN voor meer voorbeelden.
Selecteer individuele kolommen
SELECT 
    PhoneNumber, 
    Email, 
    PreferredContact 
FROM Customers
 Deze verklaring retourneert de kolommen PhoneNumber , Email en PreferredContact uit alle rijen van de tabel Customers . De kolommen worden ook geretourneerd in de volgorde waarin ze worden weergegeven in de SELECT clausule. 
Het resultaat zal zijn:
| Telefoonnummer | PreferredContact | |
|---|---|---|
| 3347927472 | [email protected] | TELEFOON | 
| 2137921892 | [email protected] | |
| NUL | [email protected] | 
 Als meerdere tabellen zijn samengevoegd, kunt u kolommen uit specifieke tabellen selecteren door de tabelnaam op te geven vóór de kolomnaam: [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 betekent dat het veld Id van de tabel Orders wordt geretourneerd als een kolom met de naam OrderId . Zie selecteren met kolomalias voor meer informatie. 
 Om te voorkomen dat u lange tabelnamen gebruikt, kunt u tabelaliassen gebruiken. Dit vermindert de pijn van het schrijven van lange tabelnamen voor elk veld dat u in de joins selecteert. Als u een self-join uitvoert (een join tussen twee instanties van dezelfde tabel), moet u tabelaliassen gebruiken om uw tabellen te onderscheiden. We kunnen een tabelalias schrijven zoals Customers c of Customers AS c . Hier werkt c als een alias voor Customers en kunnen we bijvoorbeeld Email als volgt selecteren: 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 Gebruik Kolomaliassen
Kolomaliassen worden voornamelijk gebruikt om code in te korten en kolomnamen leesbaarder te maken.
Code wordt korter omdat lange tabelnamen en onnodige identificatie van kolommen (er kunnen bijvoorbeeld 2 ID's in de tabel staan, maar er wordt er slechts één gebruikt in de verklaring) worden vermeden. Samen met tabelaliassen kunt u langere beschrijvende namen in uw databasestructuur gebruiken, terwijl u de query's op die structuur beknopt houdt.
Bovendien zijn ze soms vereist , bijvoorbeeld in weergaven, om berekende uitgangen een naam te geven.
Alle versies van SQL
 Aliassen kunnen in alle versies van SQL worden gemaakt met dubbele aanhalingstekens ( " ). 
SELECT 
    FName AS "First Name", 
    MName AS "Middle Name",
    LName AS "Last Name"
FROM Employees  
Verschillende versies van SQL
 U kunt enkele aanhalingstekens ( ' ), dubbele aanhalingstekens ( " ) en vierkante haken ( [] ) gebruiken om een alias in Microsoft SQL Server te maken. 
SELECT 
    FName AS "First Name", 
    MName AS 'Middle Name',
    LName AS [Last Name]
FROM Employees  
Beide zullen resulteren in:
| Voornaam | Midden-naam | Achternaam | 
|---|---|---|
| James | John | smid | 
| John | James | Johnson | 
| Michael | Marcus | Williams | 
 Deze instructie retourneert de kolommen FName en LName met een bepaalde naam (een alias). Dit wordt bereikt met behulp van de AS operator gevolgd door de alias of door eenvoudig alias direct achter de kolomnaam te schrijven. Dit betekent dat de volgende zoekopdracht dezelfde uitkomst heeft als hierboven. 
SELECT 
    FName "First Name", 
    MName "Middle Name",
    LName "Last Name"
FROM Employees 
| Voornaam | Midden-naam | Achternaam | 
|---|---|---|
| James | John | smid | 
| John | James | Johnson | 
| Michael | Marcus | Williams | 
 De expliciete versie (dwz met de AS operator) is echter beter leesbaar. 
Als de alias een enkel woord heeft dat geen gereserveerd woord is, kunnen we het schrijven zonder enkele aanhalingstekens, dubbele aanhalingstekens of haakjes:
SELECT 
    FName AS FirstName, 
    LName AS LastName
FROM Employees  
| Voornaam | Achternaam | 
|---|---|
| James | smid | 
| John | Johnson | 
| Michael | Williams | 
 Een andere variatie die onder andere beschikbaar is in MS SQL Server is <alias> = <column-or-calculation> , bijvoorbeeld: 
SELECT FullName = FirstName + ' ' + LastName, 
       Addr1    = FullStreetAddress,
       Addr2    = TownName
FROM CustomerDetails  
wat overeenkomt met:
SELECT FirstName + ' ' + LastName As FullName
       FullStreetAddress          As Addr1,
       TownName                   As Addr2
FROM CustomerDetails  
Beide zullen resulteren in:
| Voor-en achternaam | Addr1 | Addr2 | 
|---|---|---|
| James Smith | 123 AnyStreet | Townville | 
| John Johnson | 668 MyRoad | Anytown | 
| Michael Williams | 999 High End Dr | Williamsburgh | 
 Sommigen vinden het gebruik van = plaats van As gemakkelijker te lezen, hoewel velen het aanbevelen tegen dit formaat, vooral omdat het niet standaard is, dus niet door alle databases wordt ondersteund. Het kan verwarring veroorzaken met ander gebruik van het = -teken. 
Alle versies van SQL
Als u gereserveerde woorden moet gebruiken, kunt u ook haakjes of aanhalingstekens gebruiken om te ontsnappen:
SELECT
    FName as "SELECT",
    MName as "FROM",
    LName as "WHERE"
FROM Employees
Verschillende versies van SQL
Op dezelfde manier kunt u zoekwoorden in MSSQL ontsnappen met alle verschillende benaderingen:
SELECT 
    FName AS "SELECT", 
    MName AS 'FROM',
    LName AS [WHERE]
FROM Employees  
| SELECT | VAN | WAAR | 
|---|---|---|
| James | John | smid | 
| John | James | Johnson | 
| Michael | Marcus | Williams | 
 Een kolomalias kan ook een van de laatste clausules van dezelfde zoekopdracht zijn, zoals een ORDER BY : 
SELECT 
    FName AS FirstName, 
    LName AS LastName
FROM 
    Employees 
ORDER BY 
    LastName DESC
U mag het echter niet gebruiken
SELECT
    FName AS SELECT,
    LName AS FROM
FROM 
    Employees
ORDER BY 
    LastName DESC
 Een alias maken van deze gereserveerde woorden ( SELECT en FROM ). 
Dit zal talloze fouten veroorzaken bij de uitvoering.
Selectie met gesorteerde resultaten
SELECT * FROM Employees ORDER BY LName
 Deze verklaring retourneert alle kolommen uit de tabel Employees . 
| ID kaart | FName | lname | Telefoonnummer | 
|---|---|---|---|
| 2 | John | Johnson | 2468101214 | 
| 1 | James | smid | 1234567890 | 
| 3 | Michael | Williams | 1357911131 | 
SELECT * FROM Employees ORDER BY LName DESC
Of
 SELECT * FROM Employees ORDER BY LName ASC
Deze verklaring wijzigt de sorteerrichting.
Men kan ook meerdere sorteerkolommen specificeren. Bijvoorbeeld:
SELECT * FROM Employees ORDER BY LName ASC, FName ASC
 In dit voorbeeld worden de resultaten eerst op LName en vervolgens op records met dezelfde LName gesorteerd op FName . Dit geeft u een resultaat vergelijkbaar met wat u zou vinden in een telefoonboek. 
 Om het opnieuw typen van de kolomnaam in de ORDER BY component op te slaan, is het mogelijk om in plaats daarvan het kolomnummer te gebruiken. Merk op dat kolomnummers beginnen vanaf 1. 
SELECT Id, FName, LName, PhoneNumber FROM Employees ORDER BY 3
 U kunt ook een CASE instructie opnemen in de clausule ORDER BY . 
SELECT Id, FName, LName, PhoneNumber FROM Employees ORDER BY CASE WHEN LName='Jones` THEN 0 ELSE 1 END ASC
 Hiermee worden uw resultaten gesorteerd om alle records te hebben met de LName of "Jones" bovenaan. 
Selecteer kolommen die zijn vernoemd naar gereserveerde zoekwoorden
Wanneer een kolomnaam overeenkomt met een gereserveerd trefwoord, vereist standaard SQL dat u dit tussen dubbele aanhalingstekens plaatst:
SELECT 
    "ORDER",
    ID 
FROM ORDERS
Merk op dat het de kolomnaam hoofdlettergevoelig maakt.
Sommige DBMS'en hebben eigen manieren om namen te citeren. SQL Server gebruikt bijvoorbeeld hiervoor vierkante haken:
SELECT 
    [Order],
    ID 
FROM ORDERS
terwijl MySQL (en MariaDB) standaard backticks gebruiken:
SELECT 
    `Order`,
    id 
FROM orders
Selecteren van een gespecificeerd aantal records
 De SQL 2008-standaard definieert de FETCH FIRST clausule om het aantal geretourneerde records te beperken. 
SELECT Id, ProductName, UnitPrice, Package 
FROM Product 
ORDER BY UnitPrice DESC
FETCH FIRST 10 ROWS ONLY
 Deze standaard wordt alleen ondersteund in recente versies van sommige RDMS's. Leverancierspecifieke niet-standaard syntaxis wordt geleverd in andere systemen. Vooruitgang OpenEdge 11.x ondersteunt ook de FETCH FIRST <n> ROWS ONLY syntaxis. 
 Bovendien staat OFFSET <m> ROWS vóór FETCH FIRST <n> ROWS ONLY toe om rijen over te slaan voordat rijen worden opgehaald. 
SELECT Id, ProductName, UnitPrice, Package 
FROM Product 
ORDER BY UnitPrice DESC
OFFSET 5 ROWS
FETCH FIRST 10 ROWS ONLY
De volgende query wordt ondersteund in SQL Server en MS Access:
SELECT TOP 10 Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC
 Om hetzelfde te doen in MySQL of PostgreSQL moet het trefwoord LIMIT worden gebruikt: 
SELECT Id, ProductName, UnitPrice, Package
FROM Product
ORDER BY UnitPrice DESC
LIMIT 10
 In Oracle kan hetzelfde worden gedaan met ROWNUM : 
SELECT Id, ProductName, UnitPrice, Package
FROM Product
WHERE ROWNUM <= 10
ORDER BY UnitPrice DESC    
Resultaten : 10 records.
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
Verkoper Nuances:
 Het is belangrijk op te merken dat de TOP in Microsoft SQL werkt na de WHERE clausule en het opgegeven aantal resultaten retourneert als ze ergens in de tabel voorkomen, terwijl ROWNUM werkt als onderdeel van de WHERE clausule, dus als er geen andere voorwaarden bestaan in de opgegeven aantal rijen aan het begin van de tabel, krijgt u nul resultaten wanneer er andere kunnen worden gevonden. 
Selecteren met tabelalias
SELECT e.Fname, e.LName 
FROM Employees e
De tabel Werknemers krijgt de alias 'e' direct achter de naam van de tabel. Dit helpt onduidelijkheid te verwijderen in scenario's waarbij meerdere tabellen dezelfde veldnaam hebben en u moet specifiek zijn uit welke tabel u gegevens wilt retourneren.
SELECT e.Fname, e.LName, m.Fname AS ManagerFirstName 
FROM Employees e 
    JOIN Managers m ON e.ManagerId = m.Id
Merk op dat als u eenmaal een alias definieert, u de canonieke tabelnaam niet meer kunt gebruiken. d.w.z,
SELECT e.Fname, Employees.LName, m.Fname AS ManagerFirstName 
FROM Employees e 
JOIN Managers m ON e.ManagerId = m.Id
zou een fout veroorzaken.
 Het is vermeldenswaard dat tabelaliassen - meer formeel 'bereikvariabelen' - in de SQL-taal werden geïntroduceerd om het probleem van dubbele kolommen veroorzaakt door INNER JOIN te lossen. De SQL-standaard van 1992 corrigeerde dit eerdere ontwerpfout door NATURAL JOIN introduceren (geïmplementeerd in mySQL, PostgreSQL en Oracle maar nog niet in SQL Server), waarvan het resultaat nooit dubbele kolomnamen heeft. Het bovenstaande voorbeeld is interessant omdat de tabellen zijn samengevoegd op kolommen met verschillende namen ( Id en ManagerId ) maar niet worden verondersteld te worden samengevoegd op de kolommen met dezelfde naam ( LName , FName ), waardoor de naam van de kolommen moet worden FName voor de deelname: 
SELECT Fname, LName, ManagerFirstName 
FROM Employees
     NATURAL JOIN
     ( SELECT Id AS ManagerId, Fname AS ManagerFirstName
       FROM Managers ) m;
Merk op dat, hoewel een alias / bereikvariabele moet worden gedeclareerd voor de gedervelde tabel (anders zal SQL een fout veroorzaken), het zinloos is om deze daadwerkelijk in de query te gebruiken.
Selecteer rijen uit meerdere tabellen
SELECT *
FROM
    table1,
    table2
SELECT
    table1.column1,
    table1.column2,
    table2.column1
FROM
    table1,
    table2
Dit wordt cross-product genoemd in SQL, het is hetzelfde als cross-product in sets
Deze instructies retourneren de geselecteerde kolommen uit meerdere tabellen in één query.
Er is geen specifiek verband tussen de kolommen die uit elke tabel worden geretourneerd.
Selecteren met geaggregeerde functies
Gemiddelde
De aggregatiefunctieAVG() retourneert het gemiddelde van de geselecteerde waarden. SELECT AVG(Salary) FROM Employees
SELECT AVG(Salary) FROM Employees where DepartmentId = 1
Als de werknemer is gecategoriseerd met meerdere afdelingen en we gemiddelde salaris voor elke afdeling willen vinden, kunnen we de volgende zoekopdracht gebruiken.
SELECT AVG(Salary) FROM Employees GROUP BY DepartmentId
Minimum
De aggregatiefunctieMIN() retourneert het minimum aantal geselecteerde waarden. SELECT MIN(Salary) FROM Employees
maximaal
De aggregatiefunctieMAX() retourneert het maximum van de geselecteerde waarden. SELECT MAX(Salary) FROM Employees
tellen
De aggregatiefunctieCOUNT() retourneert het aantal geselecteerde waarden. SELECT Count(*) FROM Employees
SELECT Count(*) FROM Employees where ManagerId IS NOT NULL
NULL waarden niet worden geteld. Select Count(ManagerId) from Employees
Select Count(DISTINCT DepartmentId) from Employees
Som
De aggregatiefunctieSUM() retourneert de som van de geselecteerde waarden voor alle rijen. SELECT SUM(Salary) FROM Employees
Selecteren met null
SELECT Name FROM Customers WHERE PhoneNumber IS NULL
 Selectie met nullen heeft een andere syntaxis. Gebruik niet = , gebruik in plaats daarvan IS NULL of IS NOT NULL . 
Selecteren met CASE
Wanneer op de resultaten logica moet worden toegepast 'on the fly' kan men CASE statement gebruiken om het te implementeren.
SELECT CASE WHEN Col1 < 50 THEN 'under' ELSE 'over' END threshold
FROM TableName 
kan ook worden geketend
SELECT 
    CASE WHEN Col1 < 50 THEN 'under' 
         WHEN Col1 > 50 AND Col1 <100 THEN 'between' 
         ELSE 'over' 
    END threshold
FROM TableName 
 men kan ook CASE in een andere CASE instructie hebben 
SELECT 
    CASE WHEN Col1 < 50 THEN 'under' 
         ELSE 
            CASE WHEN Col1 > 50 AND Col1 <100 THEN Col1 
            ELSE 'over' END 
    END threshold
FROM TableName 
Selecteren zonder de tabel te vergrendelen
Wanneer tabellen meestal (of alleen) voor lezen worden gebruikt, helpt indexering niet meer en telt elk klein beetje selecties zonder LOCK om de prestaties te verbeteren.
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;
 waar UR staat voor "niet-gecommitteerd lezen". 
Als het wordt gebruikt op een tabel met recordwijzigingen, kan dit onvoorspelbare resultaten opleveren.
Selecteer onderscheidend (alleen unieke waarden)
SELECT DISTINCT ContinentCode
FROM Countries;
 Deze query retourneert alle DISTINCT (unieke, verschillende) waarden uit de kolom ContinentCode uit de tabel Countries 
| ContinentCode | 
|---|
| OC | 
| EU | 
| NET ZO | 
| NA | 
| AF | 
Selecteer met voorwaarde van meerdere waarden uit de kolom
SELECT * FROM Cars  WHERE status IN ( 'Waiting', 'Working' )
Dit is semantisch gelijk aan
SELECT * FROM Cars  WHERE ( status = 'Waiting' OR status = 'Working' )
 dwz value IN ( <value list> ) is een afkorting voor disjunctie (logische OR ). 
Ontvang een geaggregeerd resultaat voor rijgroepen
Rijen tellen op basis van een specifieke kolomwaarde:
SELECT category, COUNT(*) AS item_count
FROM item
GROUP BY category;
Gemiddeld inkomen per afdeling krijgen:
SELECT department, AVG(income)
FROM employees
GROUP BY department;
 Het belangrijkste is om alleen kolommen te selecteren die zijn opgegeven in de clausule GROUP BY of worden gebruikt met aggregatiefuncties . 
 De WHERE clausule kan ook worden gebruikt met GROUP BY , maar WHERE filtert records voordat een groepering wordt uitgevoerd: 
SELECT department, AVG(income)
FROM employees
WHERE department <> 'ACCOUNTING'
GROUP BY department;
 Als u nodig hebt om de resultaten te filteren nadat de groepering is gedaan, bijvoorbeeld om alleen afdelingen waarvan het gemiddelde inkomen groter is dan 1000, moet u het gebruik zien HAVING clausule: 
SELECT department, AVG(income)
FROM employees
WHERE department <> 'ACCOUNTING'
GROUP BY department
HAVING avg(income) > 1000;
Selecteren met meer dan 1 voorwaarde.
 Het trefwoord AND wordt gebruikt om meer voorwaarden aan de zoekopdracht toe te voegen. 
| Naam | Leeftijd | Geslacht | 
|---|---|---|
| Sam | 18 | M | 
| John | 21 | M | 
| Bob | 22 | M | 
| Maria | 23 | F | 
SELECT name FROM persons WHERE gender = 'M' AND age > 20;
Dit zal terugkeren:
| Naam | 
|---|
| John | 
| Bob | 
 met behulp van OR sleutelwoord 
SELECT name FROM persons WHERE gender = 'M' OR age < 20;
Dit zal terugkeren:
| naam | 
|---|
| Sam | 
| John | 
| Bob | 
Deze zoekwoorden kunnen worden gecombineerd om meer complexe criteriacombinaties mogelijk te maken:
SELECT name
FROM persons
WHERE (gender = 'M' AND age < 20)
   OR (gender = 'F' AND age > 20);
Dit zal terugkeren:
| naam | 
|---|
| Sam | 
| Maria |