Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
              Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric Preview
Dit artikel bevat voorbeelden van het gebruik van de SELECT-instructie .
De codevoorbeelden in dit artikel gebruiken de AdventureWorks2022 of AdventureWorksDW2022 voorbeelddatabase die u kunt downloaden van de startpagina van Microsoft SQL Server Samples en Community Projects .
A. SELECT gebruiken om rijen en kolommen op te halen
In het volgende voorbeeld ziet u drie codevoorbeelden. Dit eerste codevoorbeeld retourneert alle rijen (geen WHERE-component is opgegeven) en alle kolommen (met behulp van de *) uit de Product tabel in de AdventureWorks2022 database.
USE AdventureWorks2022;
GO
SELECT *
FROM Production.Product
ORDER BY Name ASC;
-- Alternate way.
USE AdventureWorks2022;
GO
SELECT p.*
FROM Production.Product AS p
ORDER BY Name ASC;
GO
In dit voorbeeld worden alle rijen geretourneerd (er is geen WHERE-component opgegeven) en alleen een subset van de kolommen (Name, ProductNumber, ListPrice) uit de Product tabel in de AdventureWorks2022 database. Daarnaast wordt er een kolomkop toegevoegd.
USE AdventureWorks2022;
GO
SELECT Name,
    ProductNumber,
    ListPrice AS Price
FROM Production.Product
ORDER BY Name ASC;
GO
In dit voorbeeld worden alleen de rijen geretourneerd Product waarvan een productlijn R is en die dagen hebben om te produceren die kleiner is dan 4.
USE AdventureWorks2022;
GO
SELECT Name,
    ProductNumber,
    ListPrice AS Price
FROM Production.Product
WHERE ProductLine = 'R'
    AND DaysToManufacture < 4
ORDER BY Name ASC;
GO
B. SELECT gebruiken met kolomkoppen en berekeningen
De volgende voorbeelden retourneren alle rijen uit de Product tabel. In het eerste voorbeeld worden de totale verkoop en de kortingen voor elk product geretourneerd. In het tweede voorbeeld wordt de totale omzet voor elk product berekend.
USE AdventureWorks2022;
GO
SELECT p.Name AS ProductName,
    NonDiscountSales = (OrderQty * UnitPrice),
    Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount)
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
    ON p.ProductID = sod.ProductID
ORDER BY ProductName DESC;
GO
Dit is de query waarmee de omzet voor elk product in elke verkooporder wordt berekend.
USE AdventureWorks2022;
GO
SELECT 'Total income is',
    ((OrderQty * UnitPrice) * (1.0 - UnitPriceDiscount)),
    ' for ',
    p.Name AS ProductName
FROM Production.Product AS p
INNER JOIN Sales.SalesOrderDetail AS sod
    ON p.ProductID = sod.ProductID
ORDER BY ProductName ASC;
GO
C. DISTINCT gebruiken met SELECT
In het volgende voorbeeld wordt het DISTINCT ophalen van dubbele titels voorkomen.
USE AdventureWorks2022;
GO
SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO
D. Tabellen maken met SELECT INTO
In het volgende eerste voorbeeld wordt een tijdelijke tabel gemaakt met de naam #Bicycles .tempdb
USE tempdb;
GO
IF OBJECT_ID(N'#Bicycles', N'U') IS NOT NULL
DROP TABLE #Bicycles;
GO
SELECT *
INTO #Bicycles
FROM AdventureWorks2022.Production.Product
WHERE ProductNumber LIKE 'BK%';
GO
In dit tweede voorbeeld wordt de permanente tabel gemaakt NewProducts.
USE AdventureWorks2022;
GO
IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL
DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks2022 SET RECOVERY BULK_LOGGED;
GO
SELECT *
INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25
    AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks2022 SET RECOVERY FULL;
