Aracılığıyla paylaş


SELECT (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft Fabric'teki SQL veritabanı

Veritabanından satırları alır ve SQL Server Veritabanı Altyapısı'ndaki bir veya birden çok tablodan bir veya birden çok satır veya sütunun seçilmesini sağlar. deyiminin SELECT tam söz dizimi karmaşıktır, ancak ana yan tümceleri aşağıdaki gibi özetlenebilir:

[ ILE { [ XMLNAMESPACES , ] [ common_table_expression ] } ]

SEÇ select_list [ INTO new_table ]

[ table_source'DEN ] [ NEREDE search_condition ]

[ GRUP group_by_expression ]

[ BIR search_condition ]

[ PENCERE window_expression ]

[ EMIR order_expression [ ASC | DESC ] ]

UNION, EXCEPT ve INTERSECT işleçleri sorguların sonuçlarını tek bir sonuç kümesinde birleştirmek veya karşılaştırmak için kullanılabilir.

Transact-SQL söz dizimi kuralları

Syntax

SQL Server ve Azure SQL Veritabanı söz dizimi:

<SELECT statement> ::=
    [ WITH { [ XMLNAMESPACES , ] [ <common_table_expression> [ , ...n ] ] } ]
    <query_expression>
    [ ORDER BY <order_by_expression> ]
    [ <FOR Clause> ]
    [ OPTION ( <query_hint> [ , ...n ] ) ]
<query_expression> ::=
    { <query_specification> | ( <query_expression> ) }
    [  { UNION [ ALL ] | EXCEPT | INTERSECT }
        <query_specification> | ( <query_expression> ) [ ...n ] ]
<query_specification> ::=
SELECT [ ALL | DISTINCT ]
    [ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ]
    <select_list>
    [ INTO new_table ]
    [ FROM { <table_source> } [ , ...n ] ]
    [ WHERE <search_condition> ]
    [ <GROUP BY> ]
    [ HAVING <search_condition> ]
[ ; ]

Azure Synapse Analytics ve Paralel Veri Ambarı ve Microsoft Fabric söz dizimi:

[ WITH <common_table_expression> [ , ...n ] ]
SELECT <select_criteria>
[ ; ]

<select_criteria> ::=
    [ TOP ( top_expression ) ]
    [ ALL | DISTINCT ]
    { * | column_name | expression } [ , ...n ]
    [ FROM { table_source } [ , ...n ] ]
    [ WHERE <search_condition> ]
    [ GROUP BY <group_by_clause> ]
    [ HAVING <search_condition> ]
    [ ORDER BY <order_by_expression> ]
    [ OPTION ( <query_option> [ , ...n ] ) ]

Remarks

Deyimin karmaşıklığı nedeniyle SELECT , yan tümce başına ayrıntılı söz dizimi öğeleri ve bağımsız değişkenleri gösterilir:

Deyimindeki yan tümcelerin SELECT sırası önemlidir. İsteğe bağlı yan tümcelerden herhangi biri atlanabilir, ancak isteğe bağlı yan tümceler kullanıldığında uygun sırada görünmelidir.

SELECT deyimlerine kullanıcı tanımlı işlevlerde izin verilir, ancak bu deyimlerin seçme listelerinde işlevlere yerel olan değişkenlere değer atayan ifadeler bulunur.

Sunucu adı bölümü olarak işleviyle OPENDATASOURCE birlikte dört bölümlü bir ad, tablo adının deyiminde SELECT görünebileceği her yerde tablo kaynağı olarak kullanılabilir. Azure SQL Veritabanı için dört parçalı bir ad belirtilemiyor.

Bazı söz dizimi kısıtlamaları, uzak tabloları içeren deyimler için SELECT geçerlidir.

SELECT deyiminin mantıksal işleme sırası

Aşağıdaki adımlarda bir SELECT deyim için mantıksal işleme sırası veya bağlama sırası gösterilir. Bu sıra, bir adımda tanımlanan nesnelerin sonraki adımlarda yan tümceler için ne zaman kullanılabilir hale getirileceğini belirler. Örneğin, sorgu işlemcisi yan tümcesinde FROM tanımlanan tablolara veya görünümlere bağlanabilirse (bunlara erişebiliyorsa), bu nesneler ve sütunları sonraki tüm adımlarda kullanılabilir hale gelir. Buna karşılık, yan tümcesi 8. adım olduğundan SELECT , bu yan tümcede tanımlanan tüm sütun diğer adlarına veya türetilmiş sütunlara yukarıdaki yan tümceler tarafından başvurulamaz. Ancak, yan tümcesi gibi ORDER BY sonraki yan tümceler tarafından bunlara başvurulabilir. Sorgu işlemcisi deyimin gerçek fiziksel yürütmesini belirler ve sıra bu listeden farklı olabilir.

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE veya WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. TOP

Warning

Önceki sıranın farklı olabileceği yaygın olmayan durumlar vardır. Görünümde kümelenmiş bir dizininiz olduğunu ve görünümün bazı tablo satırlarını dışladığını ve görünümün SELECT sütun listesinde CONVERTveri türünün varchar olanını int olarak değiştirdiğini varsayalım. Bu durumda, CONVERT yan tümcesi yürütülmeden WHERE önce yürütülebilir. Genellikle, sizin durumunuzda önemliyse, farklı bir diziden kaçınmak için görünümünüzü değiştirmenin bir yolu vardır.

Permissions

Verilerin seçilmesi için tablo veya görünüm üzerinde izin gerekirSELECT. Bu izin, şema üzerindeki izin veya SELECT tablo üzerindeki izin gibi CONTROL daha yüksek bir kapsamdan devralınabilir. Ya da db_datareader veya db_owner sabit veritabanı rollerine veya sysadmin sabit sunucu rolüne üyelik gerektirir. kullanarak SELECT INTO yeni tablo oluşturmak için hem izin hem CREATE TABLE de ALTER SCHEMA yeni tablonun sahibi olan şema üzerinde izin gerekir.

Examples

Aşağıdaki örneklerde AdventureWorksPDW2022 veritabanı kullanılmaktadır .

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

Bu bölümde üç kod örneği gösterilmektedir. Bu ilk kod örneği, tablodaki WHERE tüm satırları (yan tümce belirtilmemiş*) ve tüm sütunları (kullanarakDimEmployee) döndürür.

SELECT *
FROM DimEmployee
ORDER BY LastName;

Aynı sonucu elde etmek için tablo diğer adını kullanan bu sonraki örnek.

SELECT e.*
FROM DimEmployee AS e
ORDER BY LastName;

Bu örnekWHERE veritabanındaki tablodan tüm satırları (FirstNameyan tümce belirtilmemiş) ve sütunların (LastName, StartDate, DimEmployee) bir alt kümesini döndürür. Üçüncü sütun başlığı olarak FirstDayyeniden adlandırılır.

SELECT FirstName,
       LastName,
       StartDate AS FirstDay
FROM DimEmployee
ORDER BY LastName;

Bu örnek yalnızca ve (evli) olmayan satırları DimEmployeeEndDateNULLMaritalStatusM döndürür.

SELECT FirstName,
       LastName,
       StartDate AS FirstDay
FROM DimEmployee
WHERE EndDate IS NOT NULL
      AND MaritalStatus = 'M'
ORDER BY LastName;

B. SELECT'i sütun başlıkları ve hesaplamalarla kullanma

Aşağıdaki örnek, tablodaki DimEmployee tüm satırları döndürür ve her çalışan için brüt ödemeyi kendi çalışma haftasına ve 40 saatlik çalışma haftasına BaseRate göre hesaplar.

SELECT FirstName,
       LastName,
       BaseRate,
       BaseRate * 40 AS GrossPay
FROM DimEmployee
ORDER BY LastName;

C. SELECT ile DISTINCT kullanma

Aşağıdaki örnek, tablodaki DISTINCT tüm benzersiz başlıkların listesini oluşturmak için kullanırDimEmployee.

SELECT DISTINCT Title
FROM DimEmployee
ORDER BY Title;

D. GROUP BY kullanma

Aşağıdaki örnek, her gündeki tüm satışların toplam tutarını bulur.

SELECT OrderDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;

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

E. GROUP BY'i birden çok grupla kullanma

Aşağıdaki örnek, sipariş tarihine ve promosyon anahtarına göre gruplandırılmış olarak her günün ortalama fiyatını ve İnternet satışlarının toplamını bulur.

SELECT OrderDateKey,
       PromotionKey,
       AVG(SalesAmount) AS AvgSales,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, PromotionKey
ORDER BY OrderDateKey;

F. GROUP BY ve WHERE kullanma

Aşağıdaki örnek, yalnızca 1 Ağustos 2002'den sonraki sipariş tarihlerine sahip satırları aldıktan sonra sonuçları gruplara yerleştirir.

SELECT OrderDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
WHERE OrderDateKey > '20020801'
GROUP BY OrderDateKey
ORDER BY OrderDateKey;

G. 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.

SELECT SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY (OrderDateKey * 10);

H. ORDER BY ile GROUP BY kullanma

Aşağıdaki örnek, günlük satışların toplamını ve güne göre siparişleri bulur.

SELECT OrderDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;

I. HAVING yan tümcesini kullanma

Bu sorgu sonuçları kısıtlamak için yan tümcesini HAVING kullanır.

SELECT OrderDateKey,
       SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20010000
ORDER BY OrderDateKey;