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.