Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
SQL-adatbázis a Microsoft Fabricben
Ez a cikk példákat tartalmaz a SELECT utasítás használatára.
A cikkben szereplő kódminták a AdventureWorks2025 vagy AdventureWorksDW2025 mintaadatbázist használják, amelyet a Microsoft SQL Server-minták és közösségi projektek kezdőlapjáról tölthet le.
A. Sorok és oszlopok lekérése a SELECT használatával
Az alábbi példa három példakódot mutat be. Ez az első példakód az adatbázis táblájának *Product összes sorát (nincs megadva WHERE záradék) és az összes oszlopot (a AdventureWorks2025használatával) adja vissza.
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
Ez a példa az összes sort visszaadja (nincs megadva WHERE záradék), és csak az oszlopok egy részhalmazát (Name, ProductNumber, ListPrice) az ProductAdventureWorks2025 adatbázis táblájából. Emellett egy oszlopfejléc is hozzáadódik.
USE AdventureWorks2022;
GO
SELECT Name,
ProductNumber,
ListPrice AS Price
FROM Production.Product
ORDER BY Name ASC;
GO
Ez a példa csak azokat a sorokat Product adja vissza, amelyek terméksorával R rendelkeznek, és amelyek gyártási napjai kisebbek, mint 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. A SELECT használata oszlopfejlécekkel és számításokkal
Az alábbi példák a táblázat összes sorát visszaadják Product . Az első példa az összes értékesítést és az egyes termékekre vonatkozó kedvezményeket adja vissza. A második példában a teljes bevétel minden termékhez ki lesz számítva.
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
Ez a lekérdezés számítja ki az egyes termékek bevételét az egyes értékesítési rendelésekben.
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. A DISTINCT használata a SELECT használatával
Az alábbi példa a duplikált címek lekérésének megakadályozására használatos DISTINCT .
USE AdventureWorks2022;
GO
SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO
D. Táblák létrehozása a SELECT INTO használatával
Az alábbi első példa létrehoz egy ideiglenes táblát a következő helyen#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
Ez a második példa létrehozza az állandó táblát 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. Korrelált al lekérdezések használata
A korrelált részkérdezések olyan lekérdezések, amelyek az értékei külső lekérdezésétől függnek. Ez a lekérdezés többször is végrehajtható minden olyan sorhoz, amelyet a külső lekérdezés kijelölhet.
Az első példa olyan lekérdezéseket mutat be, amelyek szemantikailag egyenértékűek a kulcsszó és a EXISTSIN kulcsszó használata közötti különbség szemléltetéséhez. Mindkettő példa egy érvényes alqueryre, amely lekéri az egyes terméknevek egy példányát, amelynek a termékmodellje egy hosszú ujjú emblémás mez, és a ProductModelID számok egyeznek a táblák és Product a ProductModel táblák között.
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
A következő példa az egyes alkalmazottak utónevének és családi nevének egy példányát használja IN és kéri le, amelynek a bónusza a SalesPerson táblázatban szerepel 5000.00, és amelynek az alkalmazott-azonosító számai egyeznek a EmployeeSalesPerson táblákban.
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
A korábbi részkérdés ebben az utasításban önállóan nem értékelhető ki a külső lekérkezéstől függetlenül. Ehhez értékre Employee.EmployeeIDvan szükség, de ez az érték megváltozik, mivel az SQL Server adatbázismotor a különböző sorokat vizsgálja.Employee
A külső lekérdezés záradékában HAVING korrelált részquery is használható. Ez a példa megkeresi azokat a termékmodelleket, amelyek maximális listaára meghaladja a modell átlagának kétszeresét.
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
Ez a példa két korrelált al lekérdezést használ az adott terméket eladó alkalmazottak nevének megkereséséhez.
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. A GROUP BY használata
Az alábbi példa az adatbázisban található egyes értékesítési rendelések összegét találja meg.
USE AdventureWorks2022;
GO
SELECT SalesOrderID,
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
A záradék miatt minden GROUP BY értékesítési rendeléshez csak egy, az összes értékesítés összegét tartalmazó sort ad vissza a rendszer.
G. A GROUP BY használata több csoporttal
Az alábbi példa az átlagos árat és az évről évre érvényes értékesítések összegét találja, termékazonosító és különleges ajánlatazonosító szerint csoportosítva.
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. A GROUP BY és a WHERE használata
Az alábbi példa az eredményeket csoportokba helyezi, miután csak a listaáraknál $1000nagyobb listaárakat tartalmazó sorokat iktatja be.
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. A GROUP BY használata kifejezéssel
Az alábbi példa egy kifejezés szerint csoportosítja a csoportokat. Ha a kifejezés nem tartalmaz összesítő függvényeket, kifejezés szerint csoportosíthat.
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. A GROUP BY és az ORDER BY használata
Az alábbi példa megkeresi az egyes terméktípusok átlagos árát, és átlagár alapján rendeli meg az eredményeket.
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. A HAVING záradék használata
Az alábbi első példa egy HAVING aggregátumfüggvényt tartalmazó záradékot mutat be. A tábla sorait termékazonosító alapján csoportosítja, és kiküszöböli azokat a SalesOrderDetail termékeket, amelyek átlagos rendelési mennyisége öt vagy kevesebb. A második példa aggregátumfüggvények nélküli záradékot HAVING mutat be.
USE AdventureWorks2022;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
Ez a lekérdezés a LIKE záradék záradékát HAVING használja.
USE AdventureWorks2022;
GO
SELECT SalesOrderID, CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO
L. A HAVING és a GROUP BY használata
Az alábbi példa egy GROUP BY utasításban a , HAVING, WHEREés ORDER BY a záradékok használatát SELECTmutatja be. Csoportokat és összegző értékeket állít elő, de ezt a 25 usd feletti árakkal és az 5 alatti rendelési mennyiségekkel rendelkező termékek kiküszöbölése után teszi. Az eredményeket a következő szerint is rendszerezi 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. A HAVING használata a SZUM és az AVG használatával
Az alábbi példa a SalesOrderDetail táblázatot termékazonosító szerint csoportosítja, és csak azokat a termékcsoportokat foglalja magában, amelyek rendelései összesen nagyobbak $1000000.00 , és amelyek átlagos rendelési mennyisége kisebb, mint 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
A nagyobb teljes értékesítéssel $2000000.00rendelkező termékek megtekintéséhez használja ezt a lekérdezést:
USE AdventureWorks2022;
GO
SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO
Ha meg szeretne győződni arról, hogy az egyes termékek számításai legalább 1500 tételt érintenek, azzal HAVING COUNT(*) > 1500 kiküszöbölheti azokat a termékeket, amelyek az értékesítettnél 1500 kevesebb tétel összegét adják vissza. A lekérdezés a következőképpen néz ki:
USE AdventureWorks2022;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO
N. Az INDEX-optimalizáló tipp használata
Az alábbi példa két módszert mutat be az INDEX optimalizáló tipp használatára. Az első példa bemutatja, hogyan kényszerítheti az optimalizálót arra, hogy egy nemclustered index használatával kérje le a sorokat egy táblából. A második példa egy 0-s index használatával kényszeríti a táblázat vizsgálatát.
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. Az OPTION és a GROUP tippjeinek használata
Az alábbi példa bemutatja, hogyan használja a OPTION (GROUP) záradékot egy GROUP BY záradékkal.
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. Az UNION lekérdezési tipp használata
Az alábbi példa a MERGE UNION lekérdezési tippet használja.
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. Union használata
Az alábbi példában az eredményhalmaz tartalmazza mind a táblák, mind a ProductModelIDName táblák tartalmát és ProductModelGloves oszlopait.
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. A SELECT INTO használata az UNION használatával
A következő példában a INTO második SELECT utasítás záradéka azt határozza meg, hogy a névvel ellátott ProductResults tábla a kijelölt oszlopok és ProductModel táblák egyesítésének végső eredményhalmazát Gloves tartalmazza. A Gloves tábla az első SELECT utasításban jön létre.
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. Két SELECT utasítás egyesítő használata AZ ORDER BY használatával
Az UNION záradékban használt egyes paraméterek sorrendje fontos. Az alábbi példa két UNION utasítás helytelen és helyes használatát SELECT mutatja be, amelyekben egy oszlopot át kell nevezni a kimenetben.
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. A HÁROM SELECT utasítás egyesítésével megjelenítheti az ALL és a zárójelek hatását
Az alábbi példák három olyan tábla eredményeit kombinálják UNION , amelyek mindegyike ugyanazt az öt adatsort tartalmazza. Az első példa a duplikált rekordok megjelenítésére használja UNION ALL , és mind a 15 sort visszaadja. A második példa anélkül UNION használja ALL az ismétlődő sorokat a három SELECT utasítás összesített eredményeiből, hogy öt sort ad vissza.
A harmadik példa az elsővel együtt használjaALL, a zárójelek pedig a nem használt UNIONmásodikatUNION.ALL A második UNION feldolgozás elsőként azért történik, mert zárójelben van, és öt sort ad vissza, mert a ALL beállítás nem használható, és az ismétlődések el lesznek távolítva. Ezt az öt sort a kulcsszavak használatával SELECT kombináljuk az első UNION ALL eredményével. Ez a példa nem távolítja el az ismétlődéseket az öt sorból álló két csoport között. A végeredmény 10 sorból áll.
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
Kapcsolódó tartalom
- LÉTREHOZNI TRIGGERET (Transact-SQL)
- NÉZET LÉTREHOZÁSA (Transact-SQL)
- DELETE (Transact-SQL)
- EXECUTE (Transact-SQL)
- Kifejezések (Transact-SQL)
- BEHELYEZKEDÉS (Transact-SQL)
- MINT (Transact-SQL)
- Operátorok beállítása – UNION (Transact-SQL)
- Operátorok beállítása – KIVÉVE és INTERSECT (Transact-SQL)
- UPDATE (Transact-SQL)
- AHOL (Transact-SQL)
- PathName (Transact-SQL)
- SELECT – INTO záradék (Transact-SQL)