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.
GO TO FULL VERSION