Pelajaran modul (1/3)
Pengantar CTE (DENGAN)
Pengantar CTE (DENGAN)
Cepat atau lambat hal ini terjadi pada semua orang: Anda perlu memfilter data berdasarkan hasil agregasi, lalu mengambil filter itu dan GABUNG dengan kueri gabungan lainnya. Anda mulai menulis SELECT di dalam SELECT, yang kemudian berakhir di FROM dari SELECT lainnya.
Hasilnya? Spaghetti SQL, kueri yang tidak dapat dibaca oleh manusia mana pun.
CTEs (Common Table Expressions) memungkinkan Anda mengatasi kekacauan ini. Anda mengaktifkannya dengan kata kunci WITH, yang memungkinkan Anda menentukan kueri bernama sementara dan kemudian menggunakannya kembali sebagai "tabel virtual" di kueri akhir.
Sintaks Dasar
WITH premium_customers AS (
SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(total_amount) > 1000
)
SELECT customers.first_name, premium_customers.total_spent
FROM customers
JOIN premium_customers ON customers.id = premium_customers.customer_id;Seperti yang Anda lihat, kueri utama di bagian bawah terbaca dari premium_customers seolah-olah itu adalah tabel nyata! Dan itu jauh lebih mudah dibaca daripada mega inner-join dengan subkueri bersarang.
Kami menginginkan produk yang sangat mahal. Gunakan CTE bernama 'luxury_products' untuk memilih 'id' dan 'price' dari 'products' dengan 'price > 500'. Kemudian jalankan kueri utama pada CTE ini dan tampilkan semuanya (*).
Tunjukkan petunjuk
Mulailah dengan DENGAN produk_mewah SEBAGAI (...) lalu PILIH * DARI produk_mewah.
Solusi tersedia setelah 3 upaya
Kami ingin mencari pengguna yang menulis ulasan. Buat 'reviewer' CTE yang mengekstrak nilai 'customer_id' unik (DISTINCT) dari 'reviews'. Kemudian ekstrak 'id', 'first_name', 'last_name' dari tabel 'customers' dan \`JOIN\` dengan CTE 'reviewers' di id.
Tunjukkan petunjuk
DENGAN pengulas SEBAGAI (PILIH BEDA customer_id DARI ulasan) PILIH id, nama_depan, nama_belakang DARI pelanggan GABUNG pengulas PADA pelanggan.id = reviewers.customer_id;
Solusi tersedia setelah 3 upaya