Memeriksa pernyataan SELECT

Selesai

Transact-SQL atau T-SQL adalah dialek bahasa SQL standar ANSI yang digunakan oleh produk dan layanan Microsoft SQL. Ini mirip dengan standar SQL. Sebagian besar fokus kami adalah pada pernyataan SELECT, yang sejauh ini memiliki opsi dan variasi terbanyak dari setiap pernyataan DML mana pun.

Mari kita mulai dengan melihat tingkat tinggi bagaimana pernyataan SELECT diproses. Urutan penulisan pernyataan SELECT bukanlah urutan evaluasi dan pemrosesannya oleh mesin database SQL Server.

Pertimbangkan kueri berikut:

SELECT OrderDate, COUNT(OrderID) AS Orders
FROM Sales.SalesOrder
WHERE Status = 'Shipped'
GROUP BY OrderDate
HAVING COUNT(OrderID) > 1
ORDER BY OrderDate DESC;

Kueri terdiri dari pernyataan SELECT, yang terdiri dari beberapa klausul, yang masing-masing menentukan operasi tertentu yang harus diterapkan ke data yang diambil. Sebelum kita memeriksa urutan run-time operasi, mari kita lihat secara singkat apa yang dilakukan kueri ini, meskipun detail dari berbagai klausa tidak akan dibahas dalam modul ini.

Klausa SELECT mengembalikan kolom OrderDate, dan hitungan nilai OrderID, yang menetapkan nama (atau alias) Pesanan:

SELECT OrderDate, COUNT(OrderID) AS Orders

Klausa FROM mengidentifikasi tabel mana yang merupakan sumber baris untuk kueri; dalam hal ini adalah tabel Sales.SalesOrder:

FROM Sales.SalesOrder

Klausa WHERE memfilter baris dari hasil, hanya menyimpan baris yang memenuhi kondisi yang ditentukan; dalam hal ini, pesanan yang berstatus "dikirim":

WHERE Status = 'Shipped'

Klausa GROUP BY mengambil baris yang memenuhi kondisi filter dan mengelompokkannya menurut OrderDate, sehingga semua baris dengan OrderDate yang sama dianggap sebagai satu grup dan satu baris akan dikembalikan untuk setiap kelompok:

GROUP BY OrderDate

Setelah grup terbentuk, klausa HAVING memfilter grup berdasarkan predikatnya sendiri. Hanya tanggal dengan lebih dari satu pesanan yang akan disertakan dalam hasil:

HAVING COUNT(OrderID) > 1

Untuk tujuan pratinjau kueri ini, klausa terakhir adalah ORDER BY, yang mengurutkan output ke dalam urutan menurun dari OrderDate:

ORDER BY OrderDate DESC;

Sekarang, setelah Anda melihat apa yang dilakukan setiap klausa, mari kita lihat urutan di mana SQL Server benar-benar mengevaluasinya:

  1. Klausa FROM dievaluasi terlebih dahulu, untuk menyediakan baris sumber untuk sisa pernyataan. Tabel virtual dibuat dan diteruskan ke langkah berikutnya.
  2. Klausa WHERE selanjutnya dievaluasi, memfilter baris tersebut dari tabel sumber yang cocok dengan predikat. Tabel virtual yang difilter diteruskan ke langkah berikutnya.
  3. GROUP BY berikutnya, mengatur baris dalam tabel virtual sesuai dengan nilai unik yang ditemukan dalam daftar GROUP BY. Tabel virtual baru dibuat, berisi daftar grup, dan diteruskan ke langkah berikutnya. Dari titik ini dalam alur operasi, hanya kolom dalam daftar GROUP BY atau fungsi agregat yang dapat dirujuk oleh elemen lain.
  4. Klausa HAVING dievaluasi berikutnya, menyaring seluruh grup berdasarkan predikatnya. Tabel virtual yang dibuat pada langkah 3 difilter dan diteruskan ke langkah berikutnya.
  5. Klausa SELECT akhirnya dijalankan, menentukan kolom mana yang akan muncul dalam hasil kueri. Karena klausul SELECT dievaluasi setelah langkah-langkah lainnya, alias kolom apa pun (dalam contoh kami, Pesanan) yang dibuat di sana tidak dapat digunakan dalam klausa GROUP BY atau HAVING.
  6. Klausa ORDER BY adalah yang terakhir dieksekusi, mengurutkan baris seperti yang ditentukan oleh daftar kolomnya.

