Aracılığıyla paylaş


SELECT örnekleri (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

Bu makalede SELECT deyimini kullanma örnekleri verilmektedir.

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.

A. Satırları ve sütunları almak için SELECT kullanma

Aşağıdaki örnekte üç kod örneği gösterilmektedir. Bu ilk kod örneği, veritabanındaki tablodan * tüm satırları (WHERE yan tümcesi belirtilmemiş) ve tüm sütunları (Productkullanarak) AdventureWorks2025 döndürür.

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

Bu örnek, veritabanındaki tablodan Name tüm satırları (WHERE yan tümcesi belirtilmemiş) ve sütunların (ProductNumber, ListPrice, Product) AdventureWorks2025 yalnızca bir alt kümesini döndürür. Ayrıca, bir sütun başlığı eklenir.

USE AdventureWorks2022;
GO

SELECT Name,
    ProductNumber,
    ListPrice AS Price
FROM Production.Product
ORDER BY Name ASC;
GO

Bu örnek yalnızca ürün satırına Product sahip olan ve üretecek günleri olan ve değerinden Rküçük olan satırları 4 döndürür.

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'i sütun başlıkları ve hesaplamalarla kullanma

Aşağıdaki örnekler tablodan Product tüm satırları döndürür. İlk örnek, her ürün için toplam satışları ve indirimleri döndürür. İkinci örnekte, her ürün için toplam gelir hesaplanır.

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

Bu sorgu, her satış siparişindeki her ürün için geliri hesaplayan sorgudur.

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. SELECT ile DISTINCT kullanma

Aşağıdaki örnek, yinelenen başlıkların alınmasını önlemek için kullanır DISTINCT .

USE AdventureWorks2022;
GO

SELECT DISTINCT JobTitle
FROM HumanResources.Employee
ORDER BY JobTitle;
GO

D. SELECT INTO ile tablo oluşturma

Aşağıdaki ilk örnek, içinde #Bicyclesadlı tempdb geçici bir tablo oluşturur.

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

Bu ikinci örnek kalıcı tablosunu NewProductsoluşturur.

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. Bağıntılı alt sorgular kullanma

Bağıntılı alt sorgu, değerleri için dış sorguya bağımlı olan bir sorgudur. Bu sorgu, dış sorgu tarafından seçilebilen her satır için bir kez olmak üzere art arda yürütülebilir.

İlk örnekte, anahtar sözcük ile anahtar sözcüğün kullanımı arasındaki farkı göstermek için eşanlamlı olarak eşdeğer olan EXISTS sorgular gösterilmektedir IN . Her ikisi de, ürün modelinin uzun kollu logo forması olduğu her ürün adının bir örneğini alan geçerli bir alt sorgu örneğidir ve sayılar ve ProductModelIDProduct tabloları arasında ProductModel eşleşmektedir.

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

Sonraki örnek, tablosundaki bonusun olduğu ve ve tablolarında INSalesPerson çalışan kimlik numaralarının eşleşmesi için her çalışanın ad ve aile adının bir örneğini 5000.00 kullanır Employee ve SalesPerson alır.

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

Bu deyimdeki önceki alt sorgu, dış sorgudan bağımsız olarak değerlendirilemez. için Employee.EmployeeIDbir değer gerektirir, ancak SQL Server Veritabanı Altyapısı içindeki Employeefarklı satırları incelediğinden bu değer değişir.

İlişkili alt sorgu, dış sorgunun HAVING yan tümcesinde de kullanılabilir. Bu örnek, en yüksek liste fiyatının model için ortalamanın iki katından fazla olduğu ürün modellerini bulur.

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

Bu örnek, belirli bir ürünü satan çalışanların adlarını bulmak için iki bağıntılı alt sorgu kullanır.

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 kullanma

Aşağıdaki örnek, veritabanındaki her satış siparişinin toplamını bulur.

USE AdventureWorks2022;
GO

SELECT SalesOrderID,
    SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID
ORDER BY SalesOrderID;
GO

Yan tümcesi GROUP BY nedeniyle, her satış siparişi için tüm satışların toplamını içeren yalnızca bir satır döndürülür.

G. GROUP BY'i birden çok grupla kullanma

Aşağıdaki örnek, ürün kimliğine ve özel teklif kimliğine göre gruplandırılmış olarak ortalama fiyatı ve yıl-bugüne kadarki satışların toplamını bulur.

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 ve WHERE kullanma

Aşağıdaki örnek, yalnızca liste fiyatları değerinden $1000büyük olan satırları aldıktan sonra sonuçları gruplara yerleştirir.

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'i bir ifadeyle kullanma

Aşağıdaki örnek bir ifadeye göre gruplandırma yapar. İfade toplama işlevleri içermiyorsa bir ifadeye göre gruplandırabilirsiniz.

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. ORDER BY ile GROUP BY kullanma

Aşağıdaki örnek, her ürün türünün ortalama fiyatını bulur ve sonuçları ortalama fiyata göre sıralar.

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. HAVING yan tümcesini kullanma

Aşağıdaki ilk örnekte toplama işlevine sahip bir yan tümce gösterilmektedir HAVING . Tablodaki satırları ürün kimliğine SalesOrderDetail göre gruplandırır ve ortalama sipariş miktarları beş veya daha az olan ürünleri ortadan kaldırır. İkinci örnekte toplama işlevleri olmayan bir HAVING yan tümce gösterilmektedir.

USE AdventureWorks2022;
GO

SELECT ProductID
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING AVG(OrderQty) > 5
ORDER BY ProductID;
GO

Bu sorgu yan tümcesinde yan tümcesini LIKE kullanırHAVING.

USE AdventureWorks2022;
GO
SELECT SalesOrderID, CarrierTrackingNumber
FROM Sales.SalesOrderDetail
GROUP BY SalesOrderID, CarrierTrackingNumber
HAVING CarrierTrackingNumber LIKE '4BD%'
ORDER BY SalesOrderID ;
GO

L. HAVING ve GROUP BY kullanma

Aşağıdaki örnekte, bir GROUP BY deyimde , HAVING, WHEREve ORDER BY yan tümcelerinin kullanılması SELECTgösterilmektedir. Gruplar ve özet değerler üretir, ancak 25 TL'nin üzerinde fiyatları olan ürünleri ve 5'in altındaki ortalama sipariş miktarlarını ortadan kaldırdıktan sonra bunu yapar. Ayrıca sonuçları ölçütüne göre ProductIDdüzenler.

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'i SUM ve AVG ile kullanma

Aşağıdaki örnek, tabloyu ürün kimliğine SalesOrderDetail göre gruplandırır ve yalnızca toplam siparişi daha $1000000.00 fazla olan ve ortalama sipariş miktarları değerinden 3küçük olan ürün gruplarını içerir.

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

Toplam satışları değerinden $2000000.00büyük olan ürünleri görmek için şu sorguyu kullanın:

USE AdventureWorks2022;
GO

SELECT ProductID, Total = SUM(LineTotal)
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING SUM(LineTotal) > $2000000.00;
GO

Her ürün için hesaplamalarda en az 1.500 öğe olduğundan emin olmak istiyorsanız, satılan ürünlerden HAVING COUNT(*) > 1500 daha az ürün için toplam döndüren ürünleri ortadan kaldırmak için kullanın1500. Sorgu şöyle görünür:

USE AdventureWorks2022;
GO

SELECT ProductID, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
GROUP BY ProductID
HAVING COUNT(*) > 1500;
GO

N. İnDİS iyileştirici ipucunu kullanma

Aşağıdaki örnekte iyileştirici ipucunu INDEX kullanmanın iki yolu gösterilmektedir. İlk örnekte, iyileştiricinin tablodaki satırları almak için kümelenmemiş bir dizin kullanmaya nasıl zorlandığı gösterilmektedir. İkinci örnek, 0 dizinini kullanarak tablo taramasını zorlar.

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 ve GROUP ipuçlarını kullanma

Aşağıdaki örnekte yan tümcesinin OPTION (GROUP) bir GROUP BY yan tümceyle nasıl kullanıldığı gösterilmektedir.

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. UNION sorgu ipucunu kullanma

Aşağıdaki örnek, MERGE UNION sorgu ipucunu kullanır.

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 kullanma

Aşağıdaki örnekte, sonuç kümesi hem hem de ProductModelIDName tablolarının ProductModel ve Gloves sütunlarının içeriğini içerir.

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. UNION ile SELECT INTO kullanma

Aşağıdaki örnekte, INTO ikinci SELECT deyimdeki yan tümcesi adlı ProductResults tablonun ve ProductModel tablolarının belirlenen sütunlarının Gloves birleşiminin son sonuç kümesini barındırdığını belirtir. Tablo Gloves ilk SELECT deyimde oluşturulur.

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. ORDER BY ile iki SELECT deyiminin UNION'ını kullanma

UNION yan tümcesiyle kullanılan belirli parametrelerin sırası önemlidir. Aşağıdaki örnekte, bir sütunun UNION çıktıda yeniden adlandırılacağı iki SELECT deyimde yanlış ve doğru kullanımı gösterilmektedir.

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. ALL ve parantezlerin etkilerini göstermek için üç SELECT deyiminin UNION'ını kullanın

Aşağıdaki örnekler, tümü aynı beş veri satırına sahip üç tablonun sonuçlarını birleştirmek için kullanılır UNION . İlk örnek, yinelenen kayıtları göstermek için kullanır UNION ALL ve 15 satırın tümünü döndürür. İkinci örnek, üç UNION deyimin birleşik sonuçlarından yinelenen satırları ortadan kaldırmak için without ALL kullanır SELECT ve beş satır döndürür.

Üçüncü örnek, ilk ALL ve parantezleri kullanmayan UNIONikinciyi UNION kapsayan ile kullanırALL. İkinci UNION işlem önce parantez içinde olduğundan işlenir ve seçenek kullanılmadığından ve yinelenenler kaldırıldığından ALL beş satır döndürür. Bu beş satır, anahtar sözcükler kullanılarak ilk SELECT satırın UNION ALL sonuçlarıyla birleştirilir. Bu örnek, beş satırdan oluşan iki küme arasındaki yinelemeleri kaldırmaz. Nihai sonucun 10 satırı vardır.

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