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