JavaRush /Kurslar /All lectures for UZ purposes /Birinchi jadvaldan malumotlarni olish

Birinchi jadvaldan malumotlarni olish

All lectures for UZ purposes
Daraja, Dars
Mavjud

Qaram jadval

Endi so'rovlarimizni bir oz murakkabroq qilamiz. Bizning ma'lumotlar bazamıza yangi task jadvalini qo'shamiz. Bu jadval xodimlarimiz uchun vazifalarni saqlaydi. Va unda qanday yozuvlar borligini ko'ramiz:


SELECT * FROM task 

Ushbu so'rovning natijasi:

id emploee_id name deadline
1 1 Frontendda xatoni tuzatish 2022-06-01
2 2 Backendda xatoni tuzatish 2022-06-15
3 5 Kofe sotib olish 2022-07-01
4 5 Kofe sotib olish 2022-08-01
5 5 Kofe sotib olish 2022-09-01
6 (NULL) Ofisni tozalash (NULL)
7 4 Hayotdan zavqlanish (NULL)
8 6 Hayotdan zavqlanish (NULL)

Bu jadvalda atigi 4 ta ustun bor:

  • id — vazifaning noyob raqami (jadvaldagi qator);
  • employee_id — employee jadvalidan xodimning ID-si, vazifa unga tayinlangan;
  • name — vazifaning nomi va tavsifi;
  • deadline — vazifani bajarish kerak bo'lgan oxirgi muddat.

Bir nechta nuanslarga e'tibor ber. 6-chi vazifa employee_idga ega emas, bizda tozalovchi yo'q. Vazifa bor, lekin bajaruvchi yo'q. Shunday holatlar bo'ladi.

Shuningdek, 6-9 vazifalarda deadline belgilanmagan. Bu shunday bo'ladiki, vazifa muntazam va uzluksiz bajarilishi shart. Masalan, ofis har kuni tozalanishi kerak, hayotdan zavqlanish ham har kuni kerak :)

Agar bir jadvalda boshqa jadvaldagi ID ishlatilsa, unda bunday jadval qaram deb ataladi.

Bir nechta jadvallarga so'rov

Biz task jadvalida "Hayotdan zavqlanish" nomli ikkita vazifa borligini ko'ryapmiz. Kim ekan bu baxtli kimsalar?

Bu uchun SQLda bir nechta jadvallarga bir vaqtning o'zida so'rov bajarish mumkin. Umuman olganda, SQLda bir nechta jadvallarga bir vaqtda so'rov bajarish mumkin. Umumiy format:

SELECT ustun FROM jadval1, jadval2, jadvalN

Diqqat! Agar bir vaqtning o'zida bir nechta jadvallarga so'rov yozsang, natijada dekart ko'paytmasi deb ataladigan qatorlarni olasan. Birinchi jadvaldagi har bir qatorga ikkinchi jadvaldan har bir qator qo'shiladi va hokazo.

Ya'ni, agar birinchi jadvalda 5 qator, ikkinchi jadvalda esa 10 qator bo'lsa, jami 50 qator bo'ladi. Java tilida bu so'rov quyidagicha ko'rinishga ega bo'ladi:


for (String row1 : jadval1) 
{ 
	for (String row2 : jadval2)  
   { 
  	System.out.println(row1 + row2); 
   }  
} 

Keling, bir vaqtning o'zida ikkita jadvallarga kerakli so'rovni yozib ko'ramiz va nima chiqishini ko'ramiz:


SELECT * FROM employee, task

Bu so'rov natijasi:

id name occupation salary age id emploee_id name deadline
1 Ivanov Ivan Dasturchi 100000 25 1 1 Frontendda xatoni tuzatish 2022-06-01
2 Petrov Pyotr Dasturchi 80000 23 1 1 Frontendda xatoni tuzatish 2022-06-01
3 Sergey Ivanov Tester 40000 30 1 1 Frontendda xatoni tuzatish 2022-06-01
4 Rabinovich Moysha Direktor 200000 35 1 1 Frontendda xatoni tuzatish 2022-06-01
5 Anastasiya Kirienko Ofis-menejer 40000 25 1 1 Frontendda xatoni tuzatish 2022-06-01
6 Vasya mushuk 1000 3 1 1 Frontendda xatoni tuzatish 2022-06-01
1 Ivanov Ivan Dasturchi 100000 25 2 2 Backendda xatoni tuzatish 2022-06-15
2 Petrov Pyotr Dasturchi 80000 23 2 2 Backendda xatoni tuzatish 2022-06-15
3 Sergey Ivanov Tester 40000 30 2 2 Backendda xatoni tuzatish 2022-06-15
4 Rabinovich Moysha Direktor 200000 35 2 2 Backendda xatoni tuzatish 2022-06-15
5 Anastasiya Kirienko Ofis-menejer 40000 25 2 2 Backendda xatoni tuzatish 2022-06-15

Umumiy natija 48 ta qator, lekin men faqat 11 nafarini ko'rsatdim, aks holda joy yetmaydi.

Uchta narsaga e'tibor ber:

  • Bir xil nomli ustunlar: id. Bu employee jadvalidagi id va task jadvalidagi id.
  • Har bir jadval qatorlari takrorlanadi. Chap ustunda ID 6 dan keyin yana ID = 1 keladi.
  • Bizda ma'nosiz qatorlar bor, masalan id (employee jadvalidan) 6 bo'lsa va employee_id 1 ga teng bo'lsa.

Ma'nosiz qatorlarni olib tashlash

Bizning natijaviy jadval, ya'ni employee va task jadvallarining barcha qatorlarining dekart ko'paytmasi juda ko'p qatorlar mavjud.

Mantiqan, agar employee_id qatorida 3 ga teng bo'lsa, u holda employee jadvalidagi id 3 ga teng bo'lgan jadvalga biriktirilishi kerak. Keling, bu muammoni WHERE operatori yordamida hal qilamiz.

Bunday so'rovni yozamiz:

SELECT * FROM employee, task WHERE employee.id = task.employee_id

Bu so'rov natijasi:

id name occupation salary age id emploee_id name deadline
1 Ivanov Ivan Dasturchi 100000 25 1 1 Frontendda xatoni tuzatish 2022-06-01
2 Petrov Pyotr Dasturchi 80000 23 2 2 Backendda xatoni tuzatish 2022-06-15
4 Rabinovich Moysha Direktor 200000 35 7 4 Hayotdan zavqlanish (NULL)
5 Anastasiya Kirienko Ofis-menejer 40000 25 3 5 Kofe sotib olish 2022-07-01
5 Anastasiya Kirienko Ofis-menejer 40000 25 4 5 Kofe sotib olish 2022-08-01
5 Anastasiya Kirienko Ofis-menejer 40000 25 5 5 Kofe sotib olish 2022-09-01
6 Vasya mushuk 1000 3 8 6 Hayotdan zavqlanish (NULL)

Yaxshi yangilik — ma'nosiz qatorlar yo'qoldi: birinchi ustundagi id har doim employee_idga teng.

Yomon yangilik — bajarmaly vazifalar, masalan, ofisni tozalash kabi tayinlanmagan vazifalar yo'qoldi. Ularning employee_id NULLga teng edi, shuning uchun WHERE qo'shilgandan keyin ularning hammasi yo'qotildi.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION