Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Cara Menulis Query Kompleks di SQL

Kueri khas dalam format tabel SELECT * FROM terkadang tidak cukup. Saat data untuk kueri tidak berada dalam satu tabel, tetapi dalam beberapa tabel, atau saat diperlukan untuk menentukan beberapa parameter pilihan sekaligus, Anda akan memerlukan kueri yang lebih canggih.

Artikel ini akan menjelaskan cara membuat kueri semacam itu dan memberikan contoh kueri SQL yang kompleks.

Seperti Apa Tampilan Kueri Kompleks?

Pertama, mari kita tentukan kondisi untuk menyusun kueri SQL. Secara khusus, Anda perlu menggunakan parameter pemilihan berikut:

  • nama tabel tempat Anda ingin mengekstrak data;
  • nilai bidang yang harus dikembalikan ke yang asli setelah membuat perubahan pada database;
  • hubungan antar tabel;
  • kondisi pengambilan sampel;
  • kriteria seleksi tambahan (pembatasan, cara penyajian informasi, jenis penyortiran).

Untuk lebih memahami topik, mari kita pertimbangkan contoh yang menggunakan empat tabel sederhana berikut. Baris pertama adalah nama tabel yang dalam kueri kompleks bertindak sebagai kunci asing. Kami akan mempertimbangkan ini secara lebih rinci dengan sebuah contoh:

Setiap tabel memiliki baris yang berhubungan dengan beberapa tabel lainnya. Kami akan menjelaskan mengapa hal itu perlu dilakukan lebih lanjut.

Sekarang, mari kita lihat kueri SQL dasar:

SELECT * FROM companies WHERE companies_name %STARTSWITH 'P';

%MULAI DENGAN predikat memilih baris yang dimulai dengan karakter/karakter yang ditentukan.

Hasilnya terlihat seperti ini:

Sekarang, mari kita pertimbangkan kueri SQL yang kompleks:

SELECT 
	companies.companies_name,
	SUM(CASE WHEN call.id IS NOT NULL THEN 1 ELSE 0 END) AS calls,
	AVG(ISNULL(DATEDIFF(SECOND, calls.start_time, calls.end_time),0)) AS avgdifference
FROM companies 
LEFT JOIN offices ON offices.companies_id = companies.id
LEFT JOIN customers ON offices.id = customers.offices_id
LEFT JOIN calls ON calls.customers_id = customers.id
GROUP BY 
	companies.id,
	companies.companies_name
HAVING AVG(ISNULL(DATEDIFF(SECOND, calls.start_time, calls.end_time),0)) > (SELECT AVG(DATEDIFF(SECOND, calls.start_time, calls.end_time)) FROM calls)
ORDER BY calls DESC, companies.id ASC;

Hasilnya adalah tabel berikut:

Tabel menunjukkan perusahaan, jumlah panggilan telepon yang sesuai, dan perkiraan durasinya.

Lebih lanjut, ini hanya mencantumkan nama-nama perusahaan di mana durasi panggilan rata-rata lebih besar daripada durasi panggilan rata-rata di perusahaan lain.

Apakah Aturan Utama untuk Membuat Query SQL Kompleks?

Mari kita coba membuat algoritme multiguna untuk menyusun kueri kompleks.

Pertama-tama, Anda perlu memutuskan tabel yang terdiri dari data yang mengambil bagian dalam kueri.

Contoh di atas melibatkan perusahaan dan panggilan tabel. Jika tabel dengan data yang diperlukan tidak terkait langsung satu sama lain, Anda juga perlu menyertakan tabel perantara yang menggabungkannya.

Untuk alasan ini, kami juga menghubungkan tabel, seperti kantor dan pelanggan , menggunakan kunci asing. Oleh karena itu, setiap hasil kueri dengan tabel dari contoh ini akan selalu menyertakan baris di bawah ini:

SELECT 
	...
FROM companies 
LEFT JOIN offices ON offices.companies_id = companies.id
LEFT JOIN customers ON offices.id = customers.offices_id
LEFT JOIN calls ON calls.customers_id = customers.id
...;

After that, you must test the correctness of the behavior in the following part of the query:

SELECT * FROM companies 
LEFT JOIN offices ON offices.companies_id = companies.id
LEFT JOIN customers ON offices.id = customers.offices_id
LEFT JOIN calls ON calls.customers_id = customers.id;