GO
E. Gecorreleerde subquery's gebruiken
Een gecorreleerde subquery is een query die afhankelijk is van de buitenste query voor de waarden. Deze query kan herhaaldelijk worden uitgevoerd, één keer voor elke rij die door de buitenste query kan worden geselecteerd.
In het eerste voorbeeld ziet u query's die semantisch equivalent zijn om het verschil te illustreren tussen het gebruik van het EXISTS trefwoord en het IN trefwoord. Beide zijn voorbeelden van een geldige subquery die één exemplaar van elke productnaam ophaalt waarvoor het productmodel een logo jersey met lange mouwen is, en de ProductModelID cijfers komen overeen tussen de Product en ProductModel tabellen.
USE AdventureWorks2022;
GO
SELECT DISTINCT Name
FROM Production.Product AS p
WHERE EXISTS (
    SELECT *
    FROM Production.ProductModel AS pm
    WHERE p.ProductModelID = pm.ProductModelID
        AND pm.Name LIKE 'Long-Sleeve Logo Jersey%'
);
GO
-- OR
USE AdventureWorks2022;
GO
SELECT DISTINCT Name
FROM Production.Product
WHERE ProductModelID IN (
    SELECT ProductModelID
    FROM Production.ProductModel AS pm
    WHERE p.ProductModelID = pm.ProductModelID
        AND Name LIKE 'Long-Sleeve Logo Jersey%'
);
GO
In het volgende voorbeeld wordt één exemplaar van de voor- en familienaam van elke werknemer gebruikt IN en opgehaald waarvoor de bonus in de SalesPerson tabel is 5000.00en waarvoor de werknemersidentificatienummers in de Employee tabel overeenkomen.SalesPerson
USE AdventureWorks2022;
GO
SELECT DISTINCT p.LastName,
    p.FirstName
FROM Person.Person AS p
INNER JOIN HumanResources.Employee AS e
    ON e.BusinessEntityID = p.BusinessEntityID
WHERE 5000.00 IN (
    SELECT Bonus
    FROM Sales.SalesPerson AS sp
    WHERE e.BusinessEntityID = sp.BusinessEntityID
);
GO
De vorige subquery in deze instructie kan niet onafhankelijk van de buitenste query worden geëvalueerd. Hiervoor is een waarde Employee.EmployeeIDvereist, maar deze waarde verandert terwijl de SQL Server Database Engine verschillende rijen in Employeeonderzoekt.
Een gecorreleerde subquery kan ook worden gebruikt in de HAVING component van een buitenste query. In dit voorbeeld worden de productmodellen gevonden waarvoor de maximale catalogusprijs meer dan twee keer het gemiddelde voor het model is.
USE AdventureWorks2022;
GO
SELECT p1.ProductModelID
FROM Production.Product AS p1
GROUP BY p1.ProductModelID
HAVING MAX(p1.ListPrice) >= (
    SELECT AVG(p2.ListPrice) * 2
    FROM Production.Product AS p2
    WHERE p1.ProductModelID = p2.ProductModelID
);
GO
In dit voorbeeld worden twee gecorreleerde subquery's gebruikt om de namen te vinden van werknemers die een bepaald product hebben verkocht.
USE AdventureWorks2022;
GO
SELECT DISTINCT pp.LastName,
    pp.FirstName
FROM Person.Person pp
INNER JOIN HumanResources.Employee e
    ON e.BusinessEntityID = pp.BusinessEntityID
WHERE pp.BusinessEntityID IN (
    SELECT SalesPersonID
    FROM Sales.SalesOrderHeader
    WHERE SalesOrderID IN (
        SELECT SalesOrderID
        FROM Sales.SalesOrderDetail
        WHERE ProductID IN (
            SELECT ProductID
            FROM Production.Product p
            WHERE ProductNumber = 'BK-M68B-42'
        )
    )
);
GO
F. GROUP BY gebruiken
In het volgende voorbeeld wordt het totaal van elke verkooporder in de database gevonden.
USE AdventureWorks2022;
GO
SELECT SalesOrderID,
    SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
Vanwege de GROUP BY component wordt slechts één rij met de som van alle verkopen geretourneerd voor elke verkooporder.
G. GROUP BY gebruiken met meerdere groepen
In het volgende voorbeeld vindt u de gemiddelde prijs en de som van de omzet van het jaar tot heden, gegroepeerd op product-id en speciale aanbiedings-id.
USE AdventureWorks2022;
GO
SELECT ProductID,
    SpecialOfferID,
    AVG(UnitPrice) AS [Average Price],
    SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY ProductID,
    SpecialOfferID
ORDER BY ProductID;
GO
H. GROUP BY en WHERE gebruiken
In het volgende voorbeeld worden de resultaten in groepen geplaatst na het ophalen van alleen de rijen met lijstprijzen die groter zijn dan $1000.
USE AdventureWorks2022;
GO
SELECT ProductModelID,
    AVG(ListPrice) AS [Average List Price]
FROM Production.Product
WHERE ListPrice > $1000
GROUP BY ProductModelID
ORDER BY ProductModelID;
GO
I. GROUP BY gebruiken met een expressie
In het volgende voorbeeld wordt gegroepeerd op een expressie. U kunt groeperen op een expressie als de expressie geen statistische functies bevat.
USE AdventureWorks2022;
GO
SELECT AVG(OrderQty) AS [Average Quantity],
    NonDiscountSales = (OrderQty * UnitPrice)
