Qaysi sql agregat funksiyasi maksimal qiymatni topadi. So'rovlarda agregat funktsiyalaridan foydalanish

Ballar ustunining qiymati. 5.7-jadval. Agregat funktsiyalari
Funktsiya Natija
COUNT So'rov tanlangan qatorlar soni yoki bo'sh bo'lmagan maydon qiymatlari
SUM Ushbu maydon uchun barcha tanlangan qiymatlar yig'indisi
AVG Ushbu maydon uchun barcha tanlangan qiymatlarning o'rtacha arifmetik qiymati
MIN Ushbu maydon uchun barcha tanlangan qiymatlarning eng kichigi
MAX Ushbu maydon uchun barcha tanlangan qiymatlarning eng kattasi
R1
To'liq ism Intizom Baho
1-guruh Petrov F.I. Ma'lumotlar bazasi 5
Sidorov K.A. Ma'lumotlar bazasi 4
Mironov A.V. Ma'lumotlar bazasi 2
Stepanova K.E. Ma'lumotlar bazasi 2
Krilova T.S. Ma'lumotlar bazasi 5
Vladimirov V.A. Ma'lumotlar bazasi 5
2-guruh Sidorov K.A. Axborot nazariyasi 4
Stepanova K.E. Axborot nazariyasi 2
Krilova T.S. Axborot nazariyasi 5
Mironov A.V. Axborot nazariyasi Null
3-guruh Trofimov P.A. Tarmoqlar va telekommunikatsiyalar 4
Ivanova E.A. Tarmoqlar va telekommunikatsiyalar 5
Utkina N.V. Tarmoqlar va telekommunikatsiyalar 5
4-guruh Vladimirov V.A. Ingliz tili 4
Trofimov P.A. Ingliz tili 5
Ivanova E.A. Ingliz tili 3
Petrov F.I. Ingliz tili 5

Agregat funktsiyalari SELECT iborasidagi maydon nomlariga oʻxshab qoʻllaniladi, lekin bitta istisno: ular argument sifatida maydon nomini oladi. SUM va AVG funksiyalari bilan faqat raqamli maydonlardan foydalanish mumkin. COUNT , MAX va MIN funksiyalari bilan son va belgilar maydonlaridan foydalanish mumkin. Belgilar maydonlari bilan foydalanilganda, MAX va MIN ularni ekvivalent ASCII kodiga tarjima qiladi va ularni alifbo tartibida qayta ishlaydi. Ba'zi DBMSlar ichki o'rnatilgan agregatlardan foydalanishga ruxsat beradi, ammo bu barcha oqibatlarga olib keladigan ANSI standartidan og'ishdir.

Masalan, har bir fan bo'yicha imtihon topshirgan talabalar sonini hisoblashingiz mumkin. Buning uchun siz "Intizom" maydoni bo'yicha guruhlangan so'rovni bajarishingiz va natijada ushbu fan bo'yicha fan nomi va guruhdagi qatorlar sonini ko'rsatishingiz kerak. COUNT funktsiyasiga argument sifatida * belgisidan foydalanish guruhdagi barcha qatorlarni hisoblashni anglatadi.

R1.Intizom, COUNT(*) R1 GURUHIDAN R1.Intizom boʻyicha TANLASH

Natija:

Agar biz biron bir fan bo'yicha imtihondan o'tgan odamlar sonini hisoblamoqchi bo'lsak, guruhlashdan oldin noaniq qiymatlarni asl nisbatdan chiqarib tashlashimiz kerak. Bunday holda, so'rov quyidagicha ko'rinadi:

Biz natijaga erishamiz:

Bunday holda, talaba bilan chiziq

Mironov A.V. Axborot nazariyasi Null

guruhlashdan oldin kortejlar to'plamiga tushmaydi, shuning uchun guruhdagi kortejlar soni intizomga solinishi kerak " Axborot nazariyasi" 1 kam bo'ladi.

Foydalanish mumkin agregat funktsiyalari shuningdek, oldindan guruhlash operatsiyasisiz, bu holda butun munosabat bitta guruh sifatida ko'rib chiqiladi va bu guruh uchun har bir guruh uchun bitta qiymat hisoblanishi mumkin.

Yana "Session" ma'lumotlar bazasiga (R1, R2, R3 jadvallari) murojaat qilib, biz muvaffaqiyatli o'tgan imtihonlar sonini topamiz:

Bu, albatta, maydonni tanlashdan farq qiladi, chunki jadvalda qancha qator bo'lishidan qat'i nazar, har doim bitta qiymat qaytariladi. Dalil agregat funktsiyalari alohida jadval ustunlari bo'lishi mumkin. Ammo, masalan, guruhdagi ma'lum bir ustunning aniq qiymatlari sonini hisoblash uchun siz ustun nomi bilan birga DISTINCT kalit so'zidan foydalanishingiz kerak. Keling, har bir fan bo'yicha olingan turli baholar sonini hisoblaylik:

Natija:

Natijada guruhlash maydoni qiymati va bir nechta bo'lishi mumkin agregat funktsiyalari, va guruhlash sharoitida siz bir nechta maydonlardan foydalanishingiz mumkin. Bunday holda, guruhlar belgilangan guruhlash maydonlari to'plamiga muvofiq tuziladi. Agregat funksiya operatsiyalari bir nechta manba jadvallarini birlashtirish uchun qo'llanilishi mumkin. Masalan, savolni qo'yaylik: har bir guruh va har bir fan uchun imtihondan muvaffaqiyatli o'tgan talabalar sonini va fan bo'yicha o'rtacha ballni aniqlang.

Natija:

Biz foydalana olmaymiz agregat funktsiyalari WHERE bandida, chunki predikatlar bir qator nuqtai nazaridan baholanadi va agregat funktsiyalari- chiziqlar guruhlari bo'yicha.

GROUP BY bandi ma'lum bir sohadagi qiymatlar to'plamini boshqa maydon nuqtai nazaridan belgilashga va kichik to'plamga agregat funksiyasini qo'llashga imkon beradi. Bu maydonlarni birlashtirishga imkon beradi va agregat funktsiyalari bitta SELECT bandida. Agregat funktsiyalari SELECT qatori natijalarini chiqarish ifodasida ham, hosil qilingan HAVING guruhlarini qayta ishlash sharti ifodasida ham foydalanish mumkin. Bunday holda, har bir agregat funksiya har bir tanlangan guruh uchun hisoblanadi. Hisoblash natijasida olingan qiymatlar agregat funktsiyalari, mos keladigan natijalarni ko'rsatish yoki guruhlarni tanlashni shart qilish uchun ishlatilishi mumkin.

Imtihonlarda bitta fan bo'yicha bir nechta yomon baho olgan guruhlarni ko'rsatadigan so'rovni tuzamiz:

Kelajakda, misol tariqasida, biz "Session" ma'lumotlar bazasi bilan emas, balki ma'lum bir bank filiallaridagi hisoblar to'g'risidagi ma'lumotlarni o'z ichiga olgan F munosabatini saqlaydigan bitta F jadvalidan iborat "Bank" ma'lumotlar bazasi bilan ishlaymiz:

F = (N, To'liq nomi, filiali, ochilish sanasi, yopilish sanasi, balans); Q = (filial, shahar);

chunki shu asosda agregat funktsiyalar va guruhlash bilan ishlashni yanada aniqroq tasvirlash mumkin.

Misol uchun, biz bank hisoblarining umumiy qoldig'ini topmoqchimiz deylik. Har bir filial uchun jadvaldan SUM(Balans) ni tanlab, ularning har biri uchun alohida so'rov qilishingiz mumkin. GROUP BY esa barchasini bitta buyruqda joylashtirish imkonini beradi:

Filialni tanlang, SUM(Qolgan);

GROUP BY amal qiladi agregat funktsiyalari Filial maydoni qiymati yordamida aniqlangan har bir guruh uchun mustaqil ravishda. Guruh bir xil Branch maydoni qiymatiga ega bo'lgan qatorlardan iborat va

SQL umumiy guruh qiymatlarini hisoblash imkonini beruvchi qo'shimcha funktsiyalarni qo'shdi. Agregat funktsiyalarni qo'llash uchun dastlabki guruhlash operatsiyasi qabul qilinadi. Guruhlash operatsiyasining mohiyati nimada? Guruhlashda munosabatlarning barcha kortejlari to'plami guruhlarga bo'linadi, ularda guruhlash ro'yxatida ko'rsatilgan bir xil atribut qiymatlariga ega bo'lgan kortejlar yig'iladi.

Masalan, R1 munosabatini Disiplin ustunining qiymati bo'yicha guruhlaymiz. Biz 4 ta guruh olamiz, ular uchun biz ba'zi bir guruh qiymatlarini hisoblashimiz mumkin, masalan, guruhdagi kortejlar soni, Skor ustunining maksimal yoki minimal qiymati.

Bu agregat funktsiyalar yordamida amalga oshiriladi. Agregat funktsiyalari butun jadval guruhi uchun bitta qiymatni hisoblab chiqadi. Ushbu funktsiyalar ro'yxati 5.7-jadvalda keltirilgan.

5.7-jadval.Agregat funktsiyalari

R1
To'liq ism Intizom Baho
1-guruh Petrov F.I. Ma'lumotlar bazasi
Sidorov K.A. Ma'lumotlar bazasi
Mironov A.V. Ma'lumotlar bazasi
Stepanova K.E. Ma'lumotlar bazasi
Krilova T.S. Ma'lumotlar bazasi
Vladimirov V.A. Ma'lumotlar bazasi
2-guruh Sidorov K.A. Axborot nazariyasi
Stepanova K.E. Axborot nazariyasi
Krilova T.S. Axborot nazariyasi
Mironov A.V. Axborot nazariyasi Null
3-guruh Trofimov P.A. Tarmoqlar va telekommunikatsiyalar
Ivanova E.A. Tarmoqlar va telekommunikatsiyalar
Utkina N.V. Tarmoqlar va telekommunikatsiyalar
4-guruh Vladimirov V.A. Ingliz tili
Trofimov P.A. Ingliz tili
Ivanova E.A. Ingliz tili
Petrov F.I. Ingliz tili i

Yig'ish funktsiyalari SELECT iborasidagi maydon nomlariga o'xshab qo'llaniladi, bitta istisno: ular argument sifatida maydon nomini oladi. SUM va AVG funksiyalari bilan faqat raqamli maydonlardan foydalanish mumkin. COUNT, MAX va MIN funksiyalari bilan ham son, ham belgilar maydonlaridan foydalanish mumkin. Belgilar maydonlari bilan foydalanilganda, MAX va MIN ularni ekvivalent ASCII kodiga tarjima qiladi va ularni alifbo tartibida qayta ishlaydi. Ba'zi DBMSlar ichki o'rnatilgan agregatlardan foydalanishga ruxsat beradi, ammo bu barcha oqibatlarga olib keladigan ANSI standartidan og'ishdir.



Masalan, har bir fan bo'yicha imtihon topshirgan talabalar sonini hisoblashingiz mumkin. Buning uchun siz "Intizom" maydoni bo'yicha guruhlangan so'rovni bajarishingiz kerak va natijada ushbu fan bo'yicha fan nomi va guruhdagi qatorlar sonini ko'rsatishingiz kerak. COUNT funktsiyasiga argument sifatida * belgisidan foydalanish guruhdagi barcha qatorlarni hisoblashni anglatadi.

SELECT R1.Intizom. COUNT(*)

R1 intizomi bo'yicha GURUHLASH

Natija:

Agar biz biron bir fan bo'yicha imtihondan o'tgan odamlar sonini hisoblamoqchi bo'lsak, guruhlashdan oldin noaniq qiymatlarni asl nisbatdan chiqarib tashlashimiz kerak. Bunday holda, so'rov quyidagicha ko'rinadi:

SELECT R1.Intizom. COUNT(*)

R1 dan R1.

Baholash NULL EMAS

Rl.Intizom bo'yicha GURUH

Biz natijaga erishamiz:

Bunday holda, talaba bilan chiziq

Mironov A, V. Axborot nazariyasi Null

guruhlashdan oldin kortejlar to‘plamiga kiritilmaydi, shuning uchun “Axborot nazariyasi” fanidan guruhdagi kortejlar soni 1 ta kam bo‘ladi.

Agregat funktsiyalardan oldindan guruhlash operatsiyasisiz ham foydalanishingiz mumkin, bu holda butun munosabat bitta guruh sifatida ko'rib chiqiladi va bu guruh uchun har bir guruh uchun bitta qiymatni hisoblashingiz mumkin.



"Session" ma'lumotlar bazasiga qaytadan (Rl, R2, R3 jadvallari) murojaat qilib, biz muvaffaqiyatli o'tgan imtihonlar sonini topamiz:

QAYERDA Bal > 2:

Bu, albatta, maydonni tanlashdan farq qiladi, chunki jadvalda qancha qator bo'lishidan qat'i nazar, u har doim bitta qiymatni qaytaradi. Funktsiyalarni yig'ish uchun argumentlar alohida jadval ustunlari bo'lishi mumkin. Ammo, masalan, guruhdagi ma'lum bir ustunning aniq qiymatlari sonini hisoblash uchun siz ustun nomi bilan birga DISTINCT kalit so'zidan foydalanishingiz kerak. Keling, har bir fan bo'yicha olingan turli baholar sonini hisoblaylik:

SELECT Rl. Discipline.

COUNT(DISTINCT R1.Score)

R1.Baholash NULL EMAS

Rl.Intizom bo'yicha GURUH

Natija:

Natija guruhlash maydoni qiymatini va bir nechta agregat funktsiyalarni o'z ichiga olishi mumkin va guruhlash shartlari bir nechta maydonlardan foydalanishi mumkin. Bunday holda, guruhlar belgilangan guruhlash maydonlari to'plamiga muvofiq tuziladi. Agregat funksiya operatsiyalari bir nechta manba jadvallarini birlashtirish uchun qo'llanilishi mumkin. Masalan, savolni qo'yaylik: har bir guruh va har bir fan uchun imtihondan muvaffaqiyatli o'tgan talabalar sonini va fan bo'yicha o'rtacha ballni aniqlang.

R2.Guruhni tanlang. R1.Intizom. COUNT(*), AVP (baholash)

QAYERDA Rl.toʻliq ism = R2.toʻliq ism VA

Rl.Evaluation NULL EMAS VA

Rl.Rating > 2

R2 BO'YICHA GURUHLASH. Rl.Intizom

Natija:

Biz WHERE bandida jamlash funksiyalaridan foydalana olmaymiz, chunki predikatlar bitta satr, agregat funksiyalar esa qatorlar guruhlari bo‘yicha baholanadi.

GROUP BY bandi ma'lum bir sohadagi qiymatlar to'plamini boshqa maydon nuqtai nazaridan belgilashga va kichik to'plamga agregat funksiyasini qo'llashga imkon beradi. Bu bitta SELECT bandida maydonlarni birlashtirish va funktsiyalarni yig'ish imkonini beradi. Agregat funktsiyalardan SELECT qatori natijalarini chiqarish ifodasida ham, hosil bo'lgan HAVING guruhlarini qayta ishlash sharti ifodasida ham foydalanish mumkin. Bunday holda, har bir agregat funksiya har bir tanlangan guruh uchun hisoblanadi. Agregat funktsiyalarni hisoblash natijasida olingan qiymatlar tegishli natijalarni ko'rsatish yoki guruhlarni tanlashni shart qilish uchun ishlatilishi mumkin.

Imtihonlarda bitta fan bo'yicha bir nechta yomon baho olgan guruhlarni ko'rsatadigan so'rovni tuzamiz:

R2.Guruhni tanlang

QAYERDA Rl.toʻliq ism = R2.toʻliq ism VA

Rl.Rating = 2

R2 BO'YICHA GURUHLASH. R1.Intizom

Hisob (*)> 1

Kelajakda, misol tariqasida, biz "Session" ma'lumotlar bazasi bilan emas, balki ma'lum bir bank filiallaridagi hisoblar to'g'risidagi ma'lumotlarni o'z ichiga olgan F munosabatini saqlaydigan bitta F jadvalidan iborat "Bank" ma'lumotlar bazasi bilan ishlaymiz:

F= ;

Q = (filial, shahar);

chunki shu asosda agregat funktsiyalar va guruhlash bilan ishlashni yanada aniqroq tasvirlash mumkin.

Misol uchun, biz bank hisoblarining umumiy qoldig'ini topmoqchimiz deylik. Har bir filial uchun jadvaldan SUM(Balans) ni tanlab, ularning har biri uchun alohida so'rov qilishingiz mumkin. GROUP BY esa barchasini bitta buyruqda joylashtirish imkonini beradi:

SELECT filiali, SUM

Filiallar bo‘yicha GURUH:

GROUP BY Filial maydoni qiymati bilan aniqlangan har bir guruh uchun mustaqil ravishda yig‘ish funksiyalarini qo‘llaydi. Guruh bir xil Filial maydoni qiymatiga ega bo'lgan qatorlardan iborat bo'lib, har bir bunday guruh uchun SUM funksiyasi alohida qo'llaniladi, ya'ni jami hisob balansi har bir filial uchun alohida hisoblanadi. GROUP BY qo'llaniladigan maydonning qiymati, ta'rifi bo'yicha, har bir chiqish guruhi uchun faqat bitta qiymatga ega, xuddi agregat funktsiya natijasi kabi. Shuning uchun biz bitta so'rovda agregat va maydonni birlashtira olamiz. Bir nechta maydonlar bilan GROUP BY dan ham foydalanishingiz mumkin.

Aytaylik, biz faqat 5000 AQSh dollaridan oshgan jami hisob qoldiqlarini ko'rishni xohlaymiz. 5 000 dollardan ortiq umumiy qoldiqlarni ko'rish uchun HAVING bandidan foydalanishingiz kerak. HAVING bandi, WHERE bandi alohida satrlar uchun qilgani kabi, ma'lum guruhlarni chiqishdan olib tashlash uchun ishlatiladigan mezonlarni belgilaydi.

To'g'ri buyruq quyidagicha bo'ladi:

Filialni tanlang, SUM (qolgan)

Filiallar bo‘yicha GURUHLASH

HAVING SUM(Qolgan) > 5000;

HAVING bandidagi argumentlar GROUP BY dan foydalanadigan SELECT bandidagi kabi qoidalarga amal qiladi. Ular har bir chiqish guruhi uchun bitta qiymatga ega bo'lishi kerak.

Quyidagi buyruq taqiqlanadi:

Filialni tanlang.SUM(Qolgan)

F GURUHDAN Filial bo'yicha

HAVINGOpenDate = 27.12.1999;

OpenDate maydonini HAVING bandida ishlatib bo'lmaydi, chunki u har bir chiqish guruhida bir nechta qiymatga ega bo'lishi mumkin. Bunday vaziyatdan qochish uchun HAVING bandi faqat GROUP BY tomonidan tanlangan agregatlar va maydonlarga murojaat qilishi kerak. Yuqoridagi so'rovni bajarishning to'g'ri yo'li bor:

Filialni tanlang, SUM (qolgan)

WHEREOpenDate = "12/27/1999"

Filiallar bo'yicha GURUH;

Bu so'rovning ma'nosi quyidagicha: 1999 yil 27 dekabrda ochilgan hisobvaraqlarning har bir filiali bo'yicha qoldiqlar summasini toping.

Yuqorida aytib o'tilganidek, HAVING har bir chiqish guruhi uchun faqat bitta qiymatga ega bo'lgan argumentlarni qabul qilishi mumkin. Amalda, agregat funktsiyalariga havolalar eng keng tarqalgan, ammo GROUP BY yordamida tanlangan maydonlar ham amal qiladi. Misol uchun, biz Sankt-Peterburg, Pskov va Uryupinskdagi filiallarning hisobvaraqlaridagi umumiy qoldiqlarni ko'rmoqchimiz:

Filialni tanlang.SUM(Qolgan)

QAYERDA F.Branch = Q.Branch

Filiallar bo‘yicha GURUHLASH

HAVING filiali ("Sankt-Peterburg". "Pskov". "Uryupinsk");

Shuning uchun, HAVING bandining tanlash bandiga kiritilgan predikat arifmetik ifodalarida faqat GROUP BY bandidagi guruhlash ustunlari sifatida ko'rsatilgan ustunlarning spetsifikatsiyalari to'g'ridan-to'g'ri ishlatilishi mumkin. Qolgan ustunlar faqat COUNT, SUM, AVG, MIN va MAX agregat funktsiyalarining spetsifikatsiyalari doirasida ko'rsatilishi mumkin, bu holda ular butun qatorlar guruhi uchun ba'zi jami qiymatlarni hisoblab chiqadi. Vaziyat HAVING bo'limining tanlash sharti predikatlariga kiritilgan pastki so'rovlar bilan o'xshash: agar pastki so'rov joriy guruhning xarakteristikasidan foydalansa, u holda uni faqat guruhlash ustunlariga murojaat qilish orqali ko'rsatish mumkin.

HAVING bandining natijasi faqat qidiruv sharti TRUE deb baholanadigan qatorlar guruhlarini o'z ichiga olgan guruhlangan jadvaldir. Xususan, agar GROUP BY ni o'z ichiga olmagan jadval ifodasida HAVING bandi mavjud bo'lsa, u holda uni bajarish natijasi bo'sh jadval yoki jadval ifodasining oldingi bo'limlarini bajarish natijasi bo'lib, bitta deb hisoblanadi. ustunlarni guruhlashsiz guruhlash.

Ichki SQL so'rovlari

Endi "Session" ma'lumotlar bazasiga qaytaylik va uning ichki so'rovlardan foydalanish misolini ko'rib chiqaylik.

SQL yordamida siz so'rovlarni bir-birining ichiga joylashtirishingiz mumkin. Odatda, ichki so'rov tashqi so'rovning predikatida (QAYER yoki HAVING bandida) sinovdan o'tgan qiymatni hosil qiladi, uning haqiqiy yoki noto'g'ri ekanligini aniqlash uchun. Quyi so'rov bilan birgalikda siz quyi so'rovning chiqishi bo'sh bo'lmasa, rostni qaytaradigan EXISTS predikatidan foydalanishingiz mumkin.

Tanlangan operatorning boshqa xususiyatlari, masalan, guruhlash bilan birlashganda, quyi so'rov istalgan natijaga erishish uchun kuchli vositadir. SELECT iborasining FROM qismida, agar so'rovni shakllantirishda bizga ma'lum munosabatning bir nechta misollari kerak bo'lsa, jadval nomlariga sinonimlarni qo'llashga ruxsat beriladi. Sinonimlar AS kalit so'zi yordamida ko'rsatiladi, uni butunlay chiqarib tashlash mumkin. Shunday qilib, FROM qismi quyidagicha ko'rinishi mumkin:

Rl AS A, Rl AS B

Rl A. Rl B dan:

ikkala ifoda ham ekvivalent va R1-jadvalning ikkita misoliga SELECT operatorining qo'llanilishi hisoblanadi.

Misol uchun, keling, SQL da "Session" ma'lumotlar bazasiga ba'zi so'rovlar qanday ko'rinishini ko'rsatamiz:

  • Barcha kerakli imtihonlardan o'tganlar ro'yxati.

WHERE Bal > 2

HAVING COUNT(*) = (COUNT TANI(*)

QAYERDA R2.Group=R3.Group VA toʻliq ismia.toʻliq ismi)

Bu erda o'rnatilgan so'rov talabaning sinfidagi har bir talaba topshirishi kerak bo'lgan imtihonlarning umumiy sonini aniqlaydi va bu raqamni talaba topshirgan imtihonlar soni bilan taqqoslaydi.

  • Ma'lumotlar bazasi imtihonini topshirishi kerak bo'lgan, ammo hali topshirilmaganlar ro'yxati.

SELESTFIO

QAYERDA R2.Fpynna=R3.Group VA Discipline = "DB" VA YO'Q

(To'liq ismni Rl dan TANlang QERDA to'liq ism=a.to'liq ism VA Disiplin = "DB")

EXISTS (SubQuery) predikati SubQuery pastki so‘rovi bo‘sh bo‘lmaganda rost bo‘ladi, ya’ni u kamida bitta kortejni o‘z ichiga oladi, aks holda EXISTS predikati noto‘g‘ri bo‘ladi.

NOT EXISTS predikati faqat pastki so'rov bo'sh bo'lganda to'g'ri bo'ladi.

E'tibor bering, qanday qilib o'rnatilgan so'rov bilan MAVJUD YO'Q , munosabatlardagi farq operatsiyasidan qochish imkonini beradi. Misol uchun, "barchasi" so'zi bilan so'rovni shakllantirish, xuddi qo'shaloq salbiy bilan amalga oshirilishi mumkin. Keling, alohida etkazib beruvchilar tomonidan alohida qismlarni etkazib berishni modellashtiradigan ma'lumotlar bazasi misolini ko'rib chiqaylik, u diagramma bilan bitta SP aloqasi "Etkazib beruvchilar-qismlar" bilan ifodalanadi.

SP (Etkazib beruvchi_raqami. Qism_raqami) P (Qism_raqami. Nomi)

So'rovga javob shunday tuzilgan: "Barcha qismlarni etkazib beruvchilarni toping."

MAVJUD YERDA SP SP1DAN BOSHQA SOVTOV_RAQAMORI TANLANING

(Qism_raqamni tanlang

YO'Q QERDAN P

(SP SP2 DAN * TANLANG

WHERE SP2.supplier_number=SP1.supplier_number VA

sp2.qism_raqami = P.qism_raqami)):

Darhaqiqat, biz ushbu so'rovni quyidagicha qayta tuzdik: "Etkazib beruvchilarni topingki, ular etkazib bermaydigan qismi qolmaydi." Shuni ta'kidlash kerakki, ushbu so'rov quyi so'rovga ega agregat funktsiyalar orqali ham amalga oshirilishi mumkin:

DISTINCT Sotuvchi_raqamini TANlang

Sotuvchi_raqami boʻyicha GURUHLASH

HAVING CounKDISTINCT qism_raqami) =

(Tanlash soni (qism_raqam)

SQL92 standarti taqqoslash operatorlarini HAMMA va HAMMA kalit so'zlardan foydalangan holda bir nechta taqqoslashlarga kengaytiradi. Ushbu kengaytma ma'lum bir ustunning qiymatini pastki so'rov tomonidan qaytarilgan ma'lumotlar ustuni bilan taqqoslashda ishlatiladi.

Har qanday taqqoslash predikatida joylashgan ANY kalit so'zi pastki so'rovdagi kamida bitta qiymat uchun taqqoslash predikati rost bo'lsa, predikat rost bo'lishini anglatadi. ALL kalit so'zi quyi so'rovdagi barcha qatorlar bilan solishtirganda taqqoslash predikati to'g'ri bo'lishini talab qiladi.

Masalan, barcha imtihonlarni "yaxshi" dan past bo'lmagan baho bilan topshirgan talabalarni topaylik. Biz bir xil "Session" ma'lumotlar bazasi bilan ishlaymiz, lekin unga semestr davomida laboratoriya ishlarini topshirishni tavsiflovchi yana bir R4 munosabatini qo'shamiz:

R 1 = (Ism, intizom, daraja);

R 2 = (to'liq ism, guruh);

R 3 = (Guruhlar, intizom)

R 4 = (Ism, fan, laboratoriya ishining raqami, baho);

R1 ni tanlang.To'liq ism R1 dan Bu erda 4 > = Hammasi (Rl.Rating-ni tanlang

Bu erda R1.Full name = R11.Full name)

Keling, yana bir misolni ko'rib chiqaylik:

Ushbu fan bo'yicha topshirgan laboratoriya ishlarida imtihon bahosi kamida bittadan kam bo'lmagan talabalarni tanlang:

R1.Name-ni tanlang

R1 dan R1.Rating>= HAR QANDAY (R4.Ratingni tanlang

Bu erda Rl.Discipline = R4. Intizom VA R1.To'liq ism = R4.To'liq ism)

SQL tashqi birlashmalari

SQL2 standarti shartli ulanish tushunchasini kengaytirdi. SQL1 standartida munosabatlarni birlashtirishda faqat SELECT operatorining WHERE qismida ko'rsatilgan shartlardan foydalanilgan va bu holda faqat ushbu shartlar aniqlangan va haqiqiy bo'lgan ko'rsatilgan shartlar bilan birlashtirilgan dastlabki munosabatlar kortejlari ishlatilgan. , natijaviy munosabatga kiritilgan. Biroq, aslida, ko'pincha jadvallarni shunday birlashtirish kerak bo'ladiki, natija birinchi jadvaldagi barcha qatorlarni o'z ichiga oladi va ikkinchi jadvaldagi birlashma sharti bajarilmagan qatorlar o'rniga natija tugaydi. aniqlanmagan qiymatlar bilan. Yoki aksincha, o'ngdagi (ikkinchi) jadvalning barcha satrlari kiritiladi va birinchi jadvaldagi satrlarning etishmayotgan qismlari aniqlanmagan qiymatlar bilan to'ldiriladi. Bunday birlashmalar SQL1 standarti tomonidan aniqlangan birlashmalardan farqli o'laroq, tashqi birlashmalar deb ataldi va ular ichki birlashmalar deb nomlana boshladi.

Umuman olganda, SQL2 standartidagi FROM qismining sintaksisi quyidagicha:

FROM<список исходных таблиц> |

< выражение естественного объединения > |

< выражение объединения >

< выражение перекрестного объединения > |

< выражение запроса на объединение >

<список исходных таблиц>::= <имя_таблицы_1>

[jadval_1 sinonim nomi] [...]

[,<имя_таблицы_п>[ <имя синонима таблицы_n> ] ]

<выражение естественного объединениям:: =

<имя_таблицы_1>TABIY (ICHKI | TO'LIQ | Chap | O'ng) QO'SHILING<имя_таблицы_2>

<выражение перекрестного объединениям: = <имя_таблицы_1>KROSS QO'SHILING<имя_таблицы_2>

<выражение запроса на объединением:=

<имя_таблицы_1>UNION QO'SHILING<имя_таблицы_2>

<выражение объединениям:= <имя_таблицы_1>( ICHKI |

TO'LIQ | CHAP | O'NG) QO'SHILING (ON sharti)<имя_таблицы_2>

Ushbu ta'riflarda INNER ichki birlashmani, LEFT chap birlashmani anglatadi, ya'ni natija 1-jadvalning barcha qatorlarini o'z ichiga oladi va natijada olingan kortejlarning 2-jadvalda tegishli qiymatlari bo'lmagan qismlari NULL bilan to'ldiriladi. (aniqlanmagan) qiymatlar. RIGHT kalit so'zi o'ng tashqi birikmani bildiradi va chap qo'shmadan farqli o'laroq, bu holda 2-jadvalning barcha qatorlari natijaviy munosabatga kiradi va 1-jadvalning etishmayotgan qismlari aniqlanmagan qiymatlar bilan to'ldiriladi.FULL kalit so'zi to'liq tashqi birikmani belgilaydi. qo'shilish: chap va o'ng. To'liq tashqi birlashma bilan ham o'ng, ham chap tashqi birlashmalar amalga oshiriladi va natijada paydo bo'lgan munosabat 1-jadvaldagi barcha qatorlarni o'z ichiga oladi, null bilan to'ldirilgan va 2-jadvaldagi barcha qatorlar, shuningdek, null bilan to'ldirilgan.

OUTER kalit so'zi tashqi ma'nosini bildiradi, lekin agar FULL, LEFT, RIGHT kalit so'zlari berilgan bo'lsa, u holda birlashma har doim tashqi hisoblanadi.

Keling, tashqi birikmalarni bajarish misollarini ko'rib chiqaylik. Keling, "Session" ma'lumotlar bazasiga qaytaylik. Keling, shunday munosabatni yarataylikki, unda barcha o'quvchilarning barcha imtihonlarda olgan barcha baholari turadi. Agar talaba ushbu imtihondan o'tmagan bo'lsa, unda baho o'rniga u noaniq qiymatga ega bo'ladi. Buning uchun Group atributidan foydalanib, R2 va R3 jadvallarini ketma-ket tabiiy ichki birikmasini bajaramiz va natijada olingan munosabatni chap tashqi tabiiy birikma bilan R1 jadvali bilan To‘liq nom va Disiplin ustunlari yordamida bog‘laymiz. Shu bilan birga, standart qavs strukturasidan foydalanishga imkon beradi, chunki birlashma natijasi SELECT iborasining FROM qismidagi argumentlardan biri bo'lishi mumkin.

SELECT Rl.Full name, R1.Discipline. Rl.Rating

FROM (R2 NATURAL INNER JOIN R3) LEFT JOIN Rl FOYDALANISH (Ism. Disiplin)

Natija:

To'liq ism Intizom Baho
Petrov F.I. Ma'lumotlar bazasi
Sidorov K.A. Ma'lumotlar bazasi 4
Mironov L.V. Ma'lumotlar bazasi
Stepanova K.E. Ma'lumotlar bazasi
Krilova T.S. Ma'lumotlar bazasi
Vladimirov V.A. Ma'lumotlar bazasi
Petrov F.I. Axborot nazariyasi Null
Sidorov K.A. Axborot nazariyasi
Mironov A.V. Axborot nazariyasi Null
Stepanova K.E. Axborot nazariyasi
Krilova T.S. Axborot nazariyasi
Vladimirov V.A. Axborot nazariyasi Null
Petrov F.I. Ingliz tili
Sidorov K.A. Ingliz tili Null
Mironov A.V. Ingliz tili Null
Stepanova K.E. Ingliz tili Null
Krilova T.S. Ingliz tili Null
Vladimirov V.A. Ingliz tili
Trofimov P.A. Tarmoqlar va telekommunikatsiyalar
Ivanova E.A. Tarmoqlar va telekommunikatsiyalar

Keling, yana bir misolni ko'rib chiqaylik, buning uchun biz "Kutubxona" ma'lumotlar bazasini olamiz. U uchta munosabatdan iborat; bu erda atribut nomlari lotin harflarida yozilgan bo'lib, bu ko'pchilik tijorat ma'lumotlar bazasida zarur.

KITOBLAR(ISBN, TITL. AVTOR. COAUTOR. YEARJZD, PAGES)

READER(NUM_READER. NAME_READER, MANZIL. HOOM_PHONE. WORK_PHONE. BIRTH_DAY)

O'RNAK (INV, ISBN, YES_NO. NUM_READER. DATE_IN. DATE_DUT)

Bu erda KITOBLAR jadvali kutubxonadagi barcha kitoblarni tavsiflaydi, u quyidagi atributlarga ega:

  • ISBN - kitob uchun noyob shifr;
  • TITL - kitobning nomi;
  • AVTOR - muallifning familiyasi;
  • COAUTOR - hammuallifning familiyasi;
  • YEARIZD - nashr etilgan yili;
  • PAGES - sahifalar soni.

READER jadvali kutubxonaning barcha o'quvchilari haqidagi ma'lumotlarni saqlaydi va u quyidagi atributlarni o'z ichiga oladi:

  • NUM_READER - kutubxona kartasining noyob raqami;
  • NAME_READER - o'quvchining familiyasi va bosh harflari;
  • ADRESS - o'quvchi manzili;
  • HOOM_PHONE - uy telefon raqami;
  • WORK_PHONE - ish telefon raqami;
  • BIRTH_DAY - o'quvchining tug'ilgan sanasi.

EXEMPLARE jadvali barcha kitoblarning barcha nusxalarining joriy holati haqidagi ma'lumotlarni o'z ichiga oladi. U quyidagi ustunlarni o'z ichiga oladi:

  • INV - kitob nusxasining yagona inventar raqami;
  • ISBN - kitob shifridir, u qanday kitob ekanligini aniqlaydi va birinchi jadvaldagi ma'lumotlarga ishora qiladi;
  • YES_NO - hozirgi vaqtda kutubxonada ushbu misolning mavjudligi yoki yo'qligi belgisi;
  • NUM_READER - agar kitob o'quvchiga berilgan bo'lsa kutubxona kartasi raqami, aks holda Null;
  • DATE_IN - agar kitob o'quvchida bo'lsa, bu kitob o'quvchiga berilgan sana; DATE_OUT - o'quvchi kitobni kutubxonaga qaytarishi kerak bo'lgan sana.

Keling, har bir o'quvchi uchun kitoblar ro'yxatini aniqlaymiz; agar o'quvchida kitob bo'lmasa, kitob nusxasi raqami NULL bo'ladi. Ushbu qidiruvni amalga oshirish uchun biz chap tashqi birikmadan foydalanishimiz kerak, ya'ni biz READER jadvalidagi barcha satrlarni olib, ularni EXEMPLARE jadvalidagi qatorlar bilan birlashtiramiz, agar ikkinchi jadvalda tegishli kutubxona karta raqamiga ega bo'lgan qator bo'lmasa. , keyin hosil bo'lgan munosabat qatorida EXEMPLARE.INV atributi aniqlanmagan NULL qiymatga ega bo'ladi:

READER.NAME_READER, EXEMPLARE.INV NI TANLASH

READERNING O‘ng tomonidan EXEMPLARE ON READER.NUM_READER=EXEMPLARE.NUM_READER.

Yuqorida aytib o'tganimizdek, tashqi birlashma operatsiyasidan FROM bandida manbalarni shakllantirish uchun foydalanish mumkin, shuning uchun, masalan, quyidagi so'rov matni qabul qilinadi:

FROM (CHAPDAGI KITOBLAR QO'SHILISh NAMUNI)

CHAPGA QO'SHILMA (READER NATURAL JOIN NAMALI)

Shu bilan birga, kitobxonlar qo'lida birorta ham nusxasi bo'lmagan kitoblar uchun kutubxona kartasi raqamining qiymati, kitobni yig'ish va qaytarish sanalari noaniq bo'ladi.

SQL2 standartida aniqlangan oʻzaro bogʻlanish kengaytirilgan Dekart mahsulot operatsiyasiga mos keladi, yaʼni birinchi jadvalning har bir satri ikkinchi jadvalning har bir satriga birlashtirilgan ikkita jadval oʻrtasidagi qoʻshilish operatsiyasi.

Operatsiya birlashish talabi algebrada to'plam-nazariy birlashma operatsiyasiga teng. Bunda dastlabki munosabatlar sxemalarining ekvivalentligi talabi saqlanib qoladi. Qo'shilish so'rovi quyidagi sxema bo'yicha amalga oshiriladi:

SELECT - so'rov

UNION SELECT - so'rov

UNION SELECT - so'rov

Birlashtirish operatsiyasida ishtirok etuvchi barcha so'rovlar ifodalarni, ya'ni hisoblangan maydonlarni o'z ichiga olmaydi.

Masalan, siz "Idiot" yoki "Jinoyat va jazo" kitobini ushlab turgan kitobxonlar ro'yxatini ko'rsatishingiz kerak. So'rov shunday ko'rinadi:

READERNI TANLASH. NAME_READER

O'QUVCHIDAN, NAMUNA.KITOBLARDAN

BOOKS.TITLE = "Idiot"!}

READER.NAME_READERNI TANGLASH

O'QITUVCHIDAN, NAMUNA, KITOBLARDAN

WHERE EXEMPLARE.NUM_READER= READER.NUM_READER VA

EXEMPLRE.ISBN = BOOKS.ISBN VA

BOOKS.TITLE = "Jinoyat va jazo"!}

Odatiy bo'lib, qo'shilish so'rovini bajarayotganda, ikki nusxadagi kortejlar har doim chiqarib tashlanadi. Shuning uchun, agar ikkala kitob ham qo'lida bo'lgan kitobxonlar bo'lsa, ular hali ham olingan ro'yxatda faqat bir marta paydo bo'ladi.

Qo'shilish so'rovi har qanday miqdordagi asl so'rovlarga qo'shilishi mumkin.

Shunday qilib, oldingi so'rovga qo'llarida "Qal'a" kitobini ushlab turgan ko'proq o'quvchilarni qo'shishingiz mumkin:

READERNI TANLASH. NAME_READER

O'QUVCHIDAN. NAMUNA, KITOBLAR

WHERE EXEMPLARE.NUM_READER= READER.NUM_READER VA .

EXEMPLRE.ISBN = BOOKS.ISBN VA

BOOKS.TITLE = "Qal'a"!}

Manba munosabatlaridan barcha satrlarni saqlashingiz kerak bo'lgan holatda, qo'shilish operatsiyasida ALL kalit so'zidan foydalanishingiz kerak. Agar ikki nusxadagi kortejlar saqlansa, qo'shilish so'rovini bajarish jarayoni quyidagicha ko'rinadi:

SELECT - so'rov

SELECT - so'rov

SELECT - so'rov

Shu bilan birga, xuddi shunday natijani dastlabki so'rovning birinchi qismining WHERE bandini oddiygina o'zgartirish, mahalliy shartlarni mantiqiy OR operatsiyasi bilan bog'lash va takroriy kortejlarni yo'q qilish orqali olish mumkin.

DISTINCT READER.NAME_READERNI TANLASH

O'QUVCHIDAN. NAMUNA.KITOBLAR

WHERE EXEMPLARE.NUM_READER= READER.NUM_READER VA

EXEMPLRE.ISBN = BOOKS.ISBN VA

BOOKS.TITLE = "Idiot" OR!}

BOOKS.TITLE = "Jinoyat va jazo" OR!}

BOOKS.TITLE = "Qal'a"!}

UNION operatsiyasidagi asl so‘rovlarning hech birida ORDER BY bandi bo‘lmasligi kerak, lekin birlashma natijasi oxirgi asl SELECT so‘rovi matnidan keyin buyurtma ustunlari ro‘yxatini ko‘rsatuvchi ORDER BY bandini yozish orqali buyurtma berish mumkin.

Kirish

SQL (Tuzilgan so'rovlar tili) - Strukturaviy so'rovlar tili - relyatsion ma'lumotlar bazalari bilan ishlash uchun standart so'rovlar tili.

SQL tilining birinchi xalqaro standarti 1989 yilda qabul qilingan (bundan keyin uni SQL/89 yoki SQL1 deb ataymiz). Ba'zan SQL1 standarti ANSI/ISO standarti deb ham ataladi va bozorda mavjud bo'lgan DBMSlarning katta qismi ushbu standartni to'liq qo'llab-quvvatlaydi.

1992 yil oxirida SQL tilining yangi xalqaro standarti qabul qilindi (bundan buyon u SQL/92 yoki SQL2 deb nomlanadi). Va uning kamchiliklari yo'q emas, lekin ayni paytda u SQL/89 ga qaraganda sezilarli darajada aniqroq va to'liqroqdir. Hozirgi vaqtda ko'pchilik DBMS ishlab chiqaruvchilari o'z mahsulotlariga SQL2 standartiga ko'proq mos kelishi uchun o'zgartirishlar kiritmoqdalar.

SQL tilining oxirgi standarti 1996 yilda chiqarilgan. U SQL3 deb ataladi.

SQL-ni an'anaviy dasturlash tili sifatida to'liq tasniflash mumkin emas: unda an'anaviy dastur oqimini boshqarish operatorlari, turdagi deklaratsiya operatorlari va boshqalar mavjud emas, u faqat ma'lumotlar bazasida saqlanadigan ma'lumotlarga standart kirish operatorlari to'plamini o'z ichiga oladi. SQL bayonotlari C++, PL, COBOL va boshqalar kabi har qanday standart til bo'lishi mumkin bo'lgan asosiy dasturlash tiliga kiritilgan. Bundan tashqari, SQL operatorlari bevosita interaktiv tarzda bajarilishi mumkin.

1. SQL tuzilishi.

SQL quyidagi bo'limlarni o'z ichiga oladi:

1. Ma'lumotlarni aniqlash tili (DDL) operatorlari.

Operator Ma'nosi Harakat
JADVAL YARATISH Jadval yaratish Ma'lumotlar bazasida yangi jadval yaratadi
JADVALNI QILISH Jadvalni o'chirish Jadvalni ma'lumotlar bazasidan olib tashlaydi
JADVAL ALTER Jadvalni tahrirlash Mavjud jadvalning tuzilishini o'zgartiradi
KOʻRISH YARATISH Ko'rinish yaratish Virtual jadval yaratadi, ya'ni. aslida mavjud bo'lmagan, lekin ushbu operator yordamida modellashtirilgan jadval.
KOʻRISHNI ALTER Ko'rinishni o'zgartirish Virtual jadvalning tuzilishi yoki mazmunini o'zgartiradi
KO'RISH Ko'rinishni o'chirish Virtual jadval tavsifini o'chiradi. Jadvalning o'zini o'chirishning hojati yo'q, chunki... u aslida mavjud emas.
INDEKS YARATING Indeks yaratish Ma'lumotlarga tezroq kirishni ta'minlaydigan indeks deb ataladigan maxsus jismoniy tuzilmani yaratadi
DROP INDEX Indeksni olib tashlang Yaratilgan tuzilmani o'chiradi
SINONIM YARATING Sinonim yaratish
TO'CHIRISH SINONIMI Sinonimni olib tashlang

2. Ma'lumotlarni manipulyatsiya qilish tili (DML) Ma'lumotlarni manipulyatsiya qilish operatorlari



3. Ma'lumotlar so'rovi tili (DQL)

4. Tranzaksiyani boshqarish vositalari (DCL)

5. Ma'lumotlarni boshqarish vositalari (DDL)

Dasturli SQL

2. Ma’lumotlar turlari

SQL/89 da quyidagi ma'lumotlar turlari qo'llab-quvvatlanadi: CHARACTER, NUMERIC, DECIMAL, INTEGER, SMALLINT, FLOAT, REAL, DOUBLE PRECISION. Bu ma'lumotlar turlari belgilar qatori, aniq son va taxminiy son turlariga bo'linadi.

SQL92 standarti quyidagi ma'lumotlar turlarini qo'shadi:

VARCHAR(n) - o'zgaruvchan uzunlikdagi belgilar qatorlari

NCHAR(N) – doimiy uzunlikdagi mahalliylashtirilgan belgilar qatorlari

NCHAR VARYING(n) - o'zgaruvchan uzunlikdagi lokalizatsiya qilingan belgilar qatorlari

BIT(n) - doimiy uzunlikdagi bit qatori

BIT VARYING(n) - o'zgaruvchan uzunlikdagi bit qatori

DATE kalendar sanasi

TIMESTAMP (aniqlik) sana va vaqt

INTERVAL vaqt oralig'i

3. SELECT bayonoti

Select barcha relyatsion algebra amallarini almashtiruvchi yagona qidiruv operatoridir.

SELECT operatorining sintaksis diagrammasi 1-rasmda ko'rsatilgan


Bu erda ALL kalit so'zi hosil bo'lgan qatorlar to'plami so'rov shartlarini qondiradigan barcha qatorlarni o'z ichiga olishini bildiradi. DISTINCT kalit so'zi natijalar to'plamiga faqat alohida qatorlar kiritilganligini bildiradi, ya'ni. takroriy natija qatorlari to'plamga kiritilmagan. Agar kalit so'z mavjud bo'lmasa, bu holat ALL kalit so'zining mavjudligi sifatida talqin qilinadi.

* belgisi natijalar to'plami so'rovning manba jadvallaridagi barcha ustunlarni o'z ichiga olishini bildiradi.

FROM qismi so'rovning manba munosabatlari (jadvallari) ro'yxatini belgilaydi.

WHERE qismida natija muddatini tanlash shartlari yoki manba jadvallarining kortejlarini birlashtirish shartlari ko'rsatilgan.

GROUP BY qismi guruhlash maydonlari ro‘yxatini belgilaydi.

HAVING qismi har bir guruhga yuklangan predikat shartlarini belgilaydi.

ORDER BY qismi natijani buyurtma qilish uchun maydonlar ro'yxatini belgilaydi.

WHERE qismi uchun shartlarni ifodalashda quyidagi predikatlardan foydalanish mumkin:

· LIKE va NO LIKE qolipi bilan taqqoslash predikati

· EXIST va NO EXIST predikati.

taqqoslash predikatlari { =, <>, >,<,>=,<=,}. Taqqoslash predikatlarining sintaktik diagrammasi 2-rasmda keltirilgan


predikat IN - to'plamga kiritilgan / to'plamga kiritilmagan.

IN yoki NO IN predikati sinovdan o'tayotgan ifodani pastki so'rov bilan solishtirish uchun ham ishlatilishi mumkin; bu holda sintaksis diagrammasi rasmda ko'rsatilgan. 5.

IN predikati joriy kortej uchun tekshirilayotgan ifodada ko'rsatilgan atributning qiymati tegishli pastki so'rovni bajarish natijasida olingan yoki qiymatlar ro'yxatidagi qiymatlar to'plamining kamida bittasiga mos kelganda to'g'ri bo'ladi. Aksincha, NOT IN predikati joriy kortejdagi belgilangan atributning qiymati ichki quyi so‘rov yoki berilgan qiymatlar ro‘yxati bilan belgilangan qiymatlar to‘plamiga mos kelmasagina to‘g‘ri bo‘ladi.


LIKE predikati - o'z ichiga oladi (o'xshash)

Naqsh har qanday bitta belgini ifodalash uchun _ pastki chiziqni o'z ichiga olishi mumkin;

% foiz belgisi - har qanday ixtiyoriy belgilar ketma-ketligini belgilash uchun.

Joriy kortejdagi ustun nomi bilan ko‘rsatilgan atribut qiymati belgilangan qiymatni o‘z ichiga olgan bo‘lsa, LIKE predikati rost bo‘ladi.<шаблон>.

Joriy kortejdagi atribut qiymati berilgan qiymatni o'z ichiga olmasa, NO LIKE predikati to'g'ri bo'ladi<шаблон>.

· predikat NULL - noma'lum, aniqlanmagan

Predikatning sintaktik diagrammasi rasmda ko'rsatilgan. 7.


Ilgari muhokama qilingan barcha predikatlar qidiruv sharoitida ishlatilishi mumkin.

Guruhlashtirishga kirish so'zimizni bir lahzaga chetga surib, keling, SELECT iborasining dastlabki uchta qatorini batafsil ko'rib chiqamiz:

TANLASH- DBMSga ushbu buyruq so'rov ekanligini bildiruvchi kalit so'z. Barcha so'rovlar bu so'zdan keyin bo'sh joy bilan boshlanadi. Undan keyin namuna olish usuli qo'llanilishi mumkin - dublikatlar olib tashlangan ( AYRIQ) yoki o'chirmasdan ( HAMMA, sukut bo'yicha nazarda tutilgan). Undan so'ng so'rov jadvallardan tanlaydigan vergul bilan ajratilgan ustunlar ro'yxati yoki "belgi" bilan birga keladi. * ’ butun qatorni tanlash uchun. Bu erda ko'rsatilmagan ustunlar natijalar ma'lumotlar to'plamiga kiritilmaydi. Bu, albatta, ular o'chiriladi yoki ularning ma'lumotlari jadvallardan o'chiriladi degani emas, chunki so'rov jadvallardagi ma'lumotlarga ta'sir qilmaydi - u faqat ma'lumotlarni ko'rsatadi.

FROM- har bir so'rovda bo'lishi kerak bo'lgan kalit so'z. FROM kalit so'zidan keyin bir yoki bir nechta bo'sh joy, so'ngra so'rovda ishlatiladigan manba jadvallar ro'yxati keladi. Jadval nomlari vergul bilan ajratiladi. Jadvallarga taxallus nomlari berilishi mumkin, ular jadvalni o'ziga qo'shish yoki ichki ichki so'rovdan tashqi so'rovning joriy yozuviga kirish uchun foydali bo'lishi mumkin (ichiga joylashtirilgan quyi so'rovlar bu erda muhokama qilinmaydi). Taxallus - bu vaqtinchalik jadval nomi, u faqat ushbu so'rovda qo'llaniladi va bundan keyin ishlatilmaydi. Taxallus asosiy jadval nomidan kamida bitta boʻsh joy bilan ajratiladi. FROM qismining sintaksis diagrammasi rasmda ko'rsatilgan. 9.


SELECT iborasining barcha keyingi qismlari ixtiyoriydir.

· QAYERDA- natijada olingan so'rovlar ma'lumotlari to'plamiga kiritiladigan yozuvlarni belgilovchi predikat sharti bo'lgan kalit so'z.

Keling, ma'lum bir ta'lim muassasasida sessiya o'tishni modellashtiruvchi ma'lumotlar bazasi munosabatlarini ko'rib chiqaylik. U uchta munosabatdan iborat bo'lsin, , . Ular mos ravishda R1, R2 va R3 jadvallari bilan ifodalangan deb faraz qilamiz.

R1=(Ism, intizom, daraja)

R2=(Ism, guruh)

R3=(Guruh, intizom)

Quyida SELECT iborasidan foydalanishga misollar keltiramiz.

· Imtihonlar o'tkaziladigan barcha guruhlar ro'yxati (takrorlarsiz).

DISTINCT TANLASH Guruhlar
R3 dan

· JB imtihonini “a’lo” ball bilan topshirgan talabalar ro‘yxati

Toʻliq ismni tanlang
R1 dan
QAYERDA Intizom= "DB" VA Baho = 5

· Intizom nomi bilan birga biror narsa olishi kerak bo'lgan barcha talabalar ro'yxati.

TANLASH To'liq ism, intizom
R2, R3 dan
QAYERDA R1.Guruh = R2.Guruh

Bu yerda WHERE qismi R1 va R2 munosabatlarini ulash shartlarini belgilaydi. WHERE qismida qo'shilish shartlari bo'lmasa, natija kengaytirilgan Dekart mahsulotiga ekvivalent bo'ladi va bu holda har bir talaba o'z guruhi olishi kerak bo'lgan fanlarni emas, balki R2 munosabatidan barcha fanlarni tayinlaydi.

· Bir nechta o'rinli so'zlar ro'yxati

TANLASH To'liq ism
FROM R1 a, R1 b
QAYERDA a.toʻliq ism = b.toʻliq ism VA
a. Intizom <> b. Intizom VA
a. Baholash<= 2 VA b. Baholash.<= 2

Bu erda biz R1 a va b munosabatini nomlash uchun taxalluslardan foydalandik, chunki qidiruv so'zlarini yozib olish uchun biz bir vaqtning o'zida bu munosabatning ikkita misoli bilan ishlashimiz kerak.

Bu misollardan yaqqol ko‘rinib turibdiki, tanlash operatorining mantig‘i (kartezian mahsuloti-tanlash-proyeksiya) undagi ma’lumotlarni tavsiflash tartibiga (avval proyeksiya uchun maydonlar ro‘yxati, keyin esa jadvallar ro‘yxati) to‘g‘ri kelmaydi. Dekart mahsuloti uchun, keyin qo'shilish sharti). Gap shundaki, SQL dastlab oxirgi foydalanuvchi foydalanishi uchun ishlab chiqilgan va ular uni algoritmik tilga emas, balki tabiiy tilga yaqinlashtirishga harakat qilishgan. Albatta, ingliz tili tabiiy til sifatida, hisoblash va dasturlashda keng qo‘llaniladigan xalqaro til sifatida tanlandi. Shu sababli, SQL dastlab uni o'rganishni boshlagan va algoritmik tillarda mashina bilan gaplashishga odatlangan professional dasturchilar orasida chalkashlik va g'azabni keltirib chiqaradi.

Aniqlanmagan Null qiymatlarining mavjudligi ma'lumotlar bazasida saqlangan ma'lumotlarni qayta ishlashning moslashuvchanligini oshiradi. Bizning misollarimizda talaba imtihonga kelgan, ammo biron sababga ko'ra imtihondan o'tmagan vaziyatni taxmin qilishimiz mumkin; bu holda, ba'zi bir fan bo'yicha baho bu talaba uchun noaniq qiymatga ega. Bunday vaziyatda siz quyidagi savolni berishingiz mumkin: "Imtihonga kelgan, ammo o'ta olmagan talabalarni fan nomini ko'rsatib toping." Select iborasi quyidagicha ko'rinadi:

TANLASH To'liq ism, intizom

QAYERDA Baho IS NULL

Men darhol oldindan aytib o'tmoqchimanki, barcha misollar shartli. Nega? Ular haqiqiy ma'lumotlar bazalarida ishlamaydimi? Ular noto'g'ri? Bu erda atribut nomlari yoki jadval ustunlaridan tashqari hamma narsa to'g'ri. Aksariyat ma'lumotlar bazasini boshqarish tizimlari (ma'lumotlar bazasini boshqarish tizimlari) ustunlarni milliy tillarda nomlashga ruxsat bermaydi; ular ma'lumotlar bazasi ob'ektlari va til ob'ektlari bo'lib, ularni ushbu tilning identifikator nomlash qoidalariga muvofiq nomlanishini talab qiladi. Ko'pincha, atribut nomi lotin harflari va raqamlari ketma-ketligi bo'lishi mumkin, ular harfdan boshlanadi, ba'zi bir maxsus belgilarni o'z ichiga olmaydi (masalan, bo'shliqlar, nuqtalar, vergullar, foiz belgilari, % va boshqa maxsus belgilar) va ba'zi cheklovlarga ega. uzunligi. Bu cheklovlar turli ma'lumotlar bazasi tizimlarida har xil, masalan, MS SQL Server 2000 da - atribut nomining uzunligi 128 belgiga yetishi mumkin. Uzoq atribut nomlari so'rov yozish uchun noqulay, lekin juda qisqa bir harfli nomlar jadval ustuni ma'nosining semantikasini saqlab qolishga imkon bermaydi, shuning uchun ular biron bir murosani tanlaydilar va kerak bo'lmasligi uchun uni qisqa, ammo qulay deb nomlashadi. har bir so'rovni yozishda ma'lumotlar bazasining to'liq tavsifini ko'rib chiqish. Bundan tashqari, atribut nomlari, shuningdek, boshqa ob'ektlarning nomlari SQL kalit so'zlariga mos kelmasligi kerak - ya'ni. til operatorlari tarkibiga kiruvchi so‘zlar.

Shuning uchun, to'g'rilik nuqtai nazaridan, biz "Session" ma'lumotlar bazasi sxemasini shaklda taqdim etishimiz kerak

R1=(St_name, Discipline, Mark)

R2=(St_name, N_guruh)

R3=(N_guruh, Intizom)

Va shunga mos ravishda barcha so'rovlarni o'zgartiring.

Tanlash bayonotida yig'ma funktsiyalar va ichki so'rovlardan foydalanish

So'rovlar bitta maydonning qiymati kabi maydonlarning umumlashtirilgan guruh qiymatini hisoblashi mumkin. Bu agregat funktsiyalar yordamida amalga oshiriladi. Agregat funktsiyalari butun jadval guruhi uchun bitta qiymat hosil qiladi. Ushbu funktsiyalar ro'yxati:

Yig'ish funktsiyalari SELECT iborasidagi maydon nomlariga o'xshab qo'llaniladi, bitta istisno: ular argument sifatida maydon nomini oladi. SUM va AVG funksiyalari bilan faqat raqamli maydonlardan foydalanish mumkin. COUNT, MAX va MIN funksiyalari bilan ham son, ham belgilar maydonlaridan foydalanish mumkin. Belgilar maydonlari bilan foydalanilganda, MAX va MIN ularni ASCII ekvivalentiga tarjima qiladi va alifbo tartibida qayta ishlanadi. Ba'zi DBMSlar ichki o'rnatilgan agregatlardan foydalanishga ruxsat beradi, ammo bu barcha oqibatlarga olib keladigan ANSI standartidan og'ishdir.

Yana "Session" ma'lumotlar bazasiga (R1, R2, R3 jadvallari) murojaat qilib, biz muvaffaqiyatli o'tgan imtihonlar sonini topamiz:

COUNT TANI (*)
R1 dan
QAYERDA Mark > 2;

Bu, albatta, maydonni tanlashdan farq qiladi, chunki jadvalda qancha qator bo'lishidan qat'i nazar, u har doim bitta qiymatni qaytaradi. Shu sababli, agar maxsus GROUP BY bandi ishlatilmasa, jamlangan funktsiyalar va maydonlarni bir vaqtning o'zida tanlab bo'lmaydi.

GROUP BY bandi guruh deb ataladigan qiymatlar to‘plamini belgilashga va shu guruhga agregat funksiyasini qo‘llashga imkon beradi. GROUP BY bandida ko'rsatilgan guruhlash maydoni qiymatlari bir xil qiymatga ega bo'lgan barcha qatorlardan guruh tuziladi. Bu bitta SELECT bandida maydonlarni birlashtirish va funktsiyalarni yig'ish imkonini beradi. Agregat funktsiyalardan foydalanish sintaksisi diagrammasi 10-rasmda ko'rsatilgan. Yig'ma funktsiyalardan satr natijalarini chiqarish ifodasida ham foydalanish mumkin. TANLASH, va tuzilgan guruhlarning ishlov berish sharti ifodasida EGA. Bunday holda, har bir agregat funksiya har bir tanlangan guruh uchun hisoblanadi. Agregat funktsiyalarni hisoblash natijasida olingan qiymatlar tegishli natijalarni ko'rsatish yoki guruhlarni tanlashni shart qilish uchun ishlatilishi mumkin.

Birlashtirish funktsiyalaridan foydalanganda shuni yodda tutish kerakki, natijalar to'plami faqat guruhlash maydonlari qiymatlarini va, ehtimol, jamlangan funktsiya qiymatlarini o'z ichiga olishi mumkin. Bitta qiymat bo'yicha guruhlash va boshqa qiymatlarni ko'rsatish mumkin emas. Bu sintaktik xato bo'ladi.

Misol uchun, bunday so'rov har doim muvaffaqiyatsiz bo'ladi:

A ni tanlang

B guruhi

Haqiqatan ham, buni aniqlaylik. Biz nimani topmoqchimiz? Biz ustun qiymatini chiqarishga harakat qilyapmiz A stoldan T, va bir vaqtning o'zida boshqa ustun, ustun bo'yicha guruhlashni amalga oshiring IN. Biz guruhlashni amalga oshiramiz - bu shuni anglatadiki, biz B ustunining bir xil qiymatlari bo'lgan barcha qatorlarni bitta guruhga yig'amiz va keyin aniq emas, biz A ustunining qiymatini ko'rsatamiz, lekin bitta guruhda ko'p qiymatlar bo'lishi mumkin, A ustunining turli qiymatlari. Xo'sh, biz qanday qiymatni olib tashlaymiz? Bu biz uchun ham, kompyuter uchun ham tushunarsiz. Shuning uchun u bunday so'rovni bajarishdan bosh tortadi va bizda sintaksis xatosi borligini aytadi.


Keling, Session ma'lumotlar bazasiga qaytaylik, lekin unga yana bir nechta atributlarni qo'shing. Birinchidan, talabalar orasida ism-shariflar bo'lishi mumkin, shuning uchun talabani aniqlash uchun biz talabani har doim noyob tarzda aniqlaydigan talaba yozuvlari kitobining nomidan foydalanamiz. Ikkinchidan, faraz qilaylik, talaba bir xil fan bo'yicha imtihon topshirish uchun bir nechta urinishlar qilishi mumkin va buning uchun biz imtihondan o'tish uchun keyingi urinish sanasini R1 munosabatiga kiritamiz. Va nihoyat, uchinchi qo'shimcha, biz universitetimizda turli mutaxassisliklar bo'yicha ko'plab guruhlar borligini taxmin qilamiz, keyin bizning ma'lumotlar bazasi sxemasi quyidagicha bo'ladi.

Sessiya (N_zach, Discipline, Mark, Data_ex)

Ko'pgina ma'lumotlar bazasi so'rovlari oldingi misollarda ko'rib chiqilgan SQL so'rovlari tomonidan taqdim etilgan granularlik darajasini talab qilmaydi. Shunday qilib, quyida keltirilgan barcha so'rovlarda siz ma'lumotlar bazasidagi ma'lumotlarni umumlashtiradigan faqat bitta yoki bir nechta qiymatlarni topishingiz kerak:

  • 1) barcha rezidentlarning daromadlari miqdori qancha?
  • 2) jismoniy shaxsning eng yuqori va eng past umumiy daromadi qancha?
  • 3) Zelenograd aholisining jon boshiga o'rtacha daromadi qancha?
  • 4) har bir xonadon aholisining jon boshiga o'rtacha daromadi qancha?
  • 5) har bir xonadonda nechta aholi bor?

SQL-da bu turdagi so'rovlarni yig'ish funktsiyalari va SELECT operatorida ishlatiladigan GROUP BY va HAVING bandlari yordamida yaratish mumkin.

Agregat funktsiyalaridan foydalanish

Ma'lumotlar bazasidagi ma'lumotlarni umumlashtirish uchun SQL agregat funktsiyalarni taqdim etadi. Yig'ish funktsiyasi argument sifatida ma'lumotlarning butun ustunini oladi va ushbu ustunni ma'lum bir tarzda umumlashtiradigan yagona qiymatni qaytaradi.

Masalan, AVG() agregat funktsiyasi argument sifatida raqamlar ustunini oladi va ularning o'rtacha qiymatini hisoblaydi.

Zelenograd aholisining jon boshiga o'rtacha daromadini hisoblash uchun sizga quyidagi so'rov kerak bo'ladi:

ADON BOSHIGA O‘RTA DAROMAD, AVG(SUMD) NI TANlang

SQL-da har xil turdagi xulosa ma'lumotlarini olish imkonini beruvchi oltita agregat funksiya mavjud (3.16-rasm):

SUM() ustundagi barcha qiymatlar yig'indisini hisoblab chiqadi;

AVG() ustundagi qiymatlarning o'rtacha qiymatini hisoblab chiqadi;

  • - MIN() ustundagi barcha qiymatlar orasida eng kichigini topadi;
  • - MAX() ustundagi barcha qiymatlar orasida eng kattasini topadi;
  • - COUNT() ustundagi qiymatlar sonini hisoblaydi;

COUNT(*) so'rov natijalari jadvalidagi qatorlar sonini hisoblaydi.

Yigʻish funksiyasining argumenti avvalgi misoldagidek oddiy ustun nomi yoki jon boshiga oʻrtacha soliqni hisoblashni koʻrsatuvchi quyidagi soʻrovdagidek ifoda boʻlishi mumkin:

AVG NI TANLASH (SUMD*0,13)

Guruch. 3.16.

Ushbu so'rov PERSON jadvalining har bir satri uchun qiymatlarni (SUMD * 0,13) o'z ichiga olgan vaqtinchalik ustunni yaratadi va keyin vaqtinchalik ustunning o'rtacha qiymatini hisoblab chiqadi.

Zelenogradning barcha aholisi uchun daromad miqdorini SUM jami funktsiyasi yordamida hisoblash mumkin:

ODAMDAN SUMD (SUMD) NI TANLASH

Bir nechta manba jadvallarini birlashtirish orqali olingan natijalar jadvalidan jamlamalarni hisoblash uchun agregat funksiyasidan ham foydalanish mumkin. Masalan, siz rezidentlar "Grant" deb nomlangan manbadan olgan umumiy daromad miqdorini hisoblashingiz mumkin:

SUM (PUL) TANLASH

FROM PROFIT, HAVE_D

QAYERDA PROFIT.ID=HAVE_D.ID

VA PROFIT.SOURCE^Scholarship’

MIN() va MAX() agregat funktsiyalari mos ravishda jadvaldagi eng kichik va eng katta qiymatlarni topishga imkon beradi. Ustun raqamli yoki satr qiymatlarini yoki sana yoki vaqt qiymatlarini o'z ichiga olishi mumkin.

Masalan, siz quyidagilarni belgilashingiz mumkin:

(a) rezidentlar tomonidan olinadigan eng past umumiy daromad va to'lanishi kerak bo'lgan eng yuqori soliq:

MIN(SUMD), MAX (SUMD*0,13) ni tanlang

(b) eng keksa va eng yosh rezidentning tug'ilgan sanasi:

MIN(RDATE), MAX(RDATE) NI TANLASH

(c) ro'yxatdagi birinchi va oxirgi fuqarolarning familiyalari, ismlari va otasining ismi alifbo tartibida:

MIN(FIO), MAX(FIO) ni tanlang

Ushbu jamlangan funktsiyalardan foydalanganda, raqamli ma'lumotlar arifmetik qoidalardan foydalangan holda taqqoslanishi, sanalar ketma-ket taqqoslanishi (avvalgi sana qiymatlari keyingi qiymatlardan kichikroq hisoblanadi) va vaqt oralig'i ularning davomiyligi bo'yicha solishtirilishini yodda tutish kerak.

MIN() va MAX() funksiyalaridan satr maʼlumotlari bilan foydalanilganda, ikkita satrni solishtirish natijasi foydalanilgan belgilar kodlash jadvaliga bogʻliq.

COUNT() agregat funktsiyasi har qanday turdagi ustundagi qiymatlar sonini hisoblaydi:

a) 1-mikrorayonda nechta xonadon bor?

COUNT (ADR) TANLASH

QAYERDA ADR LIKE *%, 1_

b) qancha aholining daromad manbalari bor?

SELECT C0UNT(DISTINCT NOM)

v) rezidentlar qancha daromad manbalaridan foydalanadilar?

COUNT TANLASH(DISTINCT ID)

"DISTINCT" kalit so'zi ustundagi takrorlanmaydigan qiymatlar hisobga olinishini bildiradi.

COUNT(*) maxsus agregat funksiyasi maʼlumotlar qiymatlarini emas, balki natijalar jadvalidagi qatorlarni hisoblaydi:

a) 2-mikrorayonda nechta xonadon bor?

QAYERDA ADR LIKE "%, 2_-%'

(b) Ivan Ivanovich Ivanovning qancha daromad manbalari bor?

SHAXSDAN, HAVE_D

FIO = "Ivanov Ivan Ivanovich"

VA PERSON.NOM = HAVE_D.NOM

(c) ma'lum bir manzildagi kvartirada qancha aholi yashaydi?

COUNT(*) FOYDALANGAN ODAM TANILASH = "Zelenograd, 1001-45"

Agregat funktsiyalarga ega bo'lgan jamlama so'rovlar qanday bajarilishini tushunishning usullaridan biri so'rovlarning bajarilishini ikki qismga bo'lingan deb hisoblashdir. Birinchidan, biz so'rov bir nechta natijalar qatorini qaytaradigan agregat funktsiyalarsiz qanday ishlashini aniqlaymiz. Agregat funktsiyalar so'rov natijalariga qo'llaniladi va bitta natija qatorini qaytaradi.

Misol uchun, quyidagi murakkab so'rovni ko'rib chiqing: aholi jon boshiga o'rtacha umumiy daromad, rezidentlarning umumiy daromadlari yig'indisi va o'rtacha manba rentabelligini rezidentning umumiy daromadiga nisbatan foiz sifatida toping. Operator javob beradi

AVG(SUMD), SUM(SUMD), (100*AVG(PUL/SUMD)) TANLASH

FROM PERSON, PROFIT, HAVE_D WHERE PERSON.NOM = HAVE_D.NOM VA HAVE_D.ID = PROFIT.ID

Jami funktsiyalarsiz so'rov quyidagicha ko'rinadi:

SUMD, SUMD, M0NEY/SUMD NI SHAXS, PROFIT, HAVE_D QAYERDA PERSON.NOM = HAVE_D.NOM VA HAVE_D.ID = PROFIT.ID ni tanlang.

va har bir rezident va aniq daromad manbai uchun bir qator natijalarni qaytaradi. Yig'ish funktsiyalari so'rov natijalari jadvalining ustunlaridan umumiy natijalar bilan bir qatorli jadval yaratish uchun foydalanadi.

Qaytarilgan ustun qatorida har qanday ustun nomi oʻrniga agregat funksiyasini belgilashingiz mumkin. Masalan, u ikkita agregat funktsiyaning qiymatlarini qo'shadigan yoki ayiradigan ifodaning bir qismi bo'lishi mumkin:

MAX(SUMD)-MIN(SUMD) ni tanlang

Biroq, agregat funktsiya boshqa agregat funktsiyaga argument bo'la olmaydi, ya'ni. O'rnatilgan agregat funktsiyalari taqiqlangan.

Bundan tashqari, qaytarilgan ustunlar ro'yxati bir vaqtning o'zida agregat funktsiyalari va oddiy ustun nomlaridan foydalana olmaydi, chunki bu hech qanday ma'noga ega emas, masalan:

FIO, SUM (SUMD) ni tanlang

Bu erda ro'yxatning birinchi elementi DBMSga bir nechta satrlardan iborat bo'lgan va har bir rezident uchun bitta qatorni o'z ichiga olgan jadval yaratishni buyuradi. Ro'yxatning ikkinchi elementi DBMSdan SUMD ustunidagi qiymatlarning yig'indisi bo'lgan yagona natija qiymatini olishni so'raydi. Ushbu ikkita ko'rsatmalar bir-biriga zid keladi, natijada xatolik yuzaga keladi.

Yuqoridagilar kichik so'rovlar va so'rovlarni guruhlash bilan qayta ishlash holatlariga taalluqli emas.