Tabel gabungan menunjukkan tiga poin terpenting:

  • Perhatikan daftar kolom setelah SELECT. Operasi membaca data dari tabel bergabung mengharuskan Anda menentukan nama tabel yang akan digabungkan di nama lapangan.
  • Kueri kompleks Anda akan selalu memiliki tabel utama (perusahaan ). Sebagian besar bidang dibaca darinya. Tabel terlampir, dalam contoh kita, menggunakan tiga tabel – kantor , pelanggan , dan panggilan . Nama ditentukan setelah operator JOIN.
  • Selain menentukan nama tabel kedua, pastikan untuk menentukan kondisi untuk melakukan penggabungan. Kami akan membahas kondisi ini lebih lanjut.
  • Kueri akan menampilkan tabel dengan jumlah baris yang banyak. Tidak perlu mempublikasikannya di sini, karena ini menampilkan hasil antara. Namun, Anda selalu dapat memeriksa outputnya sendiri. Ini sangat penting, karena membantu menghindari kesalahan pada hasil akhir.

Sekarang mari kita lihat bagian kueri yang membandingkan durasi panggilan di setiap perusahaan dan di antara semua perusahaan. Kita perlu menghitung durasi rata-rata semua panggilan. Gunakan kueri berikut:

SELECT AVG(DATEDIFF(SECOND, calls.start_time, calls.end_time)) FROM calls

Perhatikan bahwa kami menggunakan DATEDIFF fungsi yang menampilkan perbedaan antara periode yang ditentukan. Dalam kasus kami, durasi panggilan rata-rata sama dengan 335 detik.

Sekarang mari tambahkan data panggilan dari semua perusahaan ke kueri.

SELECT 
	companies.companies_name,
	SUM(CASE WHEN calls.id IS NOT NULL THEN 1 ELSE 0 END) AS calls,
	AVG(ISNULL(DATEDIFF(SECOND, calls.start_time, calls.end_time),0)) AS avgdifference
FROM companies 
LEFT JOIN offices ON offices.companies_id = companies.id
LEFT JOIN customers ON offices.id = customers.offices_id
LEFT JOIN calls ON calls.customers_id = customers.id
GROUP BY 
	companies.id,
	companies.companies_name
ORDER BY calls DESC, companies.id ASC;

Dalam kueri ini,

  • SUM (KASUS KETIKA CALL.id BUKAN NULL MAKA 1 LAIN 0 AKHIR) – untuk menghindari operasi yang tidak perlu, kami hanya merangkum panggilan yang ada – ketika jumlah panggilan di sebuah perusahaan bukan nol. Ini sangat penting dalam tabel besar dengan kemungkinan nilai nol.
  • AVG (ISNULL (DATEDIFF (SECOND, call.start_time, calls.end_time), 0)) – kueri identik dengan kueri AVG di atas. Namun, di sini kami menggunakan ISNULL operator yang menggantikan NULL dengan 0. Hal ini diperlukan untuk perusahaan tanpa panggilan sama sekali.

Hasil kami:

Kami hampir selesai. Tabel di atas menyajikan daftar perusahaan, jumlah panggilan yang sesuai untuk masing-masing perusahaan, dan durasi panggilan rata-rata di masing-masing perusahaan.

Satu-satunya yang tersisa adalah membandingkan nomor dari kolom terakhir dengan durasi rata-rata semua panggilan dari semua perusahaan (335 detik).

Jika Anda memasukkan kueri yang kami sajikan di awal, cukup tambahkan HAVING bagian, Anda akan mendapatkan apa yang Anda butuhkan.

Kami sangat menyarankan untuk menambahkan komentar pada setiap baris sehingga Anda tidak akan bingung di masa mendatang ketika Anda perlu memperbaiki beberapa kueri SQL kompleks yang ada.

Pemikiran Akhir

Meskipun setiap kueri SQL yang kompleks memerlukan pendekatan individual, beberapa rekomendasi cocok untuk persiapan sebagian besar kueri semacam itu.

  • menentukan tabel mana yang akan berpartisipasi dalam kueri;
  • membuat kueri kompleks dari bagian yang lebih sederhana;
  • periksa keakuratan kueri secara berurutan, sebagian;
  • uji keakuratan kueri Anda dengan tabel yang lebih kecil;
  • tulis komentar rinci pada setiap baris yang berisi operan, menggunakan simbol ‘-‘.

Alat khusus membuat pekerjaan ini jauh lebih mudah. Di antara mereka, kami akan merekomendasikan menggunakan Pembuat Kueri – alat visual yang memungkinkan pembuatan kueri yang paling kompleks sekalipun jauh lebih cepat dalam mode visual. Alat ini tersedia sebagai solusi yang berdiri sendiri atau sebagai bagian dari dbForge Studio multi-fitur untuk SQL Server.

Kami harap artikel ini membantu Anda mengklarifikasi masalah khusus ini.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menghitung Nilai Berbeda dalam SQL

  2. Pemicu dalam SQL

  3. Jenis-jenis SQL JOIN

  4. Huawei GaussDB

  5. Bekerja dengan Data ODBC di DbVisualizer