Kursus
Saat menulis query SQL, kita biasanya mengikuti urutan tertentu. (SQL dikenal ditulis dari dalam ke luar.) Namun, mesin SQL mengikuti urutan eksekusi spesifik saat mengompilasi query, yang berbeda dari urutan penulisan yang umum. Memahami urutan eksekusi SQL penting untuk menguasai optimisasi query, meningkatkan akurasi dan kinerja query, serta men-debug masalah kompleks, seperti yang akan Anda lihat.
Saat kita mulai, saya merekomendasikan kursus Introduction to SQL DataCamp dan jalur keterampilan SQL Fundamentals untuk mempelajari dasar-dasar SQL dan cara mengekstrak data menggunakan query. SQL Basics Cheat Sheet akan menjadi panduan yang membantu untuk fungsi SQL umum dalam memfilter dan mengagregasi data.
Apa Itu Urutan Eksekusi SQL?
Urutan eksekusi SQL mengacu pada urutan penilaian berbagai klausa dalam query. Ini penting dipahami karena urutan eksekusi biasanya berbeda dari cara kita menulis query SQL. Mengambil contoh paling sederhana, Anda mungkin mengira bahwa pada kasus SELECT * FROM database, SELECT dievaluasi terlebih dahulu, tetapi sebenarnya urutan eksekusi dimulai dengan klausa FROM.
Berikut adalah urutan eksekusi SQL. Pada bagian berikutnya, kita akan membahas langkah-langkahnya secara rinci.
- FROM/JOIN: Menentukan tabel tempat mengambil data.
- WHERE: Memfilter baris yang memenuhi kondisi sebelum pengelompokan.
- GROUP BY: Mengelompokkan baris yang berbagi suatu properti.
- HAVING: Memfilter grup berdasarkan kondisi, diterapkan setelah pengelompokan.
- SELECT: Menentukan kolom yang akan diambil atau dihitung.
- DISTINCT: Menghapus baris duplikat dari himpunan hasil.
- ORDER BY: Mengurutkan himpunan hasil berdasarkan kolom tertentu.
- LIMIT: Menentukan jumlah maksimum baris yang dikembalikan.
- OFFSET: Menentukan berapa banyak baris yang dilewati sebelum mulai mengembalikan baris.
Pada query berikut, saya menambahkan komentar untuk menunjukkan mana yang dievaluasi terlebih dahulu.
-- #6+7 SELECT DISTINCT department_id
-- #1 FROM employees
-- #2 JOIN orders ON customers.customer_id = orders.customer_id
-- #3 WHERE salary > 3000
-- #4 GROUP BY department
-- #5 HAVING AVG(salary) > 5000
-- #8 ORDER BY department
-- #9 LIMIT 10 OFFSET 5
-- #10 OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY;
Saya juga membuat akrostik yang mungkin membantu: For Work Goals and Hurdles Search DataCamp's Organized Learning Opportunities.
Tahapan Eksekusi Query SQL
Meskipun sebagian besar query SQL yang kita tulis dimulai dengan pernyataan SELECT, urutan eksekusi logis dimulai dengan klausa FROM. Di sini, saya akan menulis query untuk menunjukkan urutan eksekusi query. Namun, perlu diingat bahwa query berikut tidak lengkap dan tidak akan terkompilasi.
Klausa FROM
Query SQL memulai proses eksekusi dengan klausa FROM. Ini biasanya tahap pertama karena basis data mengidentifikasi sumber data/tabel. Ketika melibatkan banyak tabel, query SQL juga akan mengevaluasi kondisi JOIN untuk menggabungkan tabel yang ditentukan sebagai sumber data.
Query tidak lengkap di bawah ini terlebih dahulu akan memilih data dari tabel customers menggunakan klausa FROM dan tabel orders menggunakan klausa JOIN.
FROM customers
JOIN orders ON customers.customer_id = orders.customer_id;
Klausa WHERE
Klausa WHERE dijalankan setelah klausa FROM dan JOIN untuk memfilter baris berdasarkan kondisi tertentu. Penting dicatat bahwa kolom yang didefinisikan dengan alias dalam klausa SELECT tidak dapat dirujuk langsung di klausa WHERE karena klausa ini diproses sebelum SELECT.
Query di bawah ini menggunakan klausa WHERE untuk memfilter catatan karyawan dengan bonus lebih besar dari 5000.
FROM employees
JOIN departments ON employees.employee_id = departments.department_id
WHERE salary * 0.1 > 5000;
Klausa GROUP BY
Setelah memfilter baris, SQL mengeksekusi klausa GROUP BY untuk mengelompokkan hasil berdasarkan kolom tertentu. Langkah ini biasanya digunakan dengan fungsi agregat seperti COUNT(), SUM(), dan AVG() untuk melakukan perhitungan pada kolom yang ditentukan.
Query di bawah ini pertama-tama menyaring karyawan dengan salary lebih dari 3.000, lalu mengelompokkannya berdasarkan department dan menghitung rata-rata gaji untuk setiap grup.
FROM employees e
JOIN departments d ON e.employee_id = d.department_id
WHERE e.salary > 3000
GROUP BY e.name, d.department_name;
Klausa HAVING
Klausa HAVING mirip dengan klausa WHERE tetapi digunakan untuk memfilter data yang sudah dikelompokkan setelah operasi GROUP BY. Pada query di bawah, SQL mengelompokkan employees berdasarkan department, menghitung rata-rata gaji tiap grup, lalu menyaring grup dengan rata-rata gaji kurang dari atau sama dengan 5.000.
FROM employees
JOIN departments ON employees.employee_id = departments.department_id
WHERE salary > 3000
GROUP BY department_name
HAVING AVG(salary) > 5000;
Klausa SELECT
Klausa SELECT adalah tempat SQL menentukan kolom atau ekspresi yang akan dikembalikan setelah menjalankan langkah-langkah sebelumnya. Anda dapat menerapkan operasi aritmetika, pemberian alias, dan fungsi agregat dalam klausa SELECT.
Query berikut menggunakan klausa SELECT untuk mengambil name dan bonus yang dihitung sebagai salary * 0.1 dari tabel employees.
SELECT name, salary * 0.1 AS bonus
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY name
HAVING AVG(salary) > 5000;
Klausa DISTINCT
Klausa DISTINCT dievaluasi setelah klausa SELECT dalam sebuah query. Klausa DISTINCT penting untuk menghapus catatan duplikat dari tabel karena mengembalikan baris unik. Query di bawah ini mengembalikan setiap department_id unik, menyaring duplikat.
SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000;
Klausa ORDER BY
Klausa ORDER BY mengurutkan himpunan hasil berdasarkan kolom atau ekspresi tertentu. Berbeda dengan klausa WHERE, klausa ORDER BY dapat menggunakan alias kolom yang didefinisikan dalam pernyataan SELECT.
Query di bawah ini mengurutkan kolom bonus secara menurun. Perhatikan bahwa bonus didefinisikan dalam pernyataan SELECT sebagai alias dari sebuah ekspresi.
SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000
ORDER BY bonus DESC;
Klausa LIMIT/OFFSET
Klausa LIMIT dan OFFSET biasanya dieksekusi terakhir dalam query SQL untuk membatasi jumlah baris yang dikembalikan. Klausa LIMIT menentukan jumlah maksimum baris yang dikembalikan, dan OFFSET menentukan berapa banyak baris yang dilewati sebelum mulai mengembalikan baris.
Query di bawah ini mengambil nama dan gaji karyawan, mengurutkannya berdasarkan salary secara menurun, dan membatasi keluaran menjadi 10 hasil sambil melewati 5 baris pertama.
SELECT DISTINCT department_id
FROM employees
JOIN orders ON customers.customer_id = orders.customer_id
WHERE salary > 3000
GROUP BY department
HAVING AVG(salary) > 5000
ORDER BY bonus DESC
LIMIT 10 OFFSET 5;
-- OFFSET 5 ROWS FETCH NEXT 10 ROWS ONLY --SQL SERVER / ORACLE
Klausa LIMIT dan OFFSET didukung di basis data MySQL dan PostgreSQL. Untuk SQL Server dan Oracle, Anda menggunakan OFFSET, ROWS FETCH, dan ROWS ONLY untuk membatasi jumlah baris yang dikembalikan dari sebuah query.
Lihat tutorial kami tentang Cara Menggunakan SQL OFFSET untuk mempelajari lebih lanjut tentang paginasi data dan dukungan khusus basis data untuk klausa OFFSET dan LIMIT.
Urutan Eksekusi SQL vs. Urutan Penulisan
SQL adalah bahasa deklaratif, artinya urutan eksekusi query berbeda dari urutan penulisannya. Jadi, alih-alih menentukan bagaimana melakukan tugas, Anda menyatakan apa yang Anda inginkan, dan mesin basis data memutuskan cara terbaik untuk mencapainya. Metode ini berbeda dari bahasa pemrograman imperatif seperti Python atau Java, di mana Anda secara eksplisit menulis instruksi langkah demi langkah untuk dieksekusi.
Memahami urutan eksekusi SQL mengubah cara Anda memikirkan konstruksi query. Misalnya, bayangkan Anda menulis query untuk memfilter baris berdasarkan alias yang Anda buat dalam klausa SELECT:
SELECT price * 0.9 AS discounted_price
FROM products
WHERE discounted_price > 100;
Sekilas, ini tampak logis, tetapi akan menghasilkan error. Mengapa? Karena klausa WHERE dievaluasi sebelum klausa SELECT dalam urutan eksekusi SQL. Untuk memperbaikinya, Anda perlu menggunakan subquery atau HAVING sebagai gantinya:
SELECT price * 0.9 AS discounted_price
FROM products
HAVING discounted_price > 100;
Untuk mempelajari lebih lanjut tentang WHERE dan HAVING secara khusus, baca tutorial kami: Perbedaan Antara WHERE dan HAVING di SQL.
Kesalahan Umum dan Praktik Terbaik
Meskipun urutan eksekusi query tidak dipengaruhi oleh urutan penulisan, memahami alur eksekusi sangat penting untuk menghindari kesalahan umum dan meningkatkan kinerja query. Kesalahan berikut secara langsung terkait dengan kesalahpahaman terhadap urutan eksekusi SQL:
Kesalahan umum
Berikut adalah kesalahan umum yang dapat menghambat kinerja query Anda.
-
Menggunakan Alias Kolom dalam Klausa WHERE: Karena klausa
WHEREdieksekusi sebelum klausaSELECT, mencoba menggunakan alias diWHEREakan menghasilkan error. Memahami bahwa SQL mengevaluasiWHEREsebelum klausaSELECTmengajarkan bahwa Anda perlu mengulang ekspresi lengkap alih-alih mengandalkan alias. -
Menggunakan HAVING untuk Memfilter Baris Alih-alih WHERE: Klausa
HAVINGdieksekusi setelahGROUP BYdan dirancang untuk memfilter data teragregasi. Jika Anda memfilter data yang tidak teragregasi, tempatnya adalah di klausa WHERE. Mengetahui perbedaan urutan eksekusi antara WHERE dan HAVING membantu Anda menentukan di mana setiap kondisi harus ditempatkan. -
Penggunaan Agregat yang Tidak Tepat di SELECT Tanpa GROUP BY: Karena
GROUP BYdieksekusi sebelumHAVINGatauSELECT, kegagalan mengelompokkan data sebelum menerapkan fungsi agregat akan menyebabkan hasil yang salah atau error. Memahami urutan eksekusi memperjelas mengapa kedua klausa ini harus berjalan bersama. -
Tidak Menggunakan Alias dengan Benar di Klausa ORDER BY: Berbeda dengan klausa
WHERE, klausaORDER BYdievaluasi setelahSELECT. Ini memungkinkan Anda menggunakan alias yang dibuat diSELECTuntuk pengurutan, membantu menghindari kebingungan dengan mengetahui kapan alias tersedia untuk digunakan.
Praktik terbaik
Pertimbangkan praktik terbaik berikut untuk memastikan query Anda dieksekusi sesuai harapan.
-
Filter Lebih Awal dengan WHERE: Karena klausa
WHEREdieksekusi sebelumGROUP BYdanJOIN, menerapkan filter lebih awal mengurangi jumlah baris yang diproses oleh klausa berikutnya, meningkatkan kinerja query. Dengan memfilter data yang tidak teragregasi sedini mungkin, Anda membatasi data yang perlu dikelompokkan atau digabungkan, menghemat waktu pemrosesan. -
Pra-agregasi Data Sebelum Join: Mengetahui bahwa
FROMdanJOINadalah klausa pertama yang dieksekusi, melakukan pra-agregasi data menggunakan subquery atau common table expression (CTE) memungkinkan Anda mengecilkan himpunan data sebelum proses join. Ini memastikan lebih sedikit baris yang diproses selama join. -
Optimalkan ORDER BY dengan Indeks: Karena klausa
ORDER BYadalah salah satu langkah terakhir yang dieksekusi, memastikan kolom yang diurutkan diindeks akan mempercepat kinerja query dengan membantu basis data menangani operasi pengurutan secara lebih efisien. -
Hindari SELECT * dalam Query Produksi: Klausa
SELECTdieksekusi setelah pemfilteran, pengelompokan, dan agregasi, sehingga menentukan hanya kolom yang dibutuhkan meminimalkan jumlah data yang diambil, mengurangi beban yang tidak perlu.
Kesimpulan
Memahami urutan eksekusi SQL penting untuk menulis query yang efisien, akurat, dan teroptimasi. Kita telah membahas urutan logis eksekusi query di SQL dan membandingkannya dengan urutan penulisan. Saya mendorong Anda untuk berlatih menulis berbagai query guna lebih memahami urutan eksekusi logis. Menguasai konsep ini akan sangat meningkatkan kemampuan Anda dalam menelusuri masalah dan mengoptimalkan query SQL.
Jika Anda ingin meningkatkan keterampilan SQL, saya merekomendasikan mencoba jalur karier Associate Data Analyst in SQL dari DataCamp untuk menjadi analis data yang andal. Kursus Reporting in SQL juga akan membantu Anda mahir membangun laporan dan dasbor kompleks untuk penyajian data yang efektif. Terakhir, Anda sebaiknya memperoleh Sertifikasi SQL Associate untuk menunjukkan penguasaan Anda dalam menggunakan SQL untuk memecahkan masalah bisnis dan menonjol di antara para profesional lainnya.
FAQ Urutan Eksekusi SQL
Bagaimana eksekusi SQL berbeda dari urutan penulisan?
Urutan eksekusi SQL biasanya dimulai dengan klausa FROM diikuti klausa seperti WHERE dan GROUP BY, sedangkan urutan penulisan dimulai dengan pernyataan SELECT.
Bagaimana posisi JOIN dalam urutan eksekusi?
Operasi JOIN dieksekusi sebagai bagian dari klausa FROM.
Apakah saya bisa menggunakan alias kolom di klausa WHERE?
Tidak, alias kolom didefinisikan dalam klausa SELECT, yang dieksekusi setelah klausa WHERE.
Apa perbedaan antara WHERE dan HAVING?
WHERE memfilter baris sebelum pengelompokan, sedangkan HAVING memfilter setelah GROUP BY dan bekerja pada data teragregasi.
Apakah urutan eksekusi SQL berdampak pada kinerja query?
Ya, memahami urutan eksekusi memungkinkan Anda mengoptimalkan query dengan menerapkan filter lebih awal dan mengurangi operasi yang tidak perlu.