FROM Sales.SalesOrderDetail
GROUP BY (OrderQty * UnitPrice)
ORDER BY (OrderQty * UnitPrice) DESC;
GO
J. GROUP BY gebruiken met ORDER BY
In het volgende voorbeeld wordt de gemiddelde prijs van elk type product gevonden en worden de resultaten gesorteerd op gemiddelde prijs.
USE AdventureWorks2022;
GO
SELECT ProductID,
    AVG(UnitPrice) AS [Average Price]
FROM Sales.SalesOrderDetail
WHERE OrderQty > 10
GROUP BY ProductID
ORDER BY AVG(UnitPrice);
GO
K. De HAVING-component gebruiken
In het eerste voorbeeld hieronder ziet u een HAVING component met een statistische functie. Hiermee worden de rijen in de SalesOrderDetail tabel gegroepeerd op product-id en worden producten verwijderd waarvan de gemiddelde orderhoeveelheid vijf of minder is. In het tweede voorbeeld ziet u een HAVING component zonder statistische functies.
USE AdventureWorks2022;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
Deze query maakt gebruik van de LIKE component in de HAVING component.
USE AdventureWorks2022;
GO
SELECT SalesOrderID, CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO
L. HAVING en GROUP BY gebruiken
In het volgende voorbeeld ziet u het gebruik van GROUP BY, HAVINGen WHEREORDER BY de componenten in één SELECT instructie. Het produceert groepen en samenvattingswaarden, maar doet dit na het elimineren van de producten met prijzen van meer dan $ 25 en de gemiddelde orderhoeveelheid onder 5. Het organiseert ook de resultaten op ProductID.
USE AdventureWorks2022;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
WHERE UnitPrice < 25.00
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
M. HAVING gebruiken met SOM en AVG
In het volgende voorbeeld wordt de SalesOrderDetail tabel gegroepeerd op product-id en worden alleen de groepen producten met orders gegroepeerd die meer dan $1000000.00 en waarvan de gemiddelde orderhoeveelheden kleiner zijn dan 3.
USE AdventureWorks2022;
GO
SELECT ProductID,
    AVG(OrderQty) AS AverageQuantity,
    SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $1000000.00
    AND AVG(OrderQty) < 3;
GO
Als u de producten met de totale verkoop groter dan $2000000.00wilt zien, gebruikt u deze query:
USE AdventureWorks2022;
GO
SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO
Als u er zeker van wilt zijn dat er ten minste 1500 items betrokken zijn bij de berekeningen voor elk product, gebruikt HAVING COUNT(*) > 1500 u dit om de producten te elimineren die totalen retourneren voor minder dan 1500 verkochte artikelen. De query ziet er als volgt uit:
USE AdventureWorks2022;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO
N. De hint voor indexoptimalisatie gebruiken
In het volgende voorbeeld ziet u twee manieren om de INDEX optimizer-hint te gebruiken. In het eerste voorbeeld ziet u hoe u de optimizer dwingt om een niet-geclusterde index te gebruiken om rijen op te halen uit een tabel. Het tweede voorbeeld dwingt een tabelscan af met behulp van een index van 0.
USE AdventureWorks2022;
GO
SELECT pp.FirstName,
    pp.LastName,
    e.NationalIDNumber
FROM HumanResources.Employee AS e WITH (INDEX (AK_Employee_NationalIDNumber))
INNER JOIN Person.Person AS pp
    ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
-- Force a table scan by using INDEX = 0.
USE AdventureWorks2022;
GO
SELECT pp.LastName,
    pp.FirstName,
    e.JobTitle
FROM HumanResources.Employee AS e WITH (INDEX = 0)
INNER JOIN Person.Person AS pp
    ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
M. OPTION en de GROEPShints gebruiken
In het volgende voorbeeld ziet u hoe de OPTION (GROUP) component wordt gebruikt met een GROUP BY component.
USE AdventureWorks2022;
GO
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO
O. De hint voor union-query's gebruiken
In het volgende voorbeeld wordt de MERGE UNION queryhint gebruikt.
USE AdventureWorks2022;
GO
SELECT BusinessEntityID,
    JobTitle,
    HireDate,
    VacationHours,
    SickLeaveHours
FROM HumanResources.Employee AS e1
UNION
SELECT BusinessEntityID,
    JobTitle,
    HireDate,
    VacationHours,
    SickLeaveHours