Untuk menerapkan pemahaman ini ke kueri contoh kami, berikut adalah urutan logis saat menjalankan pernyataan SELECT di atas:

FROM Sales.SalesOrder
WHERE Status = 'Shipped'
GROUP BY OrderDate 
HAVING COUNT(OrderID) > 1
SELECT OrderDate, COUNT(OrderID) AS Orders
ORDER BY OrderDate DESC;

Tidak semua klausul yang mungkin diperlukan dalam setiap pernyataan SELECT yang Anda tulis. Satu-satunya klausa yang diperlukan adalah klausul SELECT, yang dapat digunakan sendiri dalam beberapa kasus. Biasanya klausa FROM juga disertakan untuk mengidentifikasi tabel yang sedang dikueri. Selain itu, T-SQL memiliki klausul lain yang dapat ditambahkan.

Seperti yang Telah Anda lihat, Anda tidak menulis T-SQL dalam urutan yang sama di mana mereka dievaluasi secara logis. Urutan evaluasi run-time menentukan data apa yang tersedia untuk klausul yang mana, karena klausul hanya memiliki akses ke informasi yang sudah tersedia dari klausul yang sudah diproses. Untuk alasan ini, penting untuk memahami urutan pemrosesan logis yang sebenarnya saat menulis kueri.

Memilih semua kolom

Klausul SELECT sering disebut sebagai daftarSELECT, karena mencantumkan nilai yang akan dikembalikan dalam hasil kueri.

Bentuk paling sederhana dari klausa SELECT adalah penggunaan karakter asterisk (*) untuk mengembalikan semua kolom. Ketika digunakan dalam kueri T-SQL, klausul terebut disebut bintang. Meskipun SELECT * cocok untuk pengujian cepat, Anda harus menghindari menggunakannya dalam pekerjaan produksi karena alasan berikut:

  • Perubahan pada tabel yang menambahkan atau menyusun ulang kolom akan tercermin dalam hasil kueri, yang dapat mengakibatkan output yang tidak terduga untuk aplikasi atau laporan yang menggunakan kueri.
  • Mengembalikan data yang tidak diperlukan dapat memperlambat kueri Anda dan menyebabkan masalah performa jika tabel sumber berisi sejumlah besar baris.

Misalnya, contoh berikut ini mengambil semua kolom dari tabel Production.Product (hipotetis).

SELECT * FROM Production.Product;

Hasil dari kueri ini adalah rowset yang berisi semua kolom untuk semua baris tabel, yang mungkin terlihat seperti ini:

ProductID

Nama

ProductNum

Warna

StandardCost

ListPrice

Ukuran

Beban

ProductCatID

680

HL Road Frame - Black, 58

FR-R92B-58

Hitam

1059.31

1431.5

58

1016.04

18

706

HL Road Frame - Red, 58

FR-R92R-58

Merah

1059.31

1431.5

58

1016.04

18

707

Sport-100 Helmet, Red

HL-U509-R

Merah

13.0863

34.99

35

708

Sport-100 Helmet, Black

HL-U509

Hitam

13.0863

34.99

35

...

...

...

...

...

...

...

...

...

Memilih kolom tertentu

Daftar kolom eksplisit memungkinkan Anda memiliki kontrol atas kolom mana yang dikembalikan dan dalam urutan yang mana. Setiap kolom dalam hasil akan memiliki nama kolom sebagai header.

Misalnya, pertimbangkan kueri berikut ini; yang lagi-lagi menggunakan tabel Produksi.Product hipotetis.

SELECT ProductID, Name, ListPrice, StandardCost
‎FROM Production.Product;

Kali ini, hasilnya hanya mencakup kolom yang ditentukan:

ProductID

Nama

ListPrice

StandardCost

680

HL Road Frame - Black, 58

1431.5

1059.31

706

HL Road Frame - Red, 58

1431.5

1059.31

707

Sport-100 Helmet, Red

34.99

13.0863

708

Sport-100 Helmet, Black

34.99

13.0863

...

...

...

...

Memilih ekspresi

Selain mengambil kolom yang disimpan dalam tabel yang ditentukan, klausa SELECT dapat melakukan penghitungan dan manipulasi dengan cara menggunakan operator untuk menggabungkan kolom dan nilai atau beberapa kolom. Hasil perhitungan atau manipulasi harus merupakan hasil (skalar) bernilai tunggal yang akan muncul dalam hasil sebagai kolom terpisah.

Misalnya, kueri berikut ini menyertakan dua ekspresi:

SELECT ProductID,
      Name + '(' + ProductNumber + ')',
  ListPrice - StandardCost
FROM Production.Product;

Hasil dari kueri ini mungkin terlihat seperti ini:

ProductID

680

HL Road Frame - Black, 58(FR-R92B-58)

372.19

706

HL Road Frame - Red, 58(FR-R92R-58)

372.19

707

Sport-100 Helmet, Red(HL-U509-R)

21.9037

708

Sport-100 Helmet, Black(HL-U509)

21.9037

...

...

...

Ada beberapa hal menarik yang perlu diperhatikan dalam hasil ini:

  • Kolom yang dikembalikan oleh dua ekspresi tidak memiliki nama kolom. Bergantung pada alat yang Anda gunakan untuk mengirimkan kueri Anda, nama kolom yang hilang mungkin ditunjukkan oleh header kolom kosong, indikator literal"tanpa nama kolom", atau nama default seperti kolom1. Kita akan melihat cara menentukan alias untuk nama kolom dalam kueri berikutnya di bagian ini.
  • Ekspresi pertama menggunakan + operator untuk menggabungkan nilai string (berbasis karakter), sedangkan ekspresi kedua menggunakan - operator untuk mengurangi satu nilai numerik dari yang lain. Saat digunakan dengan nilai numerik, + operator melakukan penambahan. Dengan jelas, penting untuk memahami tipe data kolom yang Anda sertakan dalam ekspresi. Kita akan membahas tipe data di bagian berikutnya.

Menentukan alias kolom

Anda dapat menentukan alias untuk setiap kolom yang dikembalikan oleh kueri SELECT, baik sebagai alternatif untuk nama kolom sumber atau untuk menetapkan nama ke output ekspresi.

Misalnya, berikut ini kueri yang sama seperti sebelumnya, tetapi dengan alias yang ditentukan untuk setiap kolom:

SELECT ProductID AS ID,
      Name + '(' + ProductNumber + ')' AS ProductName,
  ListPrice - StandardCost AS Markup
FROM Production.Product;

Hasil dari kueri ini mencakup nama kolom yang ditentukan:

ID

ProductName

Markup

680

HL Road Frame - Black, 58(FR-R92B-58)

372.19

706

HL Road Frame - Red, 58(FR-R92R-58)

372.19

707

Sport-100 Helmet, Red(HL-U509-R)

21.9037

708

Sport-100 Helmet, Black(HL-U509)

21.9037

...

...

...

Catatan

Kata kunci AS bersifat opsional saat menentukan alias, tetapi praktik yang baik adalah menyertakannya untuk klarifikasi.

Memformat kueri

Anda mungkin mencatat dari contoh di bagian ini, bahwa Anda dapat fleksibel tentang cara memformat kode kueri Anda. Misalnya, Anda dapat menulis setiap klausa (atau seluruh kueri) pada satu baris, atau memecahnya menjadi beberapa baris. Di sebagian besar sistem database, kode ini tidak sensitif terhadap huruf besar/kecil, dan beberapa elemen bahasa T-SQL bersifat opsional (termasuk kata kunci AS seperti yang disebutkan sebelumnya, dan bahkan titik koma di akhir pernyataan).

Pertimbangkan panduan berikut untuk membuat kode T-SQL mudah dibaca (dan lebih mudah dipahami dan di-debug!):

  • Kapitalisasi kata kunci T-SQL, seperti SELECT, FROM, AS, dan sebagainya. Kapitalisasi kata kunci adalah konvensi yang umum digunakan yang membuatnya lebih mudah untuk menemukan setiap klausul dari pernyataan yang kompleks.
  • Mulai baris baru untuk setiap klausul utama pernyataan.
  • Jika daftar SELECT berisi banyak kolom, ekspresi, atau alias, pertimbangkan untuk mencantumkan setiap kolom di barisnya sendiri.
  • Baris inden yang berisi subklausul atau kolom untuk memperjelas kode mana yang termasuk dalam setiap klausul utama.