meja bergantung
Sekarang mari kita rumitkan pertanyaan kita sedikit. Mari tambahkan jadual tugas baharu pada pangkalan data kami dengan tugas untuk pekerja kami. Dan mari kita lihat apakah entri yang terkandung di dalamnya:
SELECT * FROM task
Hasil daripada permintaan sedemikian:
ID | id_pekerja | nama | tarikh akhir |
---|---|---|---|
1 | 1 | Betulkan pepijat pada bahagian hadapan | 2022-06-01 |
2 | 2 | Betulkan pepijat pada bahagian belakang | 15-06-2022 |
3 | 5 | Beli kopi | 2022-07-01 |
4 | 5 | Beli kopi | 2022-08-01 |
5 | 5 | Akan membeli kopi | 2022-09-01 |
6 | (NULL) | Bersihkan pejabat | (NULL) |
7 | 4 | Nikmati kehidupan | (NULL) |
8 | 6 | Nikmati kehidupan | (NULL) |
Jadual ini hanya mempunyai 4 lajur:
- id — nombor tugas unik (dan baris dalam jadual);
- id_pekerja — ID pekerja daripada jadual pekerja yang diberikan tugasan;
- nama — nama dan perihalan tugas;
- tarikh akhir - masa di mana tugas mesti diselesaikan.
Beri perhatian kepada beberapa nuansa. Task N6 tidak mempunyai id_pekerja, kami tidak mempunyai pembersih. Tugas itu ada, tetapi pelakunya tidak ada. Ia berlaku.
Selain itu, tugasan 6-9 tidak mempunyai tarikh akhir yang ditetapkan. Ini berlaku apabila sesuatu tugas mesti dilakukan secara teratur dan berterusan. Sebagai contoh, pejabat perlu dibersihkan setiap hari, tetapi anda juga perlu menikmati kehidupan setiap hari :)
Jika satu jadual menggunakan ID daripada jadual lain, maka jadual sedemikian dipanggil bergantung .
Pertanyaan terhadap berbilang jadual
Di sini kita lihat dalam jadual tugas bahawa terdapat dua tugas "Menikmati kehidupan". Bagaimana kita tahu siapa mereka yang bertuah ini?
Untuk melakukan ini, dalam SQL, anda boleh melaksanakan pertanyaan pada dua jadual sekaligus. Secara umum, dalam SQL, anda boleh menanyakan sebarang bilangan jadual pada masa yang sama. Format umum untuk permintaan sedemikian ialah:
SELECT columns
FROM Table 1, table 2, tableN
Penting! Jika anda menulis pertanyaan kepada beberapa jadual pada masa yang sama, maka sebagai hasilnya anda akan mendapat apa yang dipanggil produk Cartesian bagi baris jadual. Setiap baris daripada jadual pertama akan dilekatkan pada setiap baris daripada jadual kedua, dan seterusnya.
Iaitu, jika anda mempunyai 5 baris dalam jadual pertama dan 10 baris dalam kedua, maka anda akan mempunyai 50 baris secara keseluruhan. Di Jawa, pertanyaan ini akan kelihatan seperti ini:
for (String row1 : table1)
{
for (String row2 : table2)
{
System.out.println(row1 + row2);
}
}
Mari tulis pertanyaan kami kepada dua jadual sekaligus dan lihat apa yang berlaku:
SELECT * FROM employee, task
Dan hasil daripada pertanyaan ini:
ID | nama | pekerjaan | gaji | umur | ID | pekerja | _ID | nama | tarikh akhir |
---|---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Pengaturcara | 100000 | 25 | 1 | 1 | Betulkan pepijat pada bahagian hadapan | 2022-06-01 | |
2 | Petrov Petr | Pengaturcara | 80000 | 23 | 1 | 1 | Betulkan pepijat pada bahagian hadapan | 2022-06-01 | |
3 | Ivanov Sergey | Penguji | 40000 | tiga puluh | 1 | 1 | Betulkan pepijat pada bahagian hadapan | 2022-06-01 | |
4 | Rabinovich Moisha | Pengarah | 200000 | 35 | 1 | 1 | Betulkan pepijat pada bahagian hadapan | 2022-06-01 | |
5 | Kirienko Anastasia | Pengurus pejabat | 40000 | 25 | 1 | 1 | Betulkan pepijat pada bahagian hadapan | 2022-06-01 | |
6 | Vaska | kucing | 1000 | 3 | 1 | 1 | Betulkan pepijat pada bahagian hadapan | 2022-06-01 | |
1 | Ivanov Ivan | Pengaturcara | 100000 | 25 | 2 | 2 | Betulkan pepijat pada bahagian belakang | 15-06-2022 | |
2 | Petrov Petr | Pengaturcara | 80000 | 23 | 2 | 2 | Betulkan pepijat pada bahagian belakang | 15-06-2022 | |
3 | Ivanov Sergey | Penguji | 40000 | tiga puluh | 2 | 2 | Betulkan pepijat pada bahagian belakang | 15-06-2022 | |
4 | Rabinovich Moisha | Pengarah | 200000 | 35 | 2 | 2 | Betulkan pepijat pada bahagian belakang | 15-06-2022 | |
5 | Kirienko Anastasia | Pengurus pejabat | 40000 | 25 | 2 | 2 | Betulkan pepijat pada bahagian belakang | 15-06-2022 |
Kami mempunyai 48 baris keputusan secara keseluruhan, tetapi di sini saya telah memberikan hanya 11. Jika tidak, ruang tidak akan mencukupi.
Perhatikan tiga perkara:
- Lajur dengan nama yang sama: id . Ini ialah id daripada jadual pekerja dan id daripada jadual tugas .
- Barisan setiap jadual diulang. Dalam lajur kiri, ID 6 diikuti dengan ID = 1 sekali lagi.
- Kami mempunyai baris karut di mana, sebagai contoh, id (daripada jadual pekerja) ialah 6 dan dalam baris yang sama employee_id ialah 1.
Mengeluarkan garisan yang tidak bermakna
Terdapat terlalu banyak baris dalam jadual kami yang terhasil, yang merupakan hasil darab Cartesian bagi semua baris kedua-dua jadual pekerja dan tugas .
Secara logiknya, jika baris employee_id ialah 3, maka ia hanya perlu melekat pada baris dari jadual pekerja di mana id ialah 3. Mari cuba selesaikan salah faham ini dengan WHERE.
Mari tulis pertanyaan seperti ini:
SELECT * FROM employee, task
WHERE emploee.id = task.emploee_id
Dan hasil daripada pertanyaan ini:
ID | nama | pekerjaan | gaji | umur | ID | id_pekerja | nama | tarikh akhir |
---|---|---|---|---|---|---|---|---|
1 | Ivanov Ivan | Pengaturcara | 100000 | 25 | 1 | 1 | Betulkan pepijat pada bahagian hadapan | 2022-06-01 |
2 | Petrov Petr | Pengaturcara | 80000 | 23 | 2 | 2 | Betulkan pepijat pada bahagian belakang | 15-06-2022 |
4 | Rabinovich Moisha | Pengarah | 200000 | 35 | 7 | 4 | Nikmati kehidupan | (NULL) |
5 | Kirienko Anastasia | Pengurus pejabat | 40000 | 25 | 3 | 5 | Beli kopi | 2022-07-01 |
5 | Kirienko Anastasia | Pengurus pejabat | 40000 | 25 | 4 | 5 | Beli kopi | 2022-08-01 |
5 | Kirienko Anastasia | Pengurus pejabat | 40000 | 25 | 5 | 5 | Akan membeli kopi | 2022-09-01 |
6 | Vaska | kucing | 1000 | 3 | 8 | 6 | Nikmati kehidupan | (NULL) |
Berita baiknya ialah baris yang tidak bermakna telah hilang: id dari lajur pertama sentiasa sama dengan employee_id.
Berita buruknya ialah tugas yang tidak diberikan kepada sesiapa, seperti membersihkan pejabat, sudah tiada. Id_pekerja mereka adalah NULL, jadi mereka dibuang selepas WHERE dilakukan.
GO TO FULL VERSION