Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
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. Pierwszy przykład kodu zwraca wszystkie wiersze (nie WHERE określono klauzuli) i wszystkie kolumny (przy użyciu *elementu ) z Product tabeli w AdventureWorks2025 bazie danych.
USE AdventureWorks2025;
GO
SELECT *
FROM Production.Product
ORDER BY Name ASC;
-- Alternate way.
USE AdventureWorks2025;
GO
SELECT p.*
FROM Production.Product AS p
ORDER BY Name ASC;
GO
Ten przykład zwraca wszystkie wiersze (nie WHERE określono klauzuli) i tylko podzbiór kolumn (Name, ProductNumber, ListPrice) z Product tabeli w AdventureWorks2025 bazie danych. Ponadto dodawany jest nagłówek kolumny.
USE AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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
To zapytanie oblicza przychód dla każdego produktu w każdym zamówieniu sprzedaży.
USE AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025.Production.Product
WHERE ProductNumber LIKE 'BK%';
GO
W drugim przykładzie zostanie utworzona stała tabela NewProducts.
USE AdventureWorks2025;
GO
IF OBJECT_ID('dbo.NewProducts', 'U') IS NOT NULL
DROP TABLE dbo.NewProducts;
GO
ALTER DATABASE AdventureWorks2025 SET RECOVERY BULK_LOGGED;
GO
SELECT *
INTO dbo.NewProducts
FROM Production.Product
WHERE ListPrice > $25
AND ListPrice < $100;
GO
ALTER DATABASE AdventureWorks2025 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 wybranego 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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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.
Możesz również użyć skorelowanego podzapytania 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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
GO
SELECT SalesOrderID,
SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO
Ze względu na GROUP BY klauzulę zapytanie zwraca tylko jeden wiersz zawierający sumę wszystkich sprzedaży 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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
GO
SELECT SalesOrderID,
CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
GO
SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO
Jeśli chcesz upewnić się, że obliczenia dla każdego produktu obejmują co najmniej 1500 elementów, użyj polecenia HAVING COUNT(*) > 1500 , aby wyeliminować produkty, które zwracają sumy dla mniej niż 1500 sprzedanych przedmiotów. Zapytanie wygląda następująco:
USE AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 z klauzulą UNION jest ważna. W poniższym przykładzie pokazano niepoprawne i poprawne użycie UNION w dwóch SELECT instrukcjach, w których zmieniasz nazwę kolumny w danych wyjściowych.
USE AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 AdventureWorks2025;
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 — KLAUZULA INTO (Transact-SQL)