Ekspresi Tabel Umum, atau singkatnya CTE, hanyalah sebuah teknik untuk membuat kumpulan catatan sementara yang dapat dirujuk dalam pernyataan INSERT, SELECT, UPDATE, atau DELETE.
Ekspresi tabel umum diperkenalkan oleh Microsoft di SQL Server 2005. Ekspresi tabel tidak disimpan sebagai objek dalam memori database karena masa pakainya sama dengan waktu eksekusi kueri. Segera setelah kueri selesai, mereka dihapus dari memori database. CTE dapat direferensikan dalam kueri sebanyak yang Anda inginkan dan CTE juga dapat menjadi referensi mandiri.
Mari buat database dengan tabel siswa dan masukkan beberapa catatan siswa dummy di dalamnya. Kami akan menggunakan database ini untuk menulis kueri CTE. Seperti biasa, pastikan Anda didukung dengan baik sebelum bereksperimen dengan kode baru. Lihat artikel ini tentang pencadangan SQL jika Anda tidak yakin.
Jalankan kueri berikut di server Anda.
CREATE DATABASE schooldb CREATE TABLE student ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, gender VARCHAR(50) NOT NULL, DOB datetime NOT NULL, total_score INT NOT NULL, ) INSERT INTO student VALUES (1, 'Jolly', 'Female', '12-JUN-1989', 500), (2, 'Jon', 'Male', '02-FEB-1974', 545), (3, 'Sara', 'Female', '07-MAR-1988', 600), (4, 'Laura', 'Female', '22-DEC-1981', 400), (5, 'Alan', 'Male', '29-JUL-1993', 500), (6, 'Kate', 'Female', '03-JAN-1985', 500), (7, 'Joseph', 'Male', '09-APR-1982', 643), (8, 'Mice', 'Male', '16-AUG-1974', 543), (9, 'Wise', 'Male', '11-NOV-1987', 499), (10, 'Elis', 'Female', '28-OCT-1990', 400);
Sekarang, mari kita buat ekspresi tabel umum yang sangat sederhana. CTE ini akan berisi catatan semua siswa yang lahir sebelum 1 Januari 1985. Perhatikan script berikut.
USE schooldb; WITH OldStudents AS ( SELECT * FROM student WHERE DOB < '1985-01-01' )
Untuk membuat CTE, Anda harus memulai dengan kata kunci 'DENGAN' diikuti dengan nama CTE dan kata kunci 'AS'.
Selanjutnya, di dalam tanda kurung, Anda harus menulis kueri yang mengembalikan catatan yang akan disimpan sementara oleh CTE. Dalam skrip di atas, kami membuat CTE bernama “Siswa Lama”.
Namun, perhatikan bahwa jika Anda mencoba menjalankan kueri di atas, Anda akan mendapatkan kesalahan. Ini karena begitu Anda membuat CTE, Anda harus segera menggunakannya.
Mari kita pilih semua record dari CTE “OldStudents” kita yang baru dibuat. Coba skrip berikut di server Anda.
USE schooldb; WITH OldStudents AS ( SELECT * FROM student WHERE DOB < '1985-01-01' ) SELECT * FROM OldStudents
Skrip di atas akan mengambil kumpulan catatan berikut:
Menghitung Agregat melalui CTE
Seperti tabel, Anda dapat melakukan fungsi agregat pada CTE. Mari kita lihat contoh CTE lainnya.
USE schooldb; WITH SumofScores AS ( SELECT gender, SUM(total_score) as SumScore FROM student GROUP BY gender ) SELECT AVG (SumScore) FROM SumofScores
Dalam contoh di atas, kami membuat CTE bernama SumofScores. CTE ini berisi jumlah nilai yang disimpan di kolom total_score tabel siswa. Hasilnya dikelompokkan berdasarkan kolom jenis kelamin. Data yang disimpan oleh CTE terlihat seperti ini di memori:
Selanjutnya, kami melakukan fungsi AVG pada kolom “SumScore” dari CTE. Hasil akhir skrip akan menjadi rata-rata 2400 dan 2730 yaitu 2565.
Ini sedikit lebih rumit daripada contoh sebelumnya tetapi menunjukkan konsep CTE dengan lebih jelas.
Pelabelan Kolom di CTE
Pada contoh sebelumnya, kami menambahkan alias ke kolom kedua CTE. Kami menamainya sebagai "SumScore". Ini adalah salah satu cara pelabelan kolom di CTE dan mirip dengan alias kolom tabel.
Namun, ada cara lain untuk mendefinisikan nama kolom di CTE. Perhatikan kueri berikut.
USE schooldb; WITH SumofScores(Gender, SumScore) AS ( SELECT gender, SUM(total_score) FROM student GROUP BY gender ) SELECT AVG (SumScore) From SumofScores
Dalam skrip ini, kami menambahkan nama kolom CTE “SumofScores” di dalam kurung setelah nama CTE. Setiap nama kolom dipisahkan dengan koma.
Jika Anda melihat pernyataan SELECT setelah CTE, Anda dapat melihat bahwa kami kemudian mereferensikan kolom “SumScore” yang kami buat di dalam kurung setelah nama CTE.
Membuat Beberapa CTE
Semua contoh sejauh ini hanya menggunakan satu ekspresi tabel umum untuk kejelasan. Anda dapat membuat daftar CTE secara bersamaan dan kemudian menggunakan semuanya dalam kombinasi di kumpulan hasil akhir.
Ini paling baik dijelaskan dengan bantuan sebuah contoh. Perhatikan script berikut di bawah ini.
Di sini kita akan membuat dua CTE. CTE pertama akan menyimpan semua catatan siswa yang lahir sebelum 1 Januari 1985. CTE kedua akan berisi semua catatan siswa yang lahir pada atau setelah 1 Januari 1985.
Setelah itu, kami akan menggunakan pernyataan pilih untuk mengambil semua catatan dari kedua CTE. Catatan yang diambil akan digabungkan bersama menggunakan pernyataan UNION. Terakhir, catatan yang digabungkan akan diurutkan dalam urutan menaik dari tanggal lahir.
USE schooldb; WITH OldStudents AS ( SELECT * FROM student WHERE DOB < '1985-01-01' ), YoungStudents AS ( SELECT * FROM student WHERE DOB >= '1985-01-01' ) (SELECT * FROM OldStudents UNION SELECT * FROM YoungStudents) ORDER BY DOB
Dalam kueri SQL di atas, kami membuat dua CTE:"Siswa Lama" dan "Siswa Muda". Perlu disebutkan bahwa Anda tidak perlu menggunakan kata kunci “DENGAN” dengan setiap CTE. Anda hanya diharuskan menggunakannya sebelum CTE pertama dalam skrip, setelah itu Anda dapat membuat sejumlah CTE dengan memisahkannya dengan koma.
Skrip di atas mengambil hasil berikut: