57-Mavzu: Sqlda Jadvallarni birlashtirish
Reja:
1. SELECT buyrug'i
2. Jadvaldagi ustunlar
3. USERS jadvali
SELECT buyrug'i yordamida siz faqat bitta jadvaldan emas, balki bir nechta jadvallardan ham ma'lumotlarni tanlashingiz mumkin. Bunday vazifa juda tez-tez paydo bo'ladi, chunki ularda saqlangan ma'lumotlarga qarab ma'lumotlarni turli jadvallar bo'ylab tarqatish odatiy holdir. Masalan, bitta jadvalda foydalanuvchilar to'g'risidagi ma'lumotlar, ikkinchi jadvalda kompaniyaning pozitsiyalari, uchinchi va to'rtinchi jadvalda etkazib beruvchilar va mijozlar to'g'risidagi ma'lumotlar saqlanadi. Ma'lumotlar jadvallarga shunday bo'linadiki, bir tomondan, so'rovlarni bajarishning eng yuqori tezligi olinadi, ikkinchi tomondan, unumdorlikni pasaytiradigan keraksiz birlashmalarning oldini oladi.
Jadvaldagi ustunlar qancha ko'p bo'lsa, undan namuna olish tezligi shunchalik ko'p tushadi. Shuning uchun ular har bir jadvalda 5-10 tadan ko'p bo'lmagan ustunlar yasashga harakat qilishadi. Ammo ma'lumotlar qancha ko'p turli jadvallarga bo'lingan bo'lsa, so'rovlar ichida ko'proq qo'shilishlarni amalga oshirish kerak bo'ladi, bu ham namunani olish tezligini pasaytiradi va ma'lumotlar bazasiga yukni oshiradi.
Keling, ikkita jadval ma'lumotlarini birlashtirgan so'rovga misol keltiraylik. Buning uchun ikkita jadval mavjud deb hisoblang. Birinchi jadval USERS deb nomlanadi va ikkita ustunga ega bo'ladi: ID va foydalanuvchi nomlari:
+-----------+
| FOYDALANUVCHILAR |
+-----------+
| ID | nomi |
+----+------+
| 1 | Sichqoncha |
+----+------+
| 2 | Mushuk |
+----+------+
Ikkinchi jadval FOOD deb nomlanadi va ikkita ustundan iborat bo‘ladi: USER_ID va NAME. Ushbu jadval birinchi jadvaldagi foydalanuvchilarning sevimli taomlari ro'yxatini o'z ichiga oladi. USER_ID ustunida foydalanuvchi identifikatori, PRODUCT ustunida esa sevimli taom nomi mavjud.
+-----------------+
| OAV |
+-----------------+
| USER_ID | MAHSULOT |
+---------+---------+
| 1 | Pishloq |
+---------+---------+
| 2 | Sut |
+---------+---------+
Keling, USERS jadvalidagi ID maydoni va FOOD jadvalidagi USER_ID maydoni birlamchi kalitlar ekanligiga rozi bo'laylik (ya'ni ular takrorlanmaydigan noyob qiymatlarga ega). Keling, mantiqdan foydalanishga harakat qilaylik va ikkala jadvaldan foydalangan holda "Sichqoncha" foydalanuvchisining sevimli taomini topamiz. Buning uchun biz birinchi jadvalni ko'rib chiqamiz va "Sichqoncha" nomi ostida foydalanuvchi identifikatorini topamiz, so'ngra ikkinchi jadvalda xuddi shu ID ostida mahsulot nomini qidiramiz. SQL so'rovlarini birlashtirish bir xil mantiq bo'yicha ishlaydi: jadvallarni birlashtirish mumkin bo'lgan ustun kerak.
Keling, ID va USER_ID ustunlari boʻyicha jadvallarni birlashtiruvchi soʻrovni koʻrsatamiz:
SELECT * FROM `USERS` INNER JOIN `FOOD` ON `USERS`.`ID`=`FOOD`.`USER_ID`;
Keling, buyruqni buzamiz. Bu oddiy bitta jadval tanlovi sifatida "Foydalanuvchilardan SELECT *" so'zlari bilan boshlanadi. Ammo keyin INNER so'zi keladi, bu birlashma turini anglatadi. Jadvallarni birlashtirishning uchta turi mavjud: ICHKI, CHAP, O'NG. Ularning barchasi bitta jadvaldagi ba'zi qatorlar ikkinchi jadvalda mos keladigan qatorga ega bo'lmasligi mumkinligi bilan bog'liq. Bunday holda, "INNER" ishlatilganda, boshqa jadvalda mos keladigan juft bo'lmagan barcha qatorlar so'rov natijalaridan o'chiriladi. Agar “INNER” o‘rniga “CHAP” yoki “O‘NG” so‘zi ishlatilsa, birinchi (chap) yoki ikkinchi (o‘ng) jadvaldan moslik topilmagan qatorlar o‘chiriladi.
“INNER” so‘zidan keyin “JOIN” (ingliz tilidan “JOIN” deb tarjima qilingan) so‘zi keladi. "JOIN" so'zidan keyin qo'shiladigan jadval nomi keladi. Bizning holatlarimizda bu OZIQ-OVQAT jadvali. Jadval nomidan keyin "ON" so'zi va USERS.ID=FOOD.USER_ID tengligi qo'shilish qoidasini o'rnatadi. Tanlov ikkita jadvalni birlashtiradi, shunda USERS jadvalining ID ustunidagi qiymat FOOD jadvalining USER_ID qiymatiga teng bo'ladi.
Ushbu SQL so'rovini bajarish natijasida biz to'rtta ustunli jadvalni olamiz:
+----+------+---------+---------+
| ID | nomi | USER_ID | MAHSULOT |
+----+------+---------+---------+
| 1 | Sichqoncha | 1 | Pishloq |
+----+------+---------+---------+
| 2 | Mushuk | 2 | Sut |
+----+------+---------+---------+
Biz so'rovni o'zgartirishni taklif qilamiz, chunki bizga to'rtta ustun kerak emas. ID va USER_ID ustunlarini olib tashlang. Buning uchun SELECT buyrug'idagi * o'rniga ustunlar nomini qo'ying. Lekin buni birinchi navbatda jadval nomini va davr orqali ustun nomini qo'yish orqali qilishingiz kerak. Buni shunday qilish uchun:
SELECT `USERS`.`NAME`, `FOOD`.`PRODUCT`
FROM `USERS` INNER JOIN `FOOD` ON `USERS`.`ID`=`FOOD`.`USER_ID`;
Endi natija yanada ixcham bo'ladi. Va so'ralgan ma'lumotlarning kamayishi tufayli natija ma'lumotlar bazasidan tezroq olinadi:
+------+---------+
| nomi | MAHSULOT |
+------+---------+
| Sichqoncha | Pishloq |
+------+---------+
| Mushuk | Sut |
+------+---------+
Agar ikkita jadvalda bir xil nomli ustunlar bo'lsa, faqat bir xil nomdagi oxirgi ustun ko'rsatiladi. Buning oldini olish uchun ma'lum bir ustunni tanlang va tanlov natijalarida ustun nomini o'zgartirish uchun ishlatilishi mumkin bo'lgan "AS" buyrug'idan foydalaning.
Keling, maqolaning boshida qo'ygan mantiqiy masalani hal qilaylik. Keling, ushbu birlashtirilgan jadvalda "Sichqoncha" foydalanuvchisiga mos keladigan faqat bitta qatorni tanlashga harakat qilaylik. Buning uchun SQL so'rovida WHERE bandidan foydalaning:
SELECT `USERS`.`NAME`, `FOOD`.`PRODUCT`
FROM `USERS` INNER JOIN `FOOD` ON `USERS`.`ID`=`FOOD`.`USER_ID`
WHERE `USERS`.`NAME` LIKE 'Мышь';
Esda tutingki, WHERE bandida maydonlar nomi nuqta bilan ajratilgan jadval nomi bilan birga yozilishi kerak: USERS.NAME. Ushbu so'rov quyidagi natijaga olib keladi:
+------+---------+
| nomi | MAHSULOT |
+------+---------+
| Sichqoncha | Pishloq |
+------+---------+
Yaxshi! Endi biz jadvallarni qanday birlashtirishni bilamiz.
Do'stlaringiz bilan baham: |