Internet Windows Android
Kengaytirish

mavjud funksiyadan foydalangan holda so'rovlar. EXISTS operatoridan foydalanish

SQL so'rovlarni bir-biriga joylashtirish imkonini beradi. Odatda, pastki so'rov bitta qiymatni qaytaradi, bu predikatning to'g'ri yoki yo'qligini tekshirish uchun tekshiriladi.

Qidiruv shartlarining turlari:
. Quyi soʻrov natijasi bilan solishtirish (=, >=)
. Quyi so'rov natijalari tegishli yoki yo'qligini tekshirish (IN)
. mavjudligi testi (EXISTS)
. Bir nechta (miqdoriy) taqqoslash (HAMMA, HAMMA)

Ichki so'rovlar bo'yicha eslatmalar:
. Quyi so'rov faqat bitta ustunni tanlashi kerak (EXISTS predikati bo'lgan quyi so'rovdan tashqari) va uning natijasi ma'lumotlar turi predikatda ko'rsatilgan qiymatning ma'lumotlar turiga mos kelishi kerak.
. Ba'zi hollarda siz bitta qiymatni olishingizga ishonch hosil qilish uchun DISTINCT kalit so'zidan foydalanishingiz mumkin.
. Siz quyi soʻrovga ORDER BY va UNION bandini kirita olmaysiz.
. Quyi soʻrov qidiruv soʻzining chap yoki oʻng tomonida paydo boʻlishi mumkin.
. Quyi soʻrovlar GROUP BY bandisiz yigʻish funksiyalaridan foydalanishi mumkin, ular istalgan qatorlar soni, maxsus IN predikati va ustunlar asosidagi ifodalar uchun avtomatik ravishda maxsus qiymat qaytaradi.
. Iloji bo'lsa, quyi so'rovlar o'rniga JOIN jadval birikmalaridan foydalanish kerak.

Ichki so'rovlar uchun misollar:

Buyurtmalardan * SNum =(Satuvchi odamlardan SNum ni QAYERDA SName='Motika' TANILASH)
SNum IN BO'LGAN Buyurtmalardan * TANLANING (Siti: "London" sotuvchilaridan SNumni tanlang)
Buyurtmalardan * SNum=(CNum=2001 Buyurtmalardan DISTINCT SNum NI TANLA)
* Buyurtmalardan TANLANING.
* XUSUSIYATDA CNum=(Satuvchilardan SNum+1000 ni tanlang WHERE SName='Serres')

2) Tegishli pastki so'rovlar

SQL da siz tashqi so'rovdan jadval havolasi bilan quyi so'rovlar yaratishingiz mumkin. Bunday holda, pastki so'rov bir necha marta, tashqi so'rovdan har bir jadval qatori uchun bir marta bajariladi. Demak, quyi so‘rov indeksdan foydalanishi muhim. Quyi so'rov tashqi jadval bilan bir xil jadvalga murojaat qilishi mumkin. Agar tashqi so'rov nisbatan oz sonli qatorlarni qaytarsa, u holda bog'langan pastki so'rov bog'liq bo'lmaganga qaraganda tezroq ishlaydi. Agar quyi so'rov oz sonli qatorlarni qaytarsa, u holda bog'langan so'rov bog'lanmagan so'rovga qaraganda sekinroq ishlaydi.

Tegishli pastki so'rovlarga misollar:

SELECT * FROM SalesPeople Main WHERE 1(Tanlash AVG(Amt) FROM Buyurtmalar O2 WHERE O2.CNum=O1.CNum) //bu mijoz uchun oʻrtacha buyurtma qiymatidan kattaroq barcha buyurtmalarni qaytaradi

3) EXISTS predikati

Sintaksis shakli: MAVJUD ()

Predikat quyi so'rovni argument sifatida qabul qiladi va agar quyi so'rovda chiqish bo'lsa, rost deb baholaydi, aks holda u noto'g'ri deb baholanadi. Quyi so'rov bir marta bajariladi va bir nechta ustunlarni o'z ichiga olishi mumkin, chunki ularning qiymatlari tekshirilmaydi, lekin qatorlar mavjudligi natijasi oddiygina aniqlanadi.

EXISTS predikati bo'yicha eslatmalar:
. EXISTS - bu TRUE yoki FALSE qaytaradigan predikat bo'lib, u yolg'iz yoki boshqa mantiqiy ifodalar bilan ishlatilishi mumkin.
. EXISTS o'zining quyi so'rovida jamlash funktsiyalaridan foydalana olmaydi.
. Korrelyatsiya qilingan (bog'liq, bog'liq - Korrelyatsiya qilingan) pastki so'rovlarda tashqi jadvalning har bir qatori uchun EXISTS predikati bajariladi.
. EXISTS predikatini jadval birikmalari bilan birlashtira olasiz.

EXISTS predikatiga misollar:

SELECT * FROM Customer WHERE EXISTS(SELECT * FROM Customer WHERE City='San-Xose') - agar ulardan biri San-Xoseda yashasa, barcha mijozlarni qaytaradi.
MAVJUD YO'Q QERDA AVVAL MIJOZDAN DISTINCT SNum NI TANLASH (TANLASH * FROM Customer Send WHERE Send.SNum=First.SNum VA Send.CNumFirst.CNum) - Faqat bitta mijozga xizmat ko'rsatgan sotuvchilar sonini qaytaradi.
DISTINCT F.SNum, SName, F.City FROM SalesPeople F, Customer S WHERE EXISST (TANLASH * mijoz T WHERE S.SNum=T.SNum VA S.CNumT.CNum VA F.SNum=S.SNum) - qaytaradi bir nechta xaridorlarga xizmat ko'rsatgan barcha sotuvchilarning raqamlari, ismlari va yashash shaharlari.
MAVJUD QERDAN SalesPeople Frst FROM * NI TANLASH (Tanlash * FROM Customer Send WHERE Frst.SNum=Send.SNum VA 1).

4) Miqdoriy taqqoslash predikatlari

Sintaksis shakli: (=|>|=|) HAR QANDAY|HAMMA ()

Ushbu predikatlar argument sifatida pastki so'rovdan foydalanadi, ammo EXISTS predikati bilan solishtirganda, ular relyatsion predikatlar (=,>=) bilan birgalikda ishlatiladi. Shu ma'noda ular IN predikatiga o'xshaydi, lekin faqat pastki so'rovlarga tegishli. Standart ANY o'rniga SOME kalit so'zidan foydalanishga imkon beradi, ammo barcha ma'lumotlar bazasi ma'lumotlar bazasi uni qo'llab-quvvatlamaydi.

Taqqoslash predikatlari bo'yicha eslatmalar:
. Agar quyi so'rovni bajarishda tanlangan har bir qiymat tashqi so'rov predikatida ko'rsatilgan shartga javob bersa, ALL predikati TRUE deb baholanadi. Ko'pincha u tengsizliklar bilan ishlatiladi.
. Agar quyi so'rovni bajarishda tanlangan kamida bitta qiymat tashqi so'rov predikatida ko'rsatilgan shartga javob bersa, HAR QANDAY predikat TRUE deb baholanadi. Ko'pincha u tengsizliklar bilan ishlatiladi.
. Agar quyi so'rov qatorlarni qaytarmasa, u holda ALL avtomatik ravishda TRUE (taqqoslash sharti bajarilgan deb hisoblanadi), HAMMA uchun esa - FALSE qiymatini oladi.
. Agar biron bir qator uchun taqqoslash TRUE bo'lmasa va bir yoki bir nechta null qatorlar mavjud bo'lsa, ANY NOMA'lumni qaytaradi.
. Agar taqqoslash har qanday satr uchun FALSE bo'lmasa va bir yoki bir nechta null qatorlar mavjud bo'lsa, u holda ALL NO'LIMni qaytaradi.

Miqdoriy taqqoslash predikatiga misollar:

* QAYERDA Sotuvchilardan Shahar=HAMMANI TANLASH (Xaridordan Shaharni tanlang)
Buyurtmalardan * TANLANG. Amt ALL (Reytingni mijozdan WHERE City = "Rim" dan tanlang)

5) Yagonalik predikati

UNIQUE|DISTINCT ()

Predikat pastki so'rov chiqishida o'ziga xoslikni (dublikatlar yo'qligini) tekshirish uchun ishlatiladi. Bundan tashqari, UNIQUT predikatida NULL qiymatlari bo'lgan qatorlar noyob hisoblanadi va DISTINCT predikatida ikkita null qiymat bir-biriga teng deb hisoblanadi.

6) Predikatga mos keling

MATCH ()

MATCH predikati so'rovlar qatorining qiymati quyi so'rovdan qaytarilgan har qanday satr qiymatiga mos kelishini tekshiradi. Bu quyi soʻrov IN va HAR QANDAY predikatlardan farq qiladi, chunki u NULL qiymatlarning bir qismiga ega boʻlgan qatorlar orasida yuzaga kelishi mumkin boʻlgan “qisman” (qisman) mosliklarni qayta ishlash imkonini beradi.

7) FROM bo'limidagi so'rovlar

Darhaqiqat, jadvalga havolaga ruxsat berilgan joyda quyi so'rovdan foydalanish maqbuldir.

CName, Mijozdan Tot_Amt ni tanlang, (CNum, SUM(Amt) AS Tot_Amt AS Buyurtmalar GROUP BY CNum) WHERE City='London' VA Customer.CNum=Orders.CNum
//subquery Londondan har bir xaridor tomonidan berilgan buyurtmalarning umumiy miqdorini qaytaradi.

8) Rekursiv so'rovlar

REKURSIV BILAN
1-SAVOL TANLANGAN BOʻYICHA … … QAYERDAN…
2-SAVOL TANLANGAN BOʻYICHA … … QAYERDAN …

Bundan tashqari, siz murojaat qilishingiz mumkin EXISTS operatori. Ushbu operator ko'pincha tashqi so'rov orqali olingan qiymat ichki so'rov tomonidan olingan natijalar to'plamida mavjudligini tekshirish uchun o'zaro bog'liq pastki so'rovlar bilan ishlatiladi. Agar quyi so'rov kamida bitta qatorni qaytarsa, operator TRUE ni qaytaradi. Agar qiymat mavjud bo'lmasa, operator FALSE ni qaytaradi. Shunga ko'ra, NOT EXISTS operatoridan foydalanib, tashqi so'rov tomonidan olingan qiymat ichki so'rov tomonidan olingan natijalar to'plamida mavjud emasligi tekshiriladi.

    EXISTS operatori quyi so‘rov natijalari to‘plamida qatorlar mavjudligini tekshiradi.

    Agar quyi so'rov satri qiymati topilsa:

    • qidiruv ichki so'rovda davom etmaydi;

      shart TRUE deb belgilangan.

    Agar pastki so'rov satrining qiymati topilmasa:

    • shart FALSE deb belgilangan;

      qidiruv ichki so'rovda davom etadi.

EXISTS operatori

Barcha mantiqiy operatorlar o'rnatilgan SELECT iboralari bilan ishlaydi. Shu bilan bir qatorda EXISTS operatoridan foydalanishingiz mumkin. Ushbu operator ko'pincha tashqi so'rov orqali olingan qiymat ichki so'rov tomonidan olingan natijalar to'plamida mavjudligini tekshirish uchun o'zaro bog'liq pastki so'rovlar bilan ishlatiladi. Agar quyi so'rov kamida bitta qatorni qaytarsa, operator TRUE ni qaytaradi. Agar qiymat mavjud bo'lmasa, operator FALSE ni qaytaradi. Shunga ko'ra, NOT EXISTS operatoridan foydalanib, tashqi so'rov tomonidan olingan qiymat ichki so'rov tomonidan olingan natijalar to'plamida mavjud emasligi tekshiriladi.

Novosibirsk davlat iqtisodiyot va boshqaruv akademiyasi

FAN bo‘yicha LABORATORIYA SEMINAR

"MA'lumotlar bazasi"

Laboratoriya ishi № 7

"SQL ma'lumotlar bazasi tili: ma'lumotlarni manipulyatsiya qilish buyruqlari»

NOVOSIBIRSK 2000 yil

SQL - bu Strukturaviy so'rovlar tilining qisqa nomi. Tilning nomidan ko'rinib turibdiki, uning asosiy maqsadi ma'lumotlar bazasidan ma'lumot olish uchun so'rovlarni yaratishdir. Ma'lumotlarni tanlash buyruqlari SQL tilining ajralmas qismi bo'lgan DML ma'lumotlarni manipulyatsiya qilish tilining asosini tashkil qiladi. Biroq, DML ma'lumotlar bazasidan ma'lumotlarni olish uchun buyruqlardan ko'proq narsani o'z ichiga oladi. Bundan tashqari, ma'lumotlarni o'zgartirish, ma'lumotlarni boshqarish va boshqalar uchun buyruqlar mavjud.

Ushbu laboratoriya DML tilining asoslarini qamrab oladi. Biz laboratoriya davomida SQL2 standartiga amal qilamiz.

SQL katta hajmli til bo'lganligi uchun biz faqat asosiy buyruqlarni ko'rib chiqamiz. Har xil maxsus SQL xususiyatlari keyingi laboratoriyalarda yoritiladi.

Laboratoriya ishlarini bajarish uchun siz relyatsion ma’lumotlar modeli asoslarini, relyatsion algebra va relyatsion hisob asoslarini, MS SQL Server DBMS bilan ishlash tamoyillarini bilishingiz kerak.

Laboratoriya ishi natijasida siz SQL buyruqlari yordamida ma'lumotlarni manipulyatsiya qilishni o'rganasiz, MS SQL Server DBMSda amalga oshirilgan til dialektini ko'rib chiqasiz.

KIRISH

SQL so'rovlarni yaratish uchun ham, ma'lumotlar bazasini yangilash uchun ham ma'lumotlarni manipulyatsiya qilish imkoniyatlarining keng doirasini o'z ichiga oladi. Bu imkoniyatlar faqat ma'lumotlar bazasining mantiqiy tuzilishiga tayanadi, uning fizik tuzilishiga emas, relyatsion model talablariga mos keladi.

Dastlab, SQL ning sintaksis tuzilishi Coddning relyatsion hisobiga asoslangan (yoki hech bo'lmaganda asoslangan bo'lib tuyulgan). Union qo'llab-quvvatlanadigan yagona relyatsion algebra operatsiyasi edi.

SQL2 da oldingi standartda ishlab chiqilgan shunga o'xshash relyatsion hisob sintaksisiga qo'shimcha ravishda birlashma, kesishish, farq va qo'shilish operatsiyalari bevosita amalga oshiriladi. Tanlash, prognozlash va mahsulot operatsiyalari deyarli to'g'ridan-to'g'ri qo'llab-quvvatlandi (va davom etmoqda), bo'linish va tayinlash operatsiyalari esa yanada og'irroq shaklda qo'llab-quvvatlanadi.

Biz avval SQL so'rovlar tilini, so'ngra uning ma'lumotlarni kiritish va o'zgartirish operatsiyalarini tasvirlab beramiz. Ma'lumotlarni o'zgartirish operatsiyalari oxirgi marta tavsiflanadi, chunki ularning tuzilishi ma'lum darajada so'rovlar tilining tuzilishiga tayanadi.

Oddiy so'rovlar

Biz uchun oddiy so'rov faqat bitta ma'lumotlar bazasi jadvaliga kiradigan so'rov bo'ladi. Oddiy so'rovlar bizga SQL ning asosiy tuzilishini ko'rsatishga yordam beradi.

Oddiy so'rov. Faqat bitta ma'lumotlar bazasi jadvaliga kiradigan so'rov.

So'rov: Kim suvoqchi bo'lib ishlaydi?

WHERE SKILL_TYPE = "Gipschi"

Natija:

G. Rikover

Ushbu so'rov uchta eng keng tarqalganini ko'rsatadi iboralar SQL: SELECT, FROM va WHERE. Garchi biz ularni misolimizda turli qatorlarga qo'ygan bo'lsak-da, ularning barchasi bir qatorda bo'lishi mumkin. Shuningdek, ular turlicha chekinishi mumkin va iboralar ichidagi so'zlar o'zboshimchalik bilan bo'sh joy bilan ajratilishi mumkin. Har bir iboraning xususiyatlarini ko'rib chiqing.

Tanlang. SELECT bandi natijaviy jadvalga kiritilishi kerak bo'lgan ustunlarni ko'rsatadi. Bular har doim qandaydir relyatsion jadvalning ustunlaridir. Bizning misolimizda olingan jadval bitta ustundan (NAME) iborat, lekin umuman olganda u bir nechta ustunlarni o'z ichiga olishi mumkin; u shuningdek hisoblangan qiymatlarni yoki doimiylarni o'z ichiga olishi mumkin. Biz ushbu variantlarning har biriga misollar keltiramiz. Olingan jadvalda bir nechta ustunlar bo'lishi kerak bo'lsa, unda barcha kerakli ustunlar SELECT buyrug'idan keyin vergul bilan ajratilgan holda ro'yxatga olinadi. Masalan, SELECT WORKER_ID, NAME iborasi natijasida WORKER_ID va NAME ustunlaridan iborat jadval paydo bo‘ladi.

iborani tanlang. Olingan jadvalning ustunlarini belgilaydi.

Kimdan. FROM bandi so'rov orqali kirish uchun bir yoki bir nechta jadvallarni belgilaydi. SELECT va WHERE bandlarida keltirilgan barcha ustunlar FROM bandida keltirilgan jadvallardan birida mavjud bo'lishi kerak. SQL2 da bu jadvallar to'g'ridan-to'g'ri sxemada asosiy jadvallar yoki ma'lumotlar ko'rinishi sifatida aniqlanishi mumkin yoki ularning o'zlari SQL so'rovlari natijasida nomsiz jadvallar bo'lishi mumkin. Ikkinchi holatda so'rov FROM buyrug'ida aniq berilgan.

FROM iborasi. So'rov murojaat qiladigan mavjud jadvallarni belgilaydi.

Qayerda. WHERE bandida shart mavjud. buning asosida jadval (jadvallar) qatorlari tanlanadi. Bizning misolimizda shart shuki, SKILL_TYPE ustunida har doim SQLda matn konstantalari bilan bajarilganidek, apostroflar bilan o'ralgan doimiy "Plasterer" bo'lishi kerak. WHERE bandi eng o'zgaruvchan SQL buyrug'idir; u juda ko'p turli shartlarni o'z ichiga olishi mumkin. Taqdimotimizning ko'p qismi WHERE bandida ruxsat etilgan turli xil konstruktsiyalarni ko'rsatishga bag'ishlanadi.

WHERE bandi. Belgilangan jadvallardan qaysi qatorlar tanlanishi asosida shartni belgilaydi.

Yuqoridagi SQL so'rovi tizim tomonidan quyidagi tartibda qayta ishlanadi: FROM, WHERE, SELECT. Ya'ni, FROM buyrug'ida ko'rsatilgan jadval qatorlari ishlov berish uchun ish maydoniga joylashtiriladi. Keyin WHERE bandi har bir qatorga ketma-ket qo'llaniladi. WHERE bandiga javob bermaydigan barcha qatorlar ko'rib chiqilmaydi. Keyin WHERE bandiga mos keladigan qatorlar SELECT buyrug'i bilan qayta ishlanadi. Bizning misolimizda har bir qatordan NAME tanlanadi va barcha tanlangan qiymatlar so'rov natijalari sifatida ko'rsatiladi.

So'rov: Ofis binolari haqidagi barcha ma'lumotlarni taqdim eting.

WHERE TYPE = "Ofis"

Natija:

BLDG IDADRESSTYPEQLTY DARAJASI

Vyazov ko‘chasi, 312, 123-uy, 2-ofis

Berezovaya ko'chasi, 210 uy. 1011 Office Z 1

Osinovaya ko'chasi, 111-uy. 1213 Office 4 1

SELECT buyrug'idagi yulduzcha (*) "butun qator" degan ma'noni anglatadi. Bu biz tez-tez ishlatadigan qulay stenografiya.

So'rov: Har bir elektrchining haftalik maoshi qancha?

NAME NI SELECT, "Haftalik ish haqi = ", 40 * HRLY_RATE

WHERE SKILL_TYPE = "Elektromontyor"

Natija:

M. Faraday Haftalik ish haqi = 500,00

H. Kolumb Haftalik ish haqi = 620,00

Bu so‘rov ikkala belgi konstantalaridan (bizning misolimizda “Haftalik ish haqi =”) va SELECT buyrug‘idagi hisoblardan foydalanishni ko‘rsatadi. SELECT buyrug‘i doirasida siz raqamli ustunlar va raqamli konstantalar hamda standart arifmetik operatorlardan foydalanadigan hisoblarni bajarishingiz mumkin. (+, -, *, /), kerak bo'lganda qavslar bilan guruhlangan. Shuningdek, biz so'rov natijasini ko'rsatilgan ustun bo'yicha ortib borayotgan alfanumerik tartibda saralaydigan yangi ORDER BY buyrug'ini kiritdik. Agar siz natijalarni kamayish tartibida saralashni istasangiz, u holda buyruqqa DESC qo'shishingiz kerak. ORDER BY bandi natijalarni bir nechta ustunlar bo'yicha saralashi mumkin, ba'zilari o'sish tartibida, boshqalari esa kamayish tartibida. Birinchi navbatda saralash asosiy kalit ustuni belgilanadi.

xarakter doimiysi. Harflar, raqamlar va "maxsus" belgilardan tashkil topgan doimiy.

So'rov: Kimning soatiga 10 dan 12 dollargacha ish haqi bor?

QAYERDA HRLY_RATE >= 10 VA HRLY_RATE< - 12

Natija:

Ishchi ID NAME HRLY_RATE SKILL_TYPE SUPV_ID

Bu so'rov WHERE buyrug'ining ayrim ilg'or funksiyalarini tasvirlaydi: taqqoslash operatorlari va mantiqiy AND operatsiyasi. Oltita taqqoslash operatori (=,<>(teng emas),<, >, <=, >=). Mantiqiy operatorlar AND (VA), OR (OR) va NOT (HE) qo'shma shartlarni yaratish yoki shartni inkor qilish uchun ishlatilishi mumkin. Qavslar shartlarni guruhlash uchun ishlatilishi mumkin, bu dasturlash tillarida keng tarqalgan.

Taqqoslash operatorlari =,<>, <, >, <=, >=.

Mantiqiy operatsiyalar VA (VA), OR (YOKI) va EMAS (HE) .

Ushbu so'rovni shakllantirish uchun BETWEEN (o'rtasida) operatoridan ham foydalanishingiz mumkin:

HRLY_RATE 10 dan 12 gacha

BETWEEN ba'zi bir qiymatni ikkita boshqa qiymat bilan solishtirish uchun ishlatilishi mumkin, agar taqqoslangan qiymat berilgan qiymatlarning har biriga yoki ularning orasidagi istalgan qiymatga teng bo'lishi mumkin bo'lsa, birinchisi ikkinchisidan kichikdir.

So'rov: Shivachilar, tom yopishchilar va elektrchilarni sanab o'ting.

QAYERDA MAKORAT_TYPE ("Sıvaschi", "Tom ustasi", "Elektromontyor")

Natija:

WORKER_ID NAME HRLY_RATE SKILL_TYPE SUPV_ID

1412 C. Nemo 13.75 Shivachi 1520

2920 R. Garret 10.00 Roofer 2920

1520 G. Rickover 11.75 Shivachi 1520

Ushbu so'rov IN (B) taqqoslash operatoridan foydalanishni tushuntiradi. QAYER sharti, agar qatorning ixtisoslashtirilgan turi qavs ichida joylashgan bo'lsa, ya'ni ixtisoslik turi suvoqchi, tom yopishchi yoki elektrchi bo'lsa, to'g'ri bo'ladi. IN operatorini quyi so‘rovlarda yana ko‘ramiz.

Faraz qilaylik, biz mutaxassislikning imlosini aniq eslay olmaymiz: "elektrik" yoki "elektron muhandis" yoki boshqa narsa. Belgilanmagan belgilar qatorlari oʻrnini bosuvchi joker belgilar soʻrovda notoʻgʻri imlolarni topishni osonlashtiradi.

Shablon belgilari. Belgilanmagan belgilar qatorlarini almashtiruvchi belgilar.

So'rov: Ish turi Elek bilan boshlangan ishchilarni sanab o'ting.

QAYERDA SKILL_TYPE LAYK ("Elek%")

Natija:

ISHchi ID NOMI HRLY_RATE SKILL_TYPE SUPV_ID

1235 M.Faraday 12.50 Elektrik 1311

1311 yil H. Kolumb 15.50 Elektrchi 1311

SQLda ikkita joker belgilar mavjud: % (foiz) va _ (pastki chiziq). Pastki chiziq aniq bir belgilanmagan belgi o'rnini bosadi. Foiz noldan boshlab ixtiyoriy sonli belgilarni almashtiradi. Joker belgilar ishlatilsa, LIKE operatori (like) belgilar oʻzgaruvchilarini doimiylar bilan solishtirish uchun talab qilinadi. Boshqa misollar:

NOMI "__Kolumb"ga O'XSHADI

ISMI "__K%" YOQTIRISH

Birinchi misoldagi shart, agar NAME ikkita belgidan keyin "Kolumb" dan iborat bo'lsa, to'g'ri bo'ladi. WORKER jadvalida barcha nomlar bosh harf va nuqta bilan boshlanadi. Shunday qilib, bu shart bilan biz "Kolumb" familiyasi bilan barcha ishchilarni toping. Ikkinchi misolning sharti familiyasi "K" harfi bilan boshlangan barcha xodimlarni topish imkonini beradi.

So'rov: Keyingi ikki hafta ichida boshlanadigan barcha ishlarni toping.

QAYERDA START _DATE CURRENT_DATE VA

Natija:(Joriy sana joriy sana = 10.10 deb faraz qiling)

WORKER_ID BLDG_ID START_DATE NUM_DAYS

1235 312 10.10 5

1235 515 17.10 22

3231 111 10.10 8

1412 435 15.10 15

3231 312 24.10 20

1311 460 23.10 24

Ushbu so'rovda sana (sana) va interval (interval) qiymatlari bilan BETWEEN (o'rtasida) operatoridan foydalanish ko'rsatilgan. CURRENT_DATE har doim bugungi sanani qaytaradigan funksiyadir. Ifoda

CURRENT_DATE + INTERVAL "14" KUN

joriy sanaga ikki haftalik vaqt qo'shadi. Shunday qilib, agar START_DATE ustunining qiymati 10/10 va 10/24 oralig‘ida bo‘lsa, TASHQIRI tanlanadi (bugun 10/10 bo‘lsa). Bu sana maydonlariga interval qiymatlarini qo'shishimiz mumkinligini ko'rsatadi. Bundan tashqari, biz bo'shliq qiymatlarini butun son qiymatlari bilan ko'paytirishimiz mumkin. Misol uchun, biz haftalar soni ma'lum haftalar sonida qancha bo'lishini bilmoqchimiz deylik (NUM_WEEKS o'zgaruvchisi (NUM_HAFTALAR) bilan belgilanadi). Biz buni shunday qilishimiz mumkin:

CURRENT_DATE + INTERVAL "7" KUN * NUM_WEEKS

2. Ko‘p jadvalli so‘rovlar

Ma'lumotlar elementlarini bitta jadval chegaralari bo'ylab bog'lash qobiliyati har qanday ma'lumotlar bazasi tilida muhimdir. Relyatsion algebrada bu funktsiya birlashma amali orqali amalga oshiriladi. SQL ning ko'p qismi to'g'ridan-to'g'ri relyatsion hisob-kitoblarga asoslangan bo'lsa-da, SQL turli jadvallardagi ma'lumotlarni xuddi relyatsion algebrani birlashtirish operatsiyasi bilan bog'laydi. Endi biz buni qanday qilishni ko'rsatamiz. So'rovni ko'rib chiqing:

So'rov:

Javob uchun zarur bo'lgan ma'lumotlar ikkita jadvalda keltirilgan: WORKER va TOPSHIRISH. SQL yechimi ikkala jadvalni FROM bandida ro'yxatga olishni va WHERE bandining maxsus turini ko'rsatishni talab qiladi:

SKILL_TYPE TANLASH

ISHLAB CHIQARISHDAN, TOPSHIQ

WHERKER.WORKER_ID = TOPSHIRISH.WORKER_ID

VA BLDG_ID = 435

Bu yerda nima bo'lyapti? Tizim tomonidan berilgan so'rovni qayta ishlashning ikki bosqichini ko'rib chiqishimiz kerak.

1. Odatdagidek, avval FROM bandi qayta ishlanadi. Biroq, bu holda, buyruqda ikkita jadval ko'rsatilganligi sababli, tizim ushbu jadvallar qatorlarining Dekart mahsulotini yaratadi. Bu shuni anglatadiki, har ikkala jadvalning ustunlaridan iborat bitta (mantiqiy) bitta katta jadval yaratilgan bo'lib, unda bitta jadvalning har bir satri boshqa jadvalning har bir satri bilan bog'lanadi. Bizning misolimizda WORKER jadvali beshta ustundan, TOPSHIRUV jadvali esa to'rtta ustundan iborat bo'lganligi sababli, FROM buyrug'i bilan hosil qilingan Dekart mahsuloti to'qqizta ustunga ega bo'ladi. Dekart mahsulotining umumiy qatorlar soni m * n, bu erda m - WORKER jadvalidagi qatorlar soni; va n - ASIGNMENT jadvalidagi qatorlar soni. WORKER jadvalida 7 qator va TASHQIRUV jadvalida 19 qator bo'lganligi sababli, Dekart mahsuloti 7x19 yoki 133 qatorni o'z ichiga oladi. Agar FROM buyrug'ida ikkitadan ortiq jadval ko'rsatilgan bo'lsa, u holda buyruqda ko'rsatilgan barcha jadvallarning Dekart ko'paytmasi hosil bo'ladi.

Dekart mahsuloti. Bir jadvalning har bir qatorini birlashtirish natijasi har biri boshqa jadvaldagi qator.

2. Gigant relyatsion jadvalni yaratgandan so'ng, tizim avvalgidek WHERE bandini qo'llaydi. FROM buyrug'i bilan yaratilgan jadvalning har bir qatori. WHERE shartiga nisbatan tekshiriladi. Shartga javob bermaydigan qatorlar ko'rib chiqilmaydi. Keyin qolgan qatorlarga SELECT bandi qo'llaniladi.

Bizning so'rovimizdagi WHERE bandida ikkita shart mavjud:

1. ISHKAR. WORKER_ID = TAYSIB.WORKER_ID

2.BLDG_ID = 435

Bu shartlardan birinchisi birlashish shartidir. Esda tutingki, WORKER va ASSIGNMENT jadvallari WORKER_ID nomli ustunni o'z ichiga olganligi sababli, ularning Dekart mahsulotida shu nomdagi ikkita ustun bo'ladi. Ularni farqlash uchun ustun nomidan oldin uni nuqta bilan ajratib, manba jadvalining nomini qo'yamiz.

Birinchi shart har qanday tanlangan qatorda WORKER jadvalidagi WORKER_ID ustunining qiymati ASSIGNMENT jadvalidagi WORKER_ID ustunining qiymatiga mos kelishi kerakligini bildiradi. Biz aslida WORKER_ID tomonidan ikkita jadvalga qo'shilmoqdamiz. Ushbu ikkita ustunning qiymatlari teng bo'lmagan barcha qatorlar mahsulot jadvalidan chiqarib tashlanadi. Aynan shu narsa relyatsion algebraning tabiiy qo'shilish operatsiyasini bajarishda sodir bo'ladi. (Biroq, tabiiy qo'shilishdan hali ham bir oz farq bor: SQL qo'shimcha WORKER_ID ustunini avtomatik ravishda olib tashlamaydi). BLDG_ID = 435 qo'shimcha sharti bilan ushbu ikkita jadvalning to'liq qo'shilishi rasmda ko'rsatilgan. 1. SELECT buyrug'ini qo'llash yakunda quyidagi so'rov natijasini beradi:

MAKORAT TURI

Shivachi

Tom yopish ustasi

Elektrchi

Guruch. 1. ISHLAB CHIQISH va TOPSHIRISH jadvallariga qo'shilish

Endi biz sizga SQL-da jadvalni o'ziga qanday qo'shishni ko'rsatamiz.

So'rov: Xodimlarni rahbarlarining ismlari bilan ro'yxatlang.

A.WORKER_NAME, B.WORKER_NAMEni tanlang

ISHLAB CHIQARISH A, ISHCHI B

QAYERDA B.WORKER_ID = A.SUPV_ID

Ushbu misoldagi FROM bandi WORKER jadvalining ikkita "nusxasini" yaratadi va ularga A va B taxalluslarini beradi. Taxallus jadvalga berilgan muqobil nomdir. Keyin WORKER jadvalining A va B nusxalari WHERE buyrug'i bilan B dagi WORKER_ID va A dagi SUPV_ID teng bo'lish sharti asosida bog'lanadi. Shunday qilib, A dan har bir qator B qatorga qo'shiladi va A qator menejeri haqidagi ma'lumotlarni o'z ichiga oladi (2-rasm). 2).

Guruch. 2. WORKER jadvalining ikki nusxasini birlashtirish

Har bir qatordan ikkita xodim nomini tanlab, biz kerakli ro'yxatni olamiz:

A.NAMEB.NAME

M.Faraday X.Kolumb

C.Nemo G.Rickover R.Garrett R.Garrett

P. Meyson P. Meyson G. Rikover G. Rikver X. Kolumb X. Kolumb J. Advokat P. Meyson

Taxallus. Jadvalga berilgan muqobil nom.

A.WORKER_NAME ishchini, B.WORKER_NAME esa menejerni ifodalaydi. E'tibor bering, ba'zi ishchilar o'zlarining menejerlari bo'lib, bu o'z qatorlarida bajarilgan WORKER_ID - SUPV_ID tengligidan kelib chiqadi.

SQL-da siz bir vaqtning o'zida ikkitadan ortiq jadvallarni bog'lashingiz mumkin:

So'rov

ISHCHI_NAME NI TANlang

ISHLAB CHIQISHDAN, TASHQIRISHDAN, QURILISHDAN

WHERE WORKER.WORKER_ID = ASSIGNMENT.WORKER_ID VA ASIGNMENT.BLDG_ID = BUILDING.BLDG_ID VA

TYPE = "Ofis"

Natija:

M. Faraday

G. Rikover

J.Advokat

E'tibor bering, agar ustun nomi (masalan, WORKER_ID yoki BLDG_ID) bir nechta jadvalda bo'lsa, noaniqlikni oldini olish uchun ustun nomidan oldin manba jadvalining nomini qo'yishimiz kerak. Lekin agar ustun nomi bizning misolimizdagi TYPE kabi faqat bitta jadvalda bo'lsa, unda noaniqlik yo'q, shuning uchun jadval nomini ko'rsatish shart emas.

Ushbu so'rovdagi SQL buyruqlari uchta relyatsion ma'lumotlar bazasi jadvallaridan bitta jadval yaratadi. Birinchi ikkita jadval WORKER_ID tomonidan birlashtiriladi, undan so'ng uchinchi jadval BLDG_ID tomonidan natijaviy jadvalga qo'shiladi. Vaziyat

TYPE = "Ofis"

WHERE buyrug'i ofis binolariga tegishli qatorlardan tashqari barcha qatorlarni chiqarib tashlashga olib keladi. Bu so'rov talablariga javob beradi.

3. Quyi so‘rovlar

Quyi soʻrov. So'rov ichida so'rov

Quyi so'rov so'rovning WHERE bandiga joylashtirilishi mumkin, bu esa WHERE bandining imkoniyatlarini kengaytiradi. Bir misolni ko'rib chiqing.

So'rov: 435-binoga tayinlangan ishchilar qanday mutaxassisliklarga ega?

SKTLL_TYPE ni tanlang

WORKER_ID ISHLAB CHIQARGAN ISHCHIDAN

(ishchi_identifikatorini tanlang

QAYERDA BLDG_ID = 435)

Ushbu misolda quyi so'rov

(ishchi_identifikatorini tanlang

QAYERDA BLDG_ID = 435)

Pastki so'rovni o'z ichiga olgan so'rov chaqiriladi tashqi so'rov yoki asosiy so'rov. Quyi soʻrov natijasida quyidagi ishchi identifikatorlari toʻplami paydo boʻladi:

Ishchi ID

tashqi so'rov. Barcha quyi so'rovlarni o'z ichiga olgan asosiy so'rov.

Keyin bu identifikatorlar to'plami tashqi so'rovda pastki so'rov o'rnini egallaydi. Shu vaqtdan boshlab tashqi so'rov quyi so'rov tomonidan yaratilgan to'plam yordamida bajariladi. Tashqi so'rov WHERE bandiga muvofiq WORKER jadvalining har bir qatorini qayta ishlaydi. Agar qatorning WORKER_ID ko'rsatkichi quyi so'rov tomonidan yaratilgan (IN) to'plamida bo'lsa, u holda qatorning SKILL_TYPE tanlanadi va natijada paydo bo'lgan jadvalda ko'rsatiladi:

MAKORAT TURI

Shivachi

Tom yopish ustasi

Elektrchi

Quyi soʻrovning SELECT bandida WORKER_ID va faqat WORKER_ID boʻlishi juda muhim. Aks holda, tashqi soʻrovning WHERE bandi, yaʼni WORKER_ID ishchi identifikatorlari toʻplamida boʻlishini anglatmaydi.

E'tibor bering, pastki so'rov hatto bitta satr asosiy so'rov tomonidan ko'rib chiqilishidan oldin mantiqiy ravishda bajarilishi mumkin. Qaysidir ma'noda pastki so'rov asosiy so'rovdan mustaqildir. U to'liq so'rov sifatida bajarilishi mumkin. Biz aytamizki, bunday pastki so'rov asosiy so'rov bilan bog'liq emas. Yaqinda ko'rib chiqamiz, pastki so'rovlar o'zaro bog'liq bo'lishi mumkin.

O'zaro bog'liq bo'lmagan pastki so'rov. Qiymati hech qanday tashqi so'rovga bog'liq bo'lmagan pastki so'rov.

Quyida quyi so'rov ichidagi quyi so'rovga misol keltirilgan.

So'rov: Ofis binolariga tayinlangan ishchilar ro'yxati.

Biz yana bog'lanishni o'rgangan so'rovni ko'rib chiqamiz.

WORKER_MAME NI TANGLASH

WORKER_ID QAYERDA

(ishchi_identifikatorini tanlang

BLDG_ID QAYERDA

WHERE TYPE = "Ofis"))

Natija:

M. Faraday

G. Rikover

J.Advokat

Esda tutingki, ustun nomlari oldiga jadval nomlari bilan hech qanday joyda kerak emas, chunki har bir kichik so'rov bitta va faqat bitta jadvalni qayta ishlaydi, shuning uchun hech qanday noaniqlik bo'lishi mumkin emas.

So'rov ichkaridan tashqariga qarab tartibda bajariladi. Ya'ni, birinchi navbatda eng ichki so'rov (yoki "eng pastki"), keyin uni o'z ichiga olgan pastki so'rov, keyin esa tashqi so'rov bajariladi.

O'zaro bog'liq pastki so'rovlar. Yuqorida muhokama qilingan barcha quyi so'rovlar ular ishlatilgan asosiy so'rovlardan mustaqil edi. Mustaqillik deganda biz quyi so'rovlar to'liq so'rovlar sifatida mustaqil ravishda bajarilishi mumkinligini tushunamiz. Endi biz natijalari asosiy so'rov tomonidan ko'rib chiqilgan qatorga bog'liq bo'lishi mumkin bo'lgan pastki so'rovlar sinfiga murojaat qilamiz. Bunday pastki so'rovlar korrelyatsiya qilingan pastki so'rovlar deb ataladi.

O'zaro bog'liq pastki so'rov. Natijasi asosiy so'rov tomonidan ko'rib chiqilgan qatorga bog'liq bo'lgan pastki so'rov.

So'rov: Soatlik stavkalari menejerlarinikidan yuqori bo'lgan xodimlarni sanab o'ting.

ISHCHI_NAME NI TANlang

QAYERDA A.HRLY_RATE >

(B.HRLY_RATE

QAYERDA B.WORKER_ID = A.SUPV_ID)

Natija:

Ushbu so'rovni bajarish uchun mantiqiy qadamlar:

1. Tizim WORKER jadvalining ikkita nusxasini yaratadi: A nusxasi va B nusxasi. Biz ularni belgilagan usulga ko'ra, A ishchiga, B esa menejerga tegishli.

2. Keyin tizim har bir A qatorni ko'rib chiqadi. Bu qator WHERE bandini qanoatlantirsa, tanlanadi. Bu shart HRLY_RATE qiymati quyi soʻrov tomonidan yaratilgan HRLY_RATE qiymatidan katta boʻlsa, qator tanlanishini bildiradi.

3. Quyi so‘rov B qatordan HRLY_RATE qiymatini tanlaydi, uning WORKER_ID qiymati hozirda asosiy so‘rov tomonidan ko‘rib chiqilayotgan A qatorining SUPV_ID ga teng. Bu menejerning HRLY_RATE bahosi.

E'tibor bering, A.HRLY_RATE faqat bitta qiymat bilan solishtirilishi mumkin, pastki so'rov faqat bitta qiymatni qaytarishi kerak. Bu qiymat qaysi A qatori ko'rib chiqilayotganiga qarab o'zgaradi. Shunday qilib, pastki so'rov asosiy so'rov bilan bog'liq. O‘rnatilgan funksiyalarni o‘rganganimizda, o‘zaro bog‘liq pastki so‘rovlarning ko‘proq misollarini ko‘ramiz.

EXISTS va NOT EXISTS operatorlari

Aytaylik, biz binoda ishlash uchun tayinlanmagan ishchilarni aniqlamoqchimiz. Yuzaki qaraganda, bunday so'rovni so'rovning tasdiqlovchi versiyasini shunchaki inkor etish orqali osongina qilish mumkindek tuyuladi. Aytaylik, bizni BLDG_ID 435 bo'lgan bino qiziqtiradi. So'rovni ko'rib chiqing:

WORKER_ID NI TANLASH

BLDG_ID EMAS 435

Afsuski, bu yechimning noto'g'ri talqini. So'rov bizga boshqa binolarda ishlaydigan ishchilarning identifikatorlarini beradi. Shubhasiz, ularning ba'zilari 435-binoga ham tayinlanishi mumkin.

Yaxshi tuzilgan yechim NOT EXISTS operatoridan foydalanadi (mavjud):

WORKER_ID NI TANLASH

YO'Q QERDA

QAYERDA ASIGNMENT.WORKER_ID = WORKER.WORKER_ID VA

Natija:

WORKER_ID

EXISTS va NOT EXISTS operatorlari har doim pastki so'rovdan oldin joylashtiriladi. Agar quyi so'rov tomonidan yaratilgan to'plam bo'sh bo'lmasa, EXISTS rost deb baholanadi. Agar quyi so'rov tomonidan yaratilgan to'plam bo'sh bo'lsa, EXISTS noto'g'ri hisoblanadi. NOT EXISTS operatori, albatta, aksincha ishlaydi. Agar pastki so'rov natijasi bo'sh bo'lsa, bu to'g'ri, aks holda noto'g'ri.

EXISTS operatori. Natijalar to'plami bo'sh bo'lmasa, true qiymatini qaytaradi.

EMAS operator. Natijalar to'plami bo'sh bo'lsa, true qiymatini qaytaradi.

Ushbu misolda biz NOT EXISTS operatoridan foydalanganmiz. Quyi soʻrov ASSIGNMENT jadvalining barcha qatorlarini tanlaydi, bunda WORKER_ID asosiy soʻrov tomonidan koʻrib chiqilgan qator bilan bir xil va BLDG_ID 435 boʻladi. Agar bu toʻplam boʻsh boʻlsa, asosiy soʻrov tomonidan koʻrib chiqilgan ishchi qatori tanlanadi, chunki bu shuni anglatadiki bu ishchi 435-binoda ishlamaydi.

Bizning yechimimizda korrelyatsiya qilingan pastki so'rovdan foydalanish. Agar biz NOT EXISTS o‘rniga IN operatoridan foydalansak, biz o‘zaro bog‘liq bo‘lmagan quyi so‘rov bilan ishlaymiz:

WORKER_ID NI TANLASH

ISHCHI_ID KIRILMAYDI

(ishchi_identifikatorini tanlang

BLDG_ID = 435)

Bu yechim NOT EXISTS operatori bilan yechimga qaraganda oddiyroq. Tabiiy savol tug'iladi, nima uchun bizga MAVJUDLAR va umuman YO'QLAR kerak. Javob: MAVJUD YO‘Q bu shartda “har biri” so‘zini o‘z ichiga olgan so‘rovlarni hal qilishning yagona yo‘li. Bunday so‘rovlar relyatsion algebrada bo‘lish amali yordamida, relyatsion hisobda esa universal kvantifikator yordamida yechiladi. Shartda "har biri" so'zini o'z ichiga olgan so'rovga misol:

So'rov: Har bir binoga tayinlangan ishchilarni sanab o'ting.

Bu savol SQL da ikki tomonlama inkor yordamida amalga oshirilishi mumkin. Ikki marta salbiyni kiritish uchun so'rovni qayta shakllantiramiz:

So'rov: Kim uchun xodimlarni sanab o'ting emas ular tayinlanmagan bino bor.

Biz ikki tomonlama salbiyni ta'kidladik. Bu so'rov mantiqiy jihatdan oldingisiga teng ekanligi aniq.

Endi biz SQL da yechimni shakllantirmoqchimiz. Yakuniy yechimni tushunishni osonlashtirish uchun biz birinchi navbatda dastlabki muammoning echimini beramiz: gipotetik ishchi "1234" bo'lgan barcha binolarni aniqlash muammosi. emas tayinlangan.

(I) BLDG_ID ni tanlang

YO'Q QERDA

TOPSHIRISH.WORKER_ID = 1234)

Biz bu so‘rovni (I) belgisi bilan belgilab oldik, chunki keyinroq unga murojaat qilamiz. Agar ushbu talabni qondiradigan bino bo'lmasa, u holda har bir binoga 1234-sonli ishchi tayinlanadi va shuning uchun dastlabki so'rovning shartlarini qondiradi. Asl so'rovni hal qilish uchun biz so'rovni (I) aniq ishchi 1234 dan WORKER_ID o'zgaruvchisiga umumlashtirishimiz va bu o'zgartirilgan so'rovni kattaroq so'rovning pastki so'roviga aylantirishimiz kerak. Mana bir yechim:

(II) ISHLAB CHIQISH_IDNI TANGLASH

YO'Q QERDA

YO'Q QERDA

WHERE ASSIGNMENT.BLDG_ID = BUILDING.BLDG_ID VA

ASIGNMENT.WORKER_ID = WORKER.WORKER_ID)

Natija:

Ishchi ID

E'tibor bering, to'rtinchi so'rov qatoridan (II) boshlanadigan quyi so'rov "1234" WORKER.WORKER_ID bilan almashtirilgan so'rov (I) bilan bir xil. So'rov (II) quyidagicha o'qilishi mumkin:

Agar WORKER_ID tayinlanmagan bino boʻlmasa, WORKER dan WORKER_ID ni tanlang.

Bu asl so'rov shartlariga mos keladi.

Ko'ramizki, NOT EXISTS operatori relyatsion algebrada bo'linish operatsiyasini talab qiladigan so'rovlarni va relyatsion hisobda universal kvantatorni shakllantirish uchun ishlatilishi mumkin. Foydalanish qulayligi nuqtai nazaridan NOT EXISTS operatori hech qanday maxsus afzalliklarni ta'minlamaydi, ya'ni NOT EXISTS ni ikki marta ishlatadigan SQL so'rovlarini bo'lish amali bilan relyatsion algebra yechimlari yoki universal kvantifikatorga ega relyatsion hisob yechimlaridan ko'ra tushunish oson emas. Bunday so'rovlarni echishning tabiiy usulini ta'minlaydigan til konstruksiyalarini yaratish uchun ko'proq tadqiqotlar talab etiladi.

O'rnatilgan funktsiyalar

Ushbu turdagi savollarni ko'rib chiqing:

Maksimal va minimal soatlik tariflar qanday? Xodimlar 435-binoda o'rtacha qancha kun ishlaydi? 312-binodagi gips ishlari uchun jami kunlar soni qancha? Qancha turli mutaxassisliklar mavjud?

Ushbu savollarga javob berish uchun bir nechta jadval qatorlarini ko'rib chiqadigan va bitta qiymat hosil qiluvchi agregat funktsiyalar talab qilinadi. SQL-da beshta shunday funksiya mavjud bo'lib, ular o'rnatilgan funktsiyalar yoki o'rnatilgan funktsiyalar deb ataladi. Bular SUM (sum), AVG (o'rtacha), COUNT (hisoblash), MAX (maksimal) va MIN (minimal) funksiyalaridir.

Inline funksiyasi (funktsiyani o'rnatish). Bir nechta satrlarda ishlaydigan statistik funksiya: SUM (sum), AVG (o'rtacha), COUNT (hisoblash), MAX (maksimal), MIN (minimal).

So'rov: Maksimal va minimal soatlik tariflar qanday?

MAX (HRLY_RATE), MIN (HRLY_RATE) ni tanlang

Natija: 17.40, 8.20

MAX va MIN funksiyalari bitta jadval ustunida ishlaydi. Ular ushbu ustundan mos ravishda maksimal yoki minimal qiymatni tanlaydilar. Bizning so'rov formulasida WHERE bandi mavjud emas. Keyingi misolimiz ko'rsatganidek, aksariyat so'rovlar uchun bunday bo'lmasligi mumkin.

So'rov: Xodimlar 435-binoda o'rtacha qancha kun ishlaydi?

AVG TANLASH(NUM_DAYS)

QAYERDA BLDG_ID=435

Natija: 12.33

So'rov: 312-binodagi gips ishlari uchun jami kunlar soni qancha?

SUMMNI TANLASH(NUM_DAYS)

TASHQIQDAN, ISHCHI

WHERE WORKER.WORKER_ID = ASIGNMENT.WORKER_ID VA

SKILL_TYPE = "Gıvaschi" VA

Natija: 27

Yechim ASIGNMENT va WORKER jadvallari o'rtasidagi birlashmadan foydalanadi. Bu talab qilinadi, chunki SKILL_TYPE WORKER jadvalida va BLDG_ID ASSIGNMENT jadvalida joylashgan.

So'rov: Qancha turli mutaxassisliklar mavjud?

COUNT TANI (DISTINCT SKILL_TYPE)

Natija: 4

Xuddi shu ixtisoslik bir nechta turli qatorlarda takrorlanishi mumkinligi sababli, tizim bir xil mutaxassislik turini bir necha marta sanashga yo'l qo'ymaslik uchun ushbu so'rovda DISTINCT (turli) kalit so'zidan foydalanish kerak. DISTINCT operatoridan har qanday o'rnatilgan funksiyalar bilan foydalanish mumkin, garchi u MAX va MIN funksiyalari bilan ortiqcha bo'lsa ham.

AJROQ. Ikki nusxadagi qatorlarni istisno qiluvchi operator.

SUM va AVG funksiyalaridan faqat raqamli ustunlar bilan foydalanish kerak. Boshqa funksiyalar ham raqamli, ham belgilar ma'lumotlari bilan ishlatilishi mumkin. COUNT dan tashqari barcha funksiyalar hisoblangan ifodalar bilan ishlatilishi mumkin. Misol uchun:

So'rov: O'rtacha haftalik ish haqi qancha?

AVG (40*HRLY_RATE) TANLASH

Natija: 509.14

COUNT faqat bitta ustunga emas, balki butun qatorga murojaat qilishi mumkin :

So'rov: 3-darajali sifat darajasiga ega nechta bino bor?

COUNT TANI (*)

Binodan

Natija: 3

Bu barcha misollar ko'rsatadiki, agar SELECT buyrug'ida o'rnatilgan funksiya mavjud bo'lsa, unda bu SELECT buyrug'ida boshqa hech narsa bo'lishi mumkin emas. Bu qoidadan yagona istisno GROUP BY bandi bo‘lib, biz uni birozdan keyin ko‘rib chiqamiz.

GROUP BY va HAVING iboralari

Boshqaruvda ko'p guruhlardagi har bir guruh haqida statistik ma'lumotlar ko'pincha talab qilinadi. Masalan, quyidagi so'rovni ko'rib chiqing:

So'rov: Har bir menejer uchun uning qo'l ostidagilar orasida soatlik maksimal stavkani aniqlang.

Ushbu muammoni hal qilish uchun biz ishchilarni rahbarlariga ko'ra guruhlarga bo'lishimiz kerak. Keyin har bir guruh ichidagi maksimal garovni aniqlaymiz. SQL da u quyidagicha amalga oshiriladi:

SUPV_ID BO'YICHA GURUHLASH

Natija:

SUPV_IDMAX(HRLY RATE)

Ushbu so'rovni qayta ishlashda tizim birinchi navbatda WORKER jadvalining qatorlarini quyidagi qoida bo'yicha guruhlarga ajratadi. Qatorlar bir xil guruhga joylashtiriladi, agar ular bir xil SUPV_IDga ega bo'lsa. Keyin har bir guruhga SELECT bandi qo'llaniladi. Ushbu guruhda faqat bitta SUPV_ID qiymati bo'lgani uchun guruhda SUPV_ID noaniqlik yo'q. Har bir guruh uchun SELECT iborasi SUPV_IDni chiqaradi, shuningdek MAX(HRLY_RATE) qiymatini hisoblab chiqadi va chiqaradi. Natija yuqorida keltirilgan.

O'rnatilgan funktsiyalarga ega SELECT iborasida faqat GROUP BY bandiga kiritilgan ustunlar paydo bo'lishi mumkin. E'tibor bering, SUPV_ID SELECT iborasida ishlatilishi mumkin, chunki u GROUP BY bandiga kiritilgan.

GROUP BY iborasi. Ko'rsatilgan ustun(lar)ning umumiy qiymatlari bilan qatorlarni guruhlarga bo'lish kerakligini ko'rsatadi.

GROUP BY bandi muayyan murakkab hisob-kitoblarni bajarishga imkon beradi. Misol uchun, biz ushbu maksimal takliflarning o'rtacha qiymatini bilishni xohlashimiz mumkin. Biroq, o'rnatilgan funktsiyalar bilan hisob-kitoblar cheklangan, chunki boshqa o'rnatilgan funktsiyalar ichida o'rnatilgan funktsiyalardan foydalanishga ruxsat berilmaydi. Shunday qilib, o'xshash ifoda

AVG(MAX(HRLY_RATE))

taqiqlangan. Bunday so'rovni amalga oshirish ikki bosqichdan iborat bo'ladi. Birinchidan, biz maksimal takliflarni yangi jadvalga qo'yishimiz kerak, ikkinchi bosqichda esa ularning o'rtacha qiymatini hisoblashimiz kerak.

GROUP BY buyrug'i bilan siz WHERE buyrug'idan foydalanishingiz mumkin:

So'rov: Har bir bino turi uchun 1-maqomdagi binolar orasida sifatning o'rtacha darajasini aniqlang.

TURNI TANLASH, AVG(QLTY_LEVEL)

QAYERDA STATUS = 1

Natija:

TYPEAVG(QLTY_LEVEL)

1-do'kon

Turar-joy binosi 3

WHERE bandi GROUP BY buyrug'idan oldin bajariladi. Shunday qilib, hech bir guruh 1 dan boshqa holatga ega bo'lgan qatorni o'z ichiga olmaydi. 1-holat qatorlari TYPE bo'yicha guruhlanadi va keyin har bir guruhga SELECT bandi qo'llaniladi.

HAVING iborasi. Guruhlarga shartlar qo'yadi.

GROUP BY bandi bo'yicha yaratilgan guruhlarga shartlarni ham qo'llashimiz mumkin. Bu HAVING bandi bilan amalga oshiriladi. Misol uchun, biz oldingi so'rovlardan birini bajarishga qaror qildik, deylik:

So'rov: Bir nechta bo'ysunuvchiga ega bo'lgan har bir menejer uchun uning qo'l ostidagilar orasida soatlik maksimal stavkani aniqlang.

Biz ushbu shartni tegishli HAVING buyrug'i bilan aks ettirishimiz mumkin:

SUPV_ID, MAX (HRLY_RATE)

SUPV_ID BO'YICHA ISHCHI GURUHIDAN

COUNT(*) > 1

Natija:

SUPV_ID MAX (HRLY_RATE)

WHERE va HAVING bandlarining farqi shundaki, WHERE qatorlarga, HAVING esa guruhlarga tegishli.

So‘rovda WHERE bandi ham, HAVING bandi ham bo‘lishi mumkin. Bunda birinchi navbatda WHERE bandi baholanadi, chunki u guruhlashdan oldin baholanadi. Misol uchun, oldingi so'rovning quyidagi o'zgarishini ko'rib chiqing:

So'rov: Har bir turdagi binolar uchun 1-maqomdagi binolar orasida o'rtacha sifat darajasini aniqlang. Faqat maksimal sifat darajasi 3 dan oshmaydigan binolar turlarini ko'rib chiqing.

TURNI TANLASH, AVG(QLTY_JLEVEL)

QAYERDA STATUS = 1

MAXS (QLTY_LEVEL)<= 3

Natija:

TYPEAVG(QLTY_LEVEL)

1-do'kon

Turar-joy binosi 3

E'tibor bering, FROM bandidan boshlab, iboralar tartibda bajariladi va keyin SELECT bandi qo'llaniladi. Misol uchun, WHERE bandi BUILDING jadvaliga qo'llaniladi va STATUS 1 bo'lmagan barcha qatorlar o'chiriladi. Qolgan qatorlar TYPE bo'yicha guruhlangan; bir xil TYPE qiymatiga ega bo'lgan barcha qatorlar bir xil guruhda tugaydi. Bu har bir TYPE qiymati uchun bir nechta guruhlarni yaratadi. Keyin har bir guruhga HAVING bandi qo'llaniladi va maksimal sifat darajasi qiymati 3 dan katta bo'lgan guruhlar olib tashlanadi. Nihoyat, qolgan guruhlarga SELECT bandi qo'llaniladi.

7. O'rnatilgan funksiyalar va pastki so'rovlar

O'rnatilgan funksiyalardan faqat SELECT bandida yoki HAVING bayonotida foydalanish mumkin. Biroq, ichki funksiyani o'z ichiga olgan SELECT bandi quyi so'rovning bir qismi bo'lishi mumkin. Bunday quyi so'rovning misolini ko'rib chiqing:

So'rov: Qaysi xodimning soatlik ish haqi o'rtachadan yuqori?

ISHCHI_NAME NI TANlang

QAYERDA HRLY_RATE >

(OVG (HRLY_RATE)

Natija:

X. Kolumb

E'tibor bering, pastki so'rov asosiy so'rov bilan bog'liq emas. Quyi so'rov aynan bitta qiymatni qaytaradi - o'rtacha soatlik tarif. Asosiy so'rov ishchini faqat uning taklifi hisoblangan o'rtacha qiymatdan kattaroq bo'lsa tanlaydi.

O'zaro bog'liq so'rovlar o'rnatilgan funktsiyalardan ham foydalanishi mumkin:

So'rov: Xodimlardan qaysi biri bir xil rahbarning qo'l ostidagilar orasida soatlik ish haqi o'rtacha soatlik stavkadan yuqori?

Bunday holda, barcha xodimlar uchun bitta o'rtacha soatlik stavkani hisoblash o'rniga, biz bir xil menejerga hisobot beradigan har bir ishchi guruhi uchun o'rtacha soatlik stavkani hisoblashimiz kerak. Bundan tashqari, bizning hisob-kitobimiz asosiy so'rov bo'yicha ko'rib chiqilgan har bir ishchi uchun yana amalga oshirilishi kerak:

A. WORKER_NAME NI TANlang

Ushbu qo'llanmada siz SQL-dan qanday foydalanishni o'rganasiz MAVJUD holat sintaksis va misollar bilan.

Tavsif

SQL EXISTS bandi quyi soʻrov bilan birgalikda qoʻllaniladi va agar quyi soʻrov kamida bitta qatorni qaytarsa, qanoatlangan deb hisoblanadi. Undan SELECT, INSERT, UPDATE yoki DELETE iboralarida foydalanish mumkin.

Sintaksis

SQL da EXISTS sharti sintaksisi:

Variantlar yoki argumentlar

pastki so'rov quyi so'rovi SELECT bayonotidir. Agar quyi so'rov natijalari to'plamida kamida bitta yozuvni qaytarsa, EXISTS bandi rost deb baholanadi va EXISTS sharti bajariladi. Agar quyi so'rov hech qanday yozuvni qaytarmasa, EXISTS bandi noto'g'ri deb baholanadi va EXISTS sharti bajarilmaydi.

Eslatma

EXISTS bandidan foydalangan holda SQL iboralari juda samarasiz, chunki pastki so'rov tashqi so'rovlar jadvalidagi HAR Qator uchun qayta ishga tushiriladi. EXISTS bandidan foydalanmaydigan ko‘pgina so‘rovlarni yozishning samaraliroq usullari mavjud.

Misol - EXISTS shartidan SELECT bayonoti bilan foydalanish

Keling, EXISTS shartidan SELECT operatori bilan qanday foydalanishni ko'rsatadigan misoldan boshlaylik.

Ushbu misolda bizda quyidagi ma'lumotlarga ega mijozlar jadvali mavjud:

Endi buyurtmalar jadvalida bir xil customer_id bilan kamida bitta yozuv mavjud bo'lgan mijozlar jadvalidagi barcha yozuvlarni topamiz. Quyidagi SELECT so'rovini bajaring:

4 ta ariza tanlanadi. Mana siz olishingiz kerak bo'lgan natijalar:

customer_id ism familiya sevimli_veb-sayt
4000 Jastin Biber google.com
5000 Selena Gomes bing.com
7000 Tom Kruiz oracle.com
8000 Jonni Depp NULL

Ushbu misolda mijozlar jadvalida buyurtmalar jadvalida customer_id qiymatiga ega 4 ta yozuv mavjud.

Misol - EXISTS shartidan UPDATE bayonoti bilan foydalanish

UPDATE bayonotida EXISTS bandidan foydalanadigan misolni ko'rib chiqaylik.
Ushbu misolda bizda quyidagi ma'lumotlarga ega mahsulotlar jadvali mavjud:

Keling, summary_data jadvalini mahsulotlar jadvalidagi qiymatlar bilan yangilaymiz. Quyidagi SQL bayonotini kiriting:

PgSQL

5 ta yozuv yangilanadi. summary_data jadvalidan ma'lumotlarni yana tanlang:

PgSQL

Xulosa_ma'lumotlardan * TANLASH;

Ushbu misol summary_ma'lumotlar jadvalidagi joriy_toifa maydonini mahsulot_id qiymatlari mos keladigan mahsulotlar jadvalidagi kategoriya_id bilan yangilaydi. summary_data jadvalidagi dastlabki 5 ta yozuv yangilandi.

taklif: Agar biz EXISTS bandini qo'shmagan bo'lsak, YANGILANISH so'rovi summary_data jadvalining 6-qatoridagi joriy_toifa maydonini NULLga yangilaydi (chunki mahsulotlar jadvalida product_id = 8 bo'lgan yozuv yo'q).

Misol - EXISTS shartidan DELETE bayonoti bilan foydalanish

DELETE operatorida EXISTS shartidan foydalanadigan misolni ko'rib chiqamiz.

Ushbu misolda bizda quyidagi ma'lumotlarga ega mijozlar jadvali mavjud:

Quyidagi DELETE bayonotini kiriting:

PgSQL

1 ta yozuv oʻchiriladi. Buyurtmalar jadvalidan ma'lumotlarni yana tanlang:

PgSQL

Buyurtmalardan * TANLASH;

Buyurtmalardan *TANGLASH;

Mana siz olishingiz kerak bo'lgan natijalar.