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 eendisplayname
met de naamdisplayname
wordt 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 BY
component 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
Geaggregeerde functies kunnen ook worden gecombineerd met de Where-clausule. SELECT AVG(Salary) FROM Employees where DepartmentId = 1
Geaggregeerde functies kunnen ook worden gecombineerd met group by-clausule. 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
Het kan ook worden gecombineerd met waar-condities om het aantal rijen te krijgen dat aan specifieke voorwaarden voldoet. SELECT Count(*) FROM Employees where ManagerId IS NOT NULL
Specifieke kolommen kunnen ook worden opgegeven om het aantal waarden in de kolom te krijgen. Merk op dat NULL
waarden niet worden geteld. Select Count(ManagerId) from Employees
Aantal kan ook worden gecombineerd met het afzonderlijke zoekwoord voor een bepaald aantal. 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 |