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:

  1. 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.
  2. 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> .
  3. 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
  4. 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 een displayname met de naam displayname 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 de ORDER 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 E-mail PreferredContact
3347927472 [email protected] TELEFOON
2137921892 [email protected] EMAIL
NUL [email protected] EMAIL

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 aggregatiefunctie AVG() 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 aggregatiefunctie MIN() retourneert het minimum aantal geselecteerde waarden.
SELECT MIN(Salary) FROM Employees

maximaal

De aggregatiefunctie MAX() retourneert het maximum van de geselecteerde waarden.
SELECT MAX(Salary) FROM Employees

tellen

De aggregatiefunctie COUNT() 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 aggregatiefunctie SUM() 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

SQLFiddle-demo

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow