Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Baza danych SQL w usłudze Microsoft Fabric
Ten artykuł zawiera przykłady użycia instrukcji SELECT .
Przykłady kodu w tym artykule korzystają z przykładowej bazy danych AdventureWorks2025 lub AdventureWorksDW2025, którą można pobrać ze strony głównej Przykładów programu Microsoft SQL Server i projektów społeczności.
A. Użyj polecenia SELECT, aby pobrać wiersze i kolumny
W poniższym przykładzie przedstawiono trzy przykłady kodu. Ten pierwszy przykład kodu zwraca wszystkie wiersze (nie określono klauzuli WHERE) i wszystkie kolumny (przy użyciu *) z Product tabeli w AdventureWorks2025 bazie danych.
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
Ten przykład zwraca wszystkie wiersze (nie określono klauzuli WHERE) i tylko podzbiór kolumn (Name, ProductNumber, ListPrice) z Product tabeli w AdventureWorks2025 bazie danych. Ponadto dodawany jest nagłówek kolumny.
USE AdventureWorks2022;
GO
SELECT Name,
ProductNumber,
ListPrice AS Price
FROM Production.Product
ORDER BY Name ASC;
GO
W tym przykładzie zwracane są tylko wiersze, dla Product których znajduje się linia R produktu i które mają dni na produkcję, która jest mniejsza niż 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. Używanie funkcji SELECT z nagłówkami i obliczeniami kolumn
Poniższe przykłady zwracają wszystkie wiersze z Product tabeli. Pierwszy przykład zwraca łączną sprzedaż i rabaty dla każdego produktu. W drugim przykładzie łączny przychód jest obliczany dla każdego produktu.
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
Jest to zapytanie, które oblicza przychód dla każdego produktu w każdym zamówieniu sprzedaży.
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. Używanie funkcji DISTINCT z funkcją SELECT
W poniższym przykładzie użyto DISTINCT metody , aby zapobiec pobieraniu zduplikowanych tytułów.
USE AdventureWorks2022;
GO
SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO
D. Tworzenie tabel z funkcją SELECT INTO
Poniższy pierwszy przykład tworzy tabelę tymczasową o nazwie #Bicycles w tempdbpliku .
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
W drugim przykładzie zostanie utworzona stała tabela 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. Używanie skorelowanych podzapytania
Skorelowana podzapytywanie to zapytanie, które zależy od zapytania zewnętrznego dla jego wartości. To zapytanie można wykonać wielokrotnie, po jednym razem dla każdego wiersza, które można wybrać przez zapytanie zewnętrzne.
W pierwszym przykładzie pokazano zapytania, które są semantycznie równoważne, aby zilustrować różnicę między użyciem słowa kluczowego EXISTSIN a słowem kluczowym. Oba są przykładami prawidłowego podzapytania, który pobiera jedno wystąpienie każdej nazwy produktu, dla której model produktu jest koszulką logo z długim rękawem, a ProductModelID liczby są zgodne między tabelami Product i 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
W następnym przykładzie użyto IN i pobrano jedno wystąpienie imienia i nazwiska i nazwy rodziny każdego pracownika, dla którego premia w SalesPerson tabeli to 5000.00, i dla którego numery identyfikacyjne pracowników są zgodne z tabelami Employee i 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
Poprzednie podzapytanie w tym zapytaniu nie może być oceniane niezależnie od zapytania zewnętrznego. Wymaga ona wartości parametru Employee.EmployeeID, ale ta wartość zmienia się, gdy aparat bazy danych programu SQL Server sprawdza różne wiersze w pliku Employee.
Skorelowane podzapytywanie może być również używane w HAVING klauzuli zapytania zewnętrznego. W tym przykładzie znaleziono modele produktów, dla których maksymalna cena katalogowa jest większa niż dwukrotnie średnią dla modelu.
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
W tym przykładzie użyto dwóch skorelowanych podzapytania w celu znalezienia nazw pracowników, którzy sprzedali określony 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. Używanie funkcji GROUP BY
Poniższy przykład znajduje sumę każdego zamówienia sprzedaży w bazie danych.
USE AdventureWorks2022;
GO
SELECT SalesOrderID,
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
Ze względu na klauzulę GROUP BY tylko jeden wiersz zawierający sumę wszystkich sprzedaży jest zwracany dla każdego zamówienia sprzedaży.
G. Używanie funkcji GROUP BY z wieloma grupami
Poniższy przykład znajduje średnią cenę i sumę sprzedaży od początku roku pogrupowane według identyfikatora produktu i identyfikatora oferty specjalnej.
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. Używanie funkcji GROUP BY i WHERE
Poniższy przykład umieszcza wyniki w grupach po pobraniu tylko wierszy z cenami listy większymi niż $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. Używanie funkcji GROUP BY z wyrażeniem
Poniższe przykładowe grupy według wyrażenia. Możesz grupować według wyrażenia, jeśli wyrażenie nie zawiera funkcji agregujących.
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. Używanie funkcji GROUP BY z usługą ORDER BY
Poniższy przykład znajduje średnią cenę każdego typu produktu i zamawia wyniki według średniej ceny.
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. Używanie klauzuli HAVING
Pierwszy przykład poniżej przedstawia klauzulę HAVING z funkcją agregacji. Grupuje wiersze w SalesOrderDetail tabeli według identyfikatora produktu i eliminuje produkty, których średnie ilości zamówień wynoszą pięć lub mniej. Drugi przykład przedstawia klauzulę HAVING bez funkcji agregujących.
USE AdventureWorks2022;
GO
SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO
To zapytanie używa klauzuli LIKE w klauzuli HAVING .
USE AdventureWorks2022;
GO
SELECT SalesOrderID, CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO
L. Używanie funkcji HAVING i GROUP BY
W poniższym przykładzie pokazano użycie GROUP BYklauzul , HAVING, WHEREi ORDER BY w jednej SELECT instrukcji. Tworzy grupy i wartości podsumowania, ale robi to po wyeliminowaniu produktów z cenami powyżej 25 USD i średnich ilości zamówień poniżej 5. Ponadto organizuje wyniki według .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. Używanie funkcji HAVING z SUM i AVG
Poniższy przykład grupuje tabelę SalesOrderDetail według identyfikatora produktu i zawiera tylko te grupy produktów, które mają zamówienia sumujące więcej niż i których średnie ilości zamówień są mniejsze niż $1000000.003 .
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
Aby wyświetlić produkty o łącznej sprzedaży większej niż $2000000.00, użyj tego zapytania:
USE AdventureWorks2022;
GO
SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO
Jeśli chcesz upewnić się, że w obliczeniach dla każdego produktu bierze udział co najmniej 1500 elementów, użyj polecenia HAVING COUNT(*) > 1500 , aby wyeliminować produkty, które zwracają sumy dla mniejszej liczby 1500 sprzedanych przedmiotów. Zapytanie wygląda następująco:
USE AdventureWorks2022;
GO
SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO
N. Korzystanie z wskazówek optymalizatora INDEKSu
W poniższym przykładzie przedstawiono dwa sposoby używania wskazówki optymalizatora INDEX . W pierwszym przykładzie pokazano, jak wymusić użycie indeksu nieklastrowanego do pobierania wierszy z tabeli za pomocą optymalizatora. Drugi przykład wymusza skanowanie tabeli przy użyciu indeksu 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. Użyj opcji i wskazówek DOTYCZĄCYCH GRUPY
W poniższym przykładzie pokazano, jak klauzula OPTION (GROUP) jest używana z klauzulą GROUP BY .
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. Korzystanie z wskazówek dotyczących zapytania UNION
W poniższym przykładzie użyto MERGE UNION wskazówki dotyczącej zapytania.
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. Korzystanie z unii
W poniższym przykładzie zestaw wyników zawiera zawartość ProductModelID kolumn i tabel Name i ProductModelGloves .
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. Używanie funkcji SELECT INTO z funkcją UNION
W poniższym przykładzie klauzula INTO w drugiej SELECT instrukcji określa, że tabela o nazwie ProductResults zawiera końcowy zestaw wyników unii wyznaczonych ProductModel kolumn i Gloves tabel. Tabela jest tworzona Gloves w pierwszej SELECT instrukcji.
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. Używanie instrukcji UNION dwóch instrukcji SELECT z instrukcjami ORDER BY
Kolejność niektórych parametrów używanych w klauzuli UNION jest ważna. W poniższym przykładzie pokazano niepoprawne i poprawne użycie UNION w dwóch SELECT instrukcjach, w których nazwa kolumny ma zostać zmieniona w danych wyjściowych.
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. Użyj instrukcji UNION z trzech instrukcji SELECT, aby pokazać efekty wszystkich i nawiasów
W poniższych przykładach użyto UNION metody , aby połączyć wyniki trzech tabel, które mają te same pięć wierszy danych. W pierwszym przykładzie użyto UNION ALL polecenia , aby wyświetlić zduplikowane rekordy i zwraca wszystkie 15 wierszy. W drugim przykładzie użyto UNION polecenia bez ALL , aby wyeliminować zduplikowane wiersze z połączonych wyników trzech SELECT instrukcji i zwraca pięć wierszy.
W trzecim przykładzie użyto ALL elementu z pierwszym UNION i nawiasami ujętą w drugą UNION , która nie używa elementu ALL. Drugi UNION jest przetwarzany jako pierwszy, ponieważ znajduje się w nawiasach i zwraca pięć wierszy, ponieważ ALL opcja nie jest używana, a duplikaty są usuwane. Te pięć wierszy jest połączonych z wynikami pierwszego SELECT przy użyciu UNION ALL słów kluczowych. W tym przykładzie nie są usuwane duplikaty między dwoma zestawami pięciu wierszy. Wynik końcowy zawiera 10 wierszy.
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
Treści powiązane
- UTWÓRZ TRIGGER (Transact-SQL)
- UTWÓRZ WIDOK (Transact-SQL)
- USUŃ (Transact-SQL)
- WYKONAJ (Transact-SQL)
- Wyrażenia (Transact-SQL)
- WSTAW (Transact-SQL)
- JAK (Transact-SQL)
- Operatory zestawu — UNION (Transact-SQL)
- Operatory zbiorów - EXCEPT i INTERSECT (Transact-SQL)
- AKTUALIZACJA (Transact-SQL)
- GDZIE (Transact-SQL)
- PathName (Transact-SQL)
- SELECT — INTO, klauzula (Transact-SQL)