Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Förhandsversion av Microsoft Fabric
Den här artikeln innehåller exempel på hur du använder SELECT-instruktionen .
Kodexemplen i den här artikeln använder AdventureWorks2022- eller AdventureWorksDW2022-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.
A. Använd SELECT för att hämta rader och kolumner
I följande exempel visas tre kodexempel. Det första kodexemplet returnerar alla rader (ingen WHERE-sats har angetts) och alla kolumner (med hjälp av *) från Product tabellen i AdventureWorks2022 databasen.
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
Det här exemplet returnerar alla rader (ingen WHERE-sats har angetts) och endast en delmängd av kolumnerna (Name, ProductNumber, ListPrice) från Product tabellen i AdventureWorks2022 databasen. Dessutom läggs en kolumnrubrik till.
USE AdventureWorks2022;
GO
SELECT Name,
ProductNumber,
ListPrice AS Price
FROM Production.Product
ORDER BY Name ASC;
GO
Det här exemplet returnerar endast raderna för Product som har en produktrad med R och som har dagar att tillverka som är mindre än 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. Använda SELECT med kolumnrubriker och beräkningar
Följande exempel returnerar alla rader från Product tabellen. Det första exemplet returnerar total försäljning och rabatter för varje produkt. I det andra exemplet beräknas de totala intäkterna för varje produkt.
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
Det här är frågan som beräknar intäkterna för varje produkt i varje försäljningsorder.
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. Använda DISTINCT med SELECT
I följande exempel används DISTINCT för att förhindra hämtning av dubbletttitlar.
USE AdventureWorks2022;
GO
SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO
D. Skapa tabeller med SELECT INTO
I följande första exempel skapas en tillfällig tabell med namnet #Bicycles i 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
Det andra exemplet skapar den permanenta tabellen 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. Använda korrelerade underfrågor
En korrelerad underfråga är en fråga som är beroende av den yttre frågan för dess värden. Den här frågan kan köras upprepade gånger, en gång för varje rad som kan väljas av den yttre frågan.
Det första exemplet visar frågor som är semantiskt likvärdiga för att illustrera skillnaden mellan att använda nyckelordet EXISTS och nyckelordet IN . Båda är exempel på en giltig underfråga som hämtar en instans av varje produktnamn som produktmodellen är en långärmad logotyptröja för och ProductModelID siffrorna matchar mellan tabellerna Product och ProductModel .
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
I nästa exempel används IN och hämtas en instans av förnamnet och familjenamnet för varje anställd som bonusen SalesPerson i tabellen är 5000.00, och för vilken de anställdas ID-nummer matchar i tabellerna Employee och 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
Den tidigare underfrågan i det här satsen kan inte utvärderas oberoende av den yttre frågan. Det kräver ett värde för Employee.EmployeeID, men det här värdet ändras när SQL Server Database Engine undersöker olika rader i Employee.
En korrelerad underfråga kan också användas i satsen för HAVING en yttre fråga. Det här exemplet hittar de produktmodeller som det maximala listpriset är mer än dubbelt så högt som genomsnittet för modellen.
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
I det här exemplet används två korrelerade underfrågor för att hitta namnen på anställda som sålde en viss produkt.
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. Använda GROUP BY
I följande exempel hittar du summan av varje försäljningsorder i databasen.
USE AdventureWorks2022;
GO
SELECT SalesOrderID,
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
På grund av GROUP BY -satsen returneras endast en rad som innehåller summan av all försäljning för varje försäljningsorder.
G. Använda GROUP BY med flera grupper
I följande exempel hittar du genomsnittspriset och summan av hittills föregående års försäljning, grupperade efter produkt-ID och specialerbjudande-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. Använda GROUP BY och WHERE
I följande exempel placeras resultatet i grupper efter att endast raderna med listpriser är större än $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. Använda GROUP BY med ett uttryck
I följande exempel grupperas efter ett uttryck. Du kan gruppera efter ett uttryck om uttrycket inte innehåller aggregeringsfunktioner.
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. Använda GROUP BY med ORDER BY
I följande exempel hittar du genomsnittspriset för varje typ av produkt och beställer resultatet efter genomsnittligt pris.
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. Använda HAVING-satsen
Det första exemplet som följer visar en HAVING sats med en aggregeringsfunktion. Den grupperar raderna i tabellen efter SalesOrderDetail produkt-ID och eliminerar produkter vars genomsnittliga orderkvantitet är fem eller mindre. Det andra exemplet visar en HAVING sats utan aggregerade funktioner.
USE AdventureWorks2022;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
Den här frågan använder LIKE -satsen i HAVING -satsen.
USE AdventureWorks2022;
GO
SELECT SalesOrderID, CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO
L. Använda HAVING och GROUP BY
I följande exempel visas hur du använder GROUP BY, HAVING, WHEREoch ORDER BY -satser i en SELECT -instruktion. Det producerar grupper och sammanfattningsvärden men gör det efter att ha eliminerat produkterna med priser över $ 25 och genomsnittliga orderkvantiteter under 5. Den organiserar också resultatet efter 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. Använda HAVING med SUM och AVG
I följande exempel grupperas SalesOrderDetail tabellen efter produkt-ID och innehåller endast de grupper av produkter som har beställningar som är större än $1000000.00 och vars genomsnittliga orderkvantitet är mindre än 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
Om du vill se produkter med en total försäljning som är större än $2000000.00använder du den här frågan:
USE AdventureWorks2022;
GO
SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO
Om du vill se till att det finns minst 1 500 artiklar som ingår i beräkningarna för varje produkt kan du använda HAVING COUNT(*) > 1500 för att eliminera de produkter som returnerar summor för färre än 1500 sålda artiklar. Frågan ser ut så här:
USE AdventureWorks2022;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO
N. Använd tipset indexoptimerare
I följande exempel visas två sätt att använda tipset för INDEX optimeraren. Det första exemplet visar hur du tvingar optimeraren att använda ett icke-grupperat index för att hämta rader från en tabell. Det andra exemplet tvingar fram en tabellgenomsökning med hjälp av ett index på 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. Använd ALTERNATIV och GRUPPtipsen
I följande exempel visas hur OPTION (GROUP) satsen används med en GROUP BY -sats.
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. Använd UNIONS-frågetipset
I följande exempel används MERGE UNION frågetips.
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. Använda en UNION
I följande exempel innehåller resultatuppsättningen innehållet i kolumnerna ProductModelID och Name i både tabellerna ProductModel och Gloves .
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. Använda SELECT INTO med UNION
I följande exempel INTO anger satsen i den andra SELECT instruktionen att tabellen med namnet ProductResults innehåller den slutliga resultatuppsättningen för unionen av de avsedda kolumnerna i tabellerna ProductModel och Gloves . Tabellen Gloves skapas i den första SELECT instruktionen.
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. Använda UNION för två SELECT-instruktioner med ORDER BY
Ordningen på vissa parametrar som används med UNION-satsen är viktig. I följande exempel visas felaktig och korrekt användning av UNION i två SELECT instruktioner där en kolumn ska byta namn i utdata.
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. Använd UNION med tre SELECT-instruktioner för att visa effekterna av ALLA och parenteser
I följande exempel används UNION för att kombinera resultatet från tre tabeller som alla har samma fem rader med data. Det första exemplet används UNION ALL för att visa de duplicerade posterna och returnerar alla 15 rader. Det andra exemplet använder UNION utan ALL för att eliminera de duplicerade raderna från de kombinerade resultaten av de tre SELECT uttrycken och returnerar fem rader.
Det tredje exemplet använder ALL med den första UNION och parenteser omger den andra UNION som inte använder ALL. Den andra UNION bearbetas först eftersom den är inom parenteser och returnerar fem rader eftersom ALL alternativet inte används och dubbletter tas bort. Dessa fem rader kombineras med resultatet från den första SELECT med hjälp av nyckelorden UNION ALL . Det här exemplet tar inte bort dubbletter mellan de två uppsättningarna med fem rader. Slutresultatet har 10 rader.
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
- SKAPA UTLÖSARE (Transact-SQL)
- SKAPA VY (Transact-SQL)
- DELETE (Transact-SQL)
- EXECUTE (Transact-SQL)
- Expressions (Transact-SQL)
- INSERT (Transact-SQL)
- LIKE (Transact-SQL)
- Mängdoperatorer – UNION (Transact-SQL)
- Ange operatorer – EXCEPT och INTERSECT (Transact-SQL)
- UPDATE (Transact-SQL)
- WHERE (Transact-SQL)
- PathName (Transact-SQL)
- SELECT – INTO-sats (Transact-SQL)