meja tergantung

Sekarang mari kita sedikit memperumit pertanyaan kita. Mari tambahkan tabel tugas baru ke database kita dengan tugas untuk karyawan kita. Dan mari kita lihat entri apa yang ada di dalamnya:

SELECT * FROM task

Hasil dari permintaan seperti itu:

pengenal employee_id nama tenggat waktu
1 1 Perbaiki bug di frontend 01-06-2022
2 2 Perbaiki bug di backend 15-06-2022
3 5 Beli kopi 01-07-2022
4 5 Beli kopi 01-08-2022
5 5 Akan membeli kopi 01-09-2022
6 (BATAL) Membersihkan kantor (BATAL)
7 4 Menikmati hidup (BATAL)
8 6 Menikmati hidup (BATAL)

Tabel ini hanya memiliki 4 kolom:

  • id — nomor tugas unik (dan baris dalam tabel);
  • employee_id — ID karyawan dari tabel karyawan yang diberi tugas;
  • nama — nama dan deskripsi tugas;
  • tenggat waktu - waktu dimana tugas harus diselesaikan.

Perhatikan beberapa nuansa. Tugas N6 tidak memiliki employee_id, kami tidak memiliki pembersih. Tugasnya ada di sana, tetapi pelakunya tidak. Itu terjadi.

Juga, tugas 6-9 tidak memiliki tenggat waktu. Hal ini terjadi ketika suatu tugas harus dilakukan secara teratur dan terus menerus. Misalnya kantor perlu dibersihkan setiap hari, tetapi Anda juga perlu menikmati hidup setiap hari :)

Jika satu tabel menggunakan ID dari tabel lain, maka tabel seperti itu disebut dependen .

Kueri terhadap beberapa tabel

Di sini kita lihat di tabel tugas bahwa ada dua tugas “Menikmati hidup”. Bagaimana kita tahu siapa orang-orang yang beruntung ini?

Untuk melakukan ini, dalam SQL, Anda dapat menjalankan kueri pada dua tabel sekaligus. Secara umum, dalam SQL, Anda dapat membuat kueri sejumlah tabel secara bersamaan. Format umum untuk permintaan tersebut adalah:

SELECT columns
FROM Table 1, table 2, tableN

Penting! Jika Anda menulis kueri ke beberapa tabel secara bersamaan, maka sebagai hasilnya Anda akan mendapatkan apa yang disebut produk Cartesian dari baris tabel. Setiap baris dari tabel pertama akan direkatkan ke setiap baris dari tabel kedua, dan seterusnya.

Artinya, jika Anda memiliki 5 baris pada tabel pertama dan 10 baris pada tabel kedua, maka Anda akan memiliki total 50 baris. Di Jawa, kueri ini akan terlihat seperti ini:

for (String row1 : table1)
{
	for (String row2 : table2)
   {
  	System.out.println(row1 + row2);
   }
}

Mari tulis kueri kita ke dua tabel sekaligus dan lihat apa yang terjadi:

SELECT * FROM employee, task

Dan hasil dari kueri ini:

pengenal nama pekerjaan gaji usia pengenal karyawan _pengenal nama tenggat waktu
1 Ivanov Ivan Programmer 100000 25 1 1 Perbaiki bug di frontend 01-06-2022
2 Petrov Petr Programmer 80000 23 1 1 Perbaiki bug di frontend 01-06-2022
3 Ivanov Sergey Penguji 40000 tigapuluh 1 1 Perbaiki bug di frontend 01-06-2022
4 Rabinovich Moisha Direktur 200000 35 1 1 Perbaiki bug di frontend 01-06-2022
5 Kirienko Anastasia Manajer kantor 40000 25 1 1 Perbaiki bug di frontend 01-06-2022
6 Vaska kucing 1000 3 1 1 Perbaiki bug di frontend 01-06-2022
1 Ivanov Ivan Programmer 100000 25 2 2 Perbaiki bug di backend 15-06-2022
2 Petrov Petr Programmer 80000 23 2 2 Perbaiki bug di backend 15-06-2022
3 Ivanov Sergey Penguji 40000 tigapuluh 2 2 Perbaiki bug di backend 15-06-2022
4 Rabinovich Moisha Direktur 200000 35 2 2 Perbaiki bug di backend 15-06-2022
5 Kirienko Anastasia Manajer kantor 40000 25 2 2 Perbaiki bug di backend 15-06-2022

Kami memiliki total 48 baris hasil, tetapi di sini saya hanya memberikan 11. Jika tidak, tidak akan ada cukup ruang.

Perhatikan tiga hal:

  • Kolom dengan nama yang sama: id . Ini adalah id dari tabel karyawan dan id dari tabel tugas .
  • Baris setiap tabel diulang. Di kolom kiri, ID 6 diikuti oleh ID = 1 lagi.
  • Kami memiliki baris yang tidak masuk akal di mana, misalnya, id (dari tabel karyawan) adalah 6 dan di baris yang sama employee_id adalah 1.

Menghapus garis yang tidak berarti

Ada terlalu banyak baris dalam tabel hasil kami, yang merupakan produk Cartesian dari semua baris dari dua tabel employee dan task .

Logikanya, jika baris employee_id adalah 3, maka seharusnya hanya menempel pada baris dari tabel employee dimana id adalah 3. Mari kita coba perbaiki kesalahpahaman ini dengan WHERE.

Mari tulis kueri seperti ini:

SELECT * FROM employee, task 
WHERE emploee.id = task.emploee_id 

Dan hasil dari kueri ini:

pengenal nama pekerjaan gaji usia pengenal employee_id nama tenggat waktu
1 Ivanov Ivan Programmer 100000 25 1 1 Perbaiki bug di frontend 01-06-2022
2 Petrov Petr Programmer 80000 23 2 2 Perbaiki bug di backend 15-06-2022
4 Rabinovich Moisha Direktur 200000 35 7 4 Menikmati hidup (BATAL)
5 Kirienko Anastasia Manajer kantor 40000 25 3 5 Beli kopi 01-07-2022
5 Kirienko Anastasia Manajer kantor 40000 25 4 5 Beli kopi 01-08-2022
5 Kirienko Anastasia Manajer kantor 40000 25 5 5 Akan membeli kopi 01-09-2022
6 Vaska kucing 1000 3 8 6 Menikmati hidup (BATAL)

Kabar baiknya adalah bahwa baris yang tidak berarti telah menghilang: id dari kolom pertama selalu sama dengan employee_id.

Kabar buruknya , tugas yang tidak diberikan kepada siapa pun, seperti membersihkan kantor, hilang. employee_id mereka adalah NULL, jadi mereka dibuang setelah WHERE selesai.