FROM HumanResources.Employee AS e2
OPTION (MERGE UNION);
GO
P. Een UNION gebruiken
In het volgende voorbeeld bevat de resultatenset de inhoud van de ProductModelID en Name kolommen van zowel de als Gloves de ProductModel tabellen.
USE AdventureWorks2022;
GO
IF OBJECT_ID('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
-- Here is the simple union.
USE AdventureWorks2022;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO
Q. SELECT INTO gebruiken met UNION
In het volgende voorbeeld geeft de INTO component in de tweede SELECT instructie aan dat de tabel met de naam ProductResults de uiteindelijke resultatenset bevat van de samenvoeging van de aangewezen kolommen van de ProductModel en Gloves tabellen. De Gloves tabel wordt gemaakt in de eerste SELECT instructie.
USE AdventureWorks2022;
GO
IF OBJECT_ID('dbo.ProductResults', 'U') IS NOT NULL
DROP TABLE dbo.ProductResults;
GO
IF OBJECT_ID('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
USE AdventureWorks2022;
GO
SELECT ProductModelID, Name
INTO dbo.ProductResults
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
SELECT ProductModelID, Name
FROM dbo.ProductResults;
R. UNION van twee SELECT-instructies gebruiken met ORDER BY
De volgorde van bepaalde parameters die worden gebruikt met de UNION-component is belangrijk. In het volgende voorbeeld ziet u het onjuiste en juiste gebruik van in twee SELECT instructies waarin de naam van UNION een kolom moet worden gewijzigd in de uitvoer.
USE AdventureWorks2022;
GO
IF OBJECT_ID('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
/* INCORRECT */
USE AdventureWorks2022;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
ORDER BY Name
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
/* CORRECT */
USE AdventureWorks2022;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO
S. GEBRUIK UNION van drie SELECT-instructies om de effecten van ALL en haakjes weer te geven
In de volgende voorbeelden worden UNION de resultaten van drie tabellen gecombineerd die allemaal dezelfde vijf rijen met gegevens hebben. In het eerste voorbeeld UNION ALL worden de gedupliceerde records weergegeven en worden alle 15 rijen geretourneerd. In het tweede voorbeeld UNIONALL worden de dubbele rijen uit de gecombineerde resultaten van de drie SELECT instructies verwijderd en worden vijf rijen geretourneerd.
In het derde voorbeeld wordt ALL gebruikgemaakt van de eerste UNION haakjes en plaatst u de tweede UNION die niet wordt gebruikt ALL. De tweede UNION wordt eerst verwerkt omdat deze haakjes bevat en vijf rijen retourneert omdat de ALL optie niet wordt gebruikt en de duplicaten worden verwijderd. Deze vijf rijen worden gecombineerd met de resultaten van de eerste SELECT met behulp van de UNION ALL trefwoorden. In dit voorbeeld worden de duplicaten tussen de twee sets van vijf rijen niet verwijderd. Het uiteindelijke resultaat heeft 10 rijen.
USE AdventureWorks2022;
GO
IF OBJECT_ID('dbo.EmployeeOne', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeOne;
GO
IF OBJECT_ID('dbo.EmployeeTwo', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeTwo;
GO
IF OBJECT_ID('dbo.EmployeeThree', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeThree;
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeOne
FROM Person.Person AS pp
INNER JOIN HumanResources.Employee AS e
    ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeTwo
FROM Person.Person AS pp
INNER JOIN HumanResources.Employee AS e
    ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeThree
FROM Person.Person AS pp
INNER JOIN HumanResources.Employee AS e
    ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
-- Union ALL
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeOne
UNION ALL
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo
UNION ALL
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree;
GO
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeOne
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree;
GO
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeOne
UNION ALL
(
    SELECT LastName, FirstName, JobTitle
    FROM dbo.EmployeeTwo
    UNION
    SELECT LastName, FirstName, JobTitle
    FROM dbo.EmployeeThree
);
GO
Related content
- CREATE TRIGGER (Transact-SQL)
- WEERGAVE MAKEN (Transact-SQL)
- DELETE (Transact-SQL)
- EXECUTE (Transact-SQL)
- Expressions (Transact-SQL)
- INSERT (Transact-SQL)
- LIKE (Transact-SQL)
- Operatoren instellen - UNION (Transact-SQL)
- Set-operatoren - EXCEPT en INTERSECT (Transact-SQL)
- UPDATE (Transact-SQL)
- WHERE (Transact-SQL)
- PathName (Transact-SQL)
- SELECT - INTO-component (Transact-SQL)