uy - Dasturiy ta'minot
Har bir dasturchi bilishi kerak bo'lgan asosiy SQL buyruqlari. Ma'lumotlar bazasi va subd nima? Mavjud ma'lumotlar bazalarini ko'rish


Jurnalimizning 6 va 7-sonlarida chop etilgan ushbu turkumning oldingi ikkita maqolasida biz ma'lumotlarga kirishning turli mexanizmlarini, jumladan ADO, BDE va ​​ularning muqobillarini ko'rib chiqdik. Endi biz ma'lum bir "DBMS - ishlab chiqish vositasi" juftligi uchun ma'lumotlarga kirish texnologiyasini qanday tanlashni bilamiz.

Ma'lumotlarga kirish texnologiyasi bilan biz nihoyat ma'lumotlar va metama'lumotlarning o'zini qanday boshqarish kerakligi haqida o'ylashimiz mumkin. Manipulyatsiya usullari ma'lum ma'lumotlar bazasiga (masalan, ma'lumotlar bazasi ob'ektlariga kirish uchun ushbu ma'lumotlar bazasining mijoz qismidagi ob'ektlardan foydalanish) yoki ma'lumotlarga kirish mexanizmiga xos bo'lishi mumkin. Shunga qaramay, deyarli barcha server relyatsion DBMSlar va ma'lumotlarga kirishning ko'pgina universal mexanizmlari (jumladan, ish stoli ma'lumotlar bazasi ma'lumotlar bazasi bilan birgalikda foydalanilganda) tomonidan qo'llab-quvvatlanadigan ma'lumotlarni manipulyatsiya qilishning ko'proq yoki kamroq universal usuli mavjud. Bu usul SQL tilidan (Structured Query Language) foydalanishdir. Quyida biz ushbu tilning maqsadi va xususiyatlarini ko'rib chiqamiz, shuningdek, ma'lumotlarni ajratib olish va umumlashtirish, yozuvlarni qo'shish, o'chirish va o'zgartirish, ma'lumotlarni ruxsatsiz kirishdan himoya qilish va ma'lumotlar bazalarini yaratish uchun qanday foydalanishni o'rganamiz. SQLni batafsilroq o'rganish uchun biz Martin Graberning "SQLga kirish" (M., Laurie, 1996) va "SQL." kitoblarini tavsiya qilishimiz mumkin. Ma'lumot uchun qo'llanma" (M., Lori, 1997).

Kirish

Strukturaviy so'rovlar tili - relyatsion DBMSlarda ma'lumotlarni boshqarish uchun ishlatiladigan protsessual bo'lmagan til. "Protsessual bo'lmagan" atamasi ma'lum bir til ma'lumotlar bilan nima qilish kerakligini shakllantirishi mumkinligini anglatadi, ammo u buni qanday qilishni aniq ko'rsata olmaydi. Boshqacha qilib aytganda, bu tilda teglar, tsikl operatorlari, shartli o'tishlar va boshqalar kabi algoritmik tuzilmalar mavjud emas.

SQL tili 70-yillarning boshlarida IBM tadqiqot loyihasi natijasida yaratilgan boʻlib, uning maqsadi relyatsion maʼlumotlarni manipulyatsiya qilish uchun til yaratish edi. U dastlab SEQUEL (Structured English Query Language), keyin SEQUEL/2, keyin esa oddiygina SQL deb nomlangan. Rasmiy SQL standarti 1986 yilda ANSI (Amerika Milliy Standartlar Instituti, AQSH) tomonidan nashr etilgan (bu bugungi kunda SQLning eng koʻp qoʻllaniladigan ilovasi). Ushbu standart 1989 va 1992 yillarda kengaytirilgan, shuning uchun so'nggi SQL standarti SQL92 deb nomlanadi. Hozirda SQL3 standarti ustida ish olib borilmoqda, u ba'zi ob'ektga yo'naltirilgan kengaytmalarni o'z ichiga oladi.

ANSI muvofiqligining uchta darajasi mavjud - boshlang'ich, o'rta va to'liq. IBM, Informix, Microsoft, Oracle va Sybase kabi ko'pgina server ma'lumotlar bazasi sotuvchilari ANSI standartiga asoslangan (hech bo'lmaganda standartga moslikning dastlabki darajasiga javob beradigan) va ma'lumotlar bazasiga xos bo'lgan ba'zi kengaytmalarni o'z ichiga olgan o'zlarining SQL ilovalaridan foydalanadilar.

Muayyan ma'lumotlar bazasida ishlatiladigan SQL versiyasining muvofiqligi haqida batafsil ma'lumotni ushbu ma'lumotlar bazasi bilan ta'minlangan hujjatlarda topish mumkin.

SQL qanday ishlaydi

Keling, SQL qanday ishlashini ko'rib chiqaylik. Faraz qilaylik, ma'lumotlar bazasi qandaydir ma'lumotlar bazasidan foydalangan holda boshqariladi. Undan ma'lumotlarni olish uchun SQLda tuzilgan so'rov ishlatiladi. DBMS ushbu so'rovni qayta ishlaydi, so'ralgan ma'lumotlarni oladi va uni qaytaradi. Ushbu jarayon sxematik tarzda rasmda tasvirlangan. 1 .

Keyinchalik ko'rib chiqamizki, SQL nafaqat ma'lumotlarni olish, balki ma'lumotlar strukturasini aniqlash, ma'lumotlarni qo'shish va o'chirish, ma'lumotlarga kirishni cheklash yoki ruxsat berish, havolalar yaxlitligini saqlash imkonini beradi.

E'tibor bering, SQLning o'zi na DBMS, na alohida mahsulot emas. Bu DBMS bilan o'zaro aloqa qilish uchun ishlatiladigan til va ma'lum ma'noda uning ajralmas qismidir.

Ma'lumotlarni aniqlash tili (DDL)

Ma'lumotlarni aniqlash tili ma'lumotlar bazalari va ulardagi ob'ektlarni (jadvallar, ko'rinishlar va boshqalar) yaratish, o'zgartirish va yo'q qilish imkonini beruvchi operatorlarni o'z ichiga oladi. Ushbu operatorlar jadvalda keltirilgan. 1.

1-jadval

Operator

Tavsif

Ma'lumotlar bazasiga yangi jadval qo'shish uchun ishlatiladi

Ma'lumotlar bazasidan jadvalni olib tashlash uchun ishlatiladi

Mavjud jadvalning tuzilishini o'zgartirish uchun ishlatiladi

Ma'lumotlar bazasiga yangi ko'rinish qo'shish uchun foydalaniladi

Ko'rinishni ma'lumotlar bazasidan olib tashlash uchun ishlatiladi

Berilgan maydon uchun indeks yaratish uchun foydalaniladi

Mavjud indeksni o'chirish uchun ishlatiladi

Ma'lumotlar bazasida yangi sxema yaratish uchun foydalaniladi

Ma'lumotlar bazasidan sxemani olib tashlash uchun ishlatiladi

Yangi domen yaratish uchun foydalaniladi

Domenni qayta belgilash uchun foydalaniladi

Domenni ma'lumotlar bazasidan olib tashlash uchun foydalaniladi

Ma'lumotlarni manipulyatsiya qilish tili (DML)

Ma'lumotlarni manipulyatsiya qilish tili ma'lumotlarni tanlash, qo'shish, o'chirish va o'zgartirish imkonini beruvchi operatorlarni o'z ichiga oladi. E'tibor bering, ushbu bayonotlar ular chaqirilgan operatsiyani bajarish uchun talab qilinmaydi. DML bayonotlari jadvalda keltirilgan. 2.

jadval 2

SELECT iborasi ba'zan Data Query Language (DQL) deb nomlangan alohida toifaga tasniflanadi.

Kursorni boshqarish tili (CCL)

Kursorni boshqarish tili iboralari kursorni aniqlash, SQL operatorlarini bajarishga tayyorlash va boshqa bir qancha operatorlar uchun ishlatiladi. CCL bayonotlari jadvalda keltirilgan. 5.

5-jadval

Operator

Tavsif

So'rov uchun kursorni aniqlash uchun ishlatiladi

So'rov rejasini tavsiflash uchun ishlatiladi. Ushbu bayonot Microsoft SQL Server 7.0 uchun SQL kengaytmasi hisoblanadi. Boshqa DBMSlarda ishga tushirish talab qilinmaydi. Masalan, Oracle dasturida EXPLAIN PLAN bayonotidan foydalanish kerak

So'rov natijalarini olishda kursorni ochish uchun ishlatiladi

So'rov natijalaridan satr olish uchun foydalaniladi

Kursorni yopish uchun ishlatiladi

SQL bayonini bajarish uchun tayyorlash uchun foydalaniladi

SQL bayonotini bajarish uchun ishlatiladi

Tayyor so'rovni tasvirlash uchun ishlatiladi

Barcha SQL iboralari rasmda ko'rsatilgan shaklga ega. 2.

Har bir SQL iborasi fe'l bilan boshlanadi, bu gap nima qilishini ko'rsatuvchi kalit so'zdir (SELECT, INSERT, DELETE...). Bayonotda, shuningdek, operatsiyalar qanday ma'lumotlarda bajarilganligi haqidagi ma'lumotlarni o'z ichiga olgan jumlalar mavjud. Har bir band FROM, WHERE va boshqalar kabi kalit so'z bilan boshlanadi. Gapning tuzilishi uning turiga bog'liq - ba'zi bandlar jadval yoki maydon nomlarini o'z ichiga oladi, ba'zilarida qo'shimcha kalit so'zlar, doimiylar yoki ifodalar bo'lishi mumkin.

SQL bayonotlarini qanday bajarish mumkin?

Barcha zamonaviy server ma'lumotlar bazasida (shuningdek, ko'plab mashhur ish stoli ma'lumotlar bazasida) SQL operatorini bajarish va uning natijasini ko'rish imkonini beruvchi yordamchi dasturlar mavjud. Xususan, Oracle mijoz qismida SQL Plus yordam dasturi, Microsoft SQL Serverda esa SQL Query Analyzer yordam dasturi mavjud. Aynan shu yordamchi dastur biz SQL imkoniyatlarini namoyish qilish uchun foydalanamiz va biz "tajriba o'tkazadigan" ma'lumotlar bazasi sifatida Microsoft SQL Server 7.0 paketiga kiritilgan NorthWind ma'lumotlar bazasini olamiz. Asosan, siz ushbu ma'lumotlar bazasida SQL iboralarini bajara oladigan va natijalarni ko'rsatadigan boshqa ma'lumotlar bazasidan va boshqa yordam dasturidan foydalanishingiz mumkin (yoki hatto har qanday ishlab chiqish vositasidan foydalanib o'zingizni yozishingiz mumkin - Visual Basic, Delphi, C++Builder va boshqalar). Biroq, har qanday holatda, ushbu ma'lumotlar bazasini zaxiralash tavsiya etiladi.

SQL tili ma'lumotlar bazasidan ma'lumotlarni olish uchun ishlatiladi. SQL - bu ingliz tiliga juda o'xshash, ammo ma'lumotlar bazasini boshqarish dasturlari uchun mo'ljallangan dasturlash tili. Access-dagi har bir so'rovda SQL ishlatiladi.

SQL qanday ishlashini tushunish aniqroq so'rovlarni yaratishga yordam beradi va noto'g'ri natijalarni qaytaradigan so'rovlarni tuzatishni osonlashtiradi.

Bu Access uchun SQL tili haqidagi maqolalar turkumidan. U ma'lumotlarni olish uchun SQL dan foydalanish asoslarini tavsiflaydi va SQL sintaksisiga misollar keltiradi.

Ushbu maqolada

SQL nima?

SQL - bu faktlar to'plami va ular o'rtasidagi munosabatlar bilan ishlash uchun mo'ljallangan dasturlash tili. Microsoft Office Access kabi relyatsion ma'lumotlar bazasini boshqarish dasturlari ma'lumotlarni manipulyatsiya qilish uchun SQL-dan foydalanadi. Ko'pgina dasturlash tillaridan farqli o'laroq, SQL hatto yangi boshlanuvchilar uchun ham o'qilishi va tushunarli. Ko'pgina dasturlash tillari singari, SQL ham ISO va ANSI kabi standartlar qo'mitalari tomonidan tan olingan xalqaro standartdir.

Ma'lumotlar to'plamlari savollarga javob berish uchun SQLda tasvirlangan. SQL-dan foydalanganda siz to'g'ri sintaksisdan foydalanishingiz kerak. Sintaksis - bu til elementlarini to'g'ri birlashtirishga imkon beradigan qoidalar to'plami. SQL sintaksisi ingliz sintaksisiga asoslangan va ko'plab elementlarni Visual Basic for Applications (VBA) sintaksisi bilan baham ko'radi.

Misol uchun, Meri ismli kontaktlar uchun familiyalar ro'yxatini oladigan oddiy SQL bayonoti quyidagicha ko'rinishi mumkin:

Familiya_Ismni tanlang
FROM Kontaktlar
WHERE First_Name = "Maryam";

Eslatma: SQL tili nafaqat ma'lumotlar ustida operatsiyalarni bajarish uchun, balki ma'lumotlar bazasi ob'ektlari, masalan, jadvallar tuzilishini yaratish va o'zgartirish uchun ham qo'llaniladi. Ma'lumotlar bazasi ob'ektlarini yaratish va o'zgartirish uchun ishlatiladigan SQL qismi DDL deb ataladi. Ushbu maqolada DDL ko'rib chiqilmaydi. Qo'shimcha ma'lumot olish uchun ma'lumotlarni aniqlash so'rovi yordamida jadvallar yoki indekslarni yaratish yoki o'zgartirishga qarang.

SELECT bayonotlari

SELECT iborasi SQL-da ma'lumotlar to'plamini tavsiflash uchun ishlatiladi. U ma'lumotlar bazasidan olinishi kerak bo'lgan ma'lumotlar to'plamining to'liq tavsifini o'z ichiga oladi, jumladan:

    ma'lumotlarni o'z ichiga olgan jadvallar;

    turli manbalardan olingan ma'lumotlar o'rtasidagi aloqalar;

    ma'lumotlar tanlangan maydonlar yoki hisoblar;

    so'rov natijasiga kiritilgan ma'lumotlar tomonidan bajarilishi kerak bo'lgan tanlov shartlari;

    saralash zarurati va usuli.

SQL bayonotlari

SQL bayonoti jumlalar deb ataladigan bir nechta qismlardan iborat. SQL bayonotidagi har bir bandning maqsadi bor. Ba'zi takliflar talab qilinadi. Quyidagi jadvalda eng ko'p ishlatiladigan SQL iboralari ko'rsatilgan.

SQL bayonoti

Tavsif

Majburiy

Kerakli ma'lumotlarni o'z ichiga olgan maydonlarni belgilaydi.

SELECT bandida ko'rsatilgan maydonlarni o'z ichiga olgan jadvallarni belgilaydi.

Natijalarga kiritilgan barcha yozuvlar mos kelishi kerak bo'lgan maydonni tanlash shartlarini belgilaydi.

Natijalarning tartiblash tartibini aniqlaydi.

Birlashtirish funksiyalarini o'z ichiga olgan SQL bayonotida SELECT bandida yig'ma qiymat hisoblanmaydigan maydonlarni belgilaydi.

Faqat bunday maydonlar mavjud bo'lsa

Birlashtirish funktsiyalarini o'z ichiga olgan SQL bayonoti SELECT bandida xulosa qiymati hisoblangan maydonlarga tegishli shartlarni belgilaydi.

SQL shartlari

Har bir SQL jumlasi nutq qismlari bilan taqqoslanadigan atamalardan iborat. Quyidagi jadvalda SQL atamalarining turlari ko'rsatilgan.

SQL atamasi

Gapning solishtirma qismi

Ta'rif

Misol

identifikator

ism

Ma'lumotlar bazasi ob'ektini aniqlash uchun ishlatiladigan nom, masalan, maydon nomi.

Mijozlar.[Telefon raqami]

operator

fe'l yoki ergash gap

Harakatni ifodalovchi yoki o‘zgartiruvchi kalit so‘z.

doimiy

ism

Raqam yoki NULL kabi o'zgarmas qiymat.

ifoda

sifatdosh

Yagona qiymatni hisoblash uchun mo'ljallangan identifikatorlar, operatorlar, konstantalar va funktsiyalarning kombinatsiyasi.

>= Mahsulotlar.[Narx]

Asosiy SQL bandlari: SELECT, FROM va WHERE

SQL bayonotlarining umumiy formati:

1-maydonni tanlang
1-jadvaldan
WHERE mezoni_1
;

Eslatmalar:

    Access SQL iboralaridagi qator uzilishlarini hurmat qilmaydi. Shunga qaramay, har bir jumlani yangi satrdan boshlash tavsiya etiladi, shunda SQL bayoni uni yozgan odam uchun ham, boshqalar uchun ham oson o'qilishi mumkin.

    Har bir SELECT iborasi nuqta-vergul (;) bilan tugaydi. Nuqtali vergul oxirgi jumlaning oxirida yoki SQL bayonotining oxirida alohida satrda paydo bo'lishi mumkin.

Access-dagi misol

Quyidagi misol oddiy tanlash so'rovi uchun SQL bayonoti Access-da qanday ko'rinishini ko'rsatadi.

1. SELECT bandi

2. FROM bandi

3. WHERE bandi

Keling, SQL sintaksisi qanday ishlashini tushunish uchun misol jumlalarini ko'rib chiqaylik.

SELECT bandi

SELECT, Kompaniya

Bu SELECT bandi. U ikkita identifikatordan keyin ("[E-pochta manzili]" va "Kompaniya") (tanlash) bayonotidan iborat.

Agar identifikatorda bo'shliqlar yoki maxsus belgilar (masalan, "Elektron pochta manzili") bo'lsa, u to'rtburchaklar qavs ichiga olinishi kerak.

SELECT bandi sizdan maydonlarni o'z ichiga olgan jadvallarni ko'rsatishni talab qilmaydi va siz natijalarga kiritilgan ma'lumotlar tomonidan bajarilishi kerak bo'lgan tanlov shartlarini belgilay olmaysiz.

SELECT gapida SELECT bandi har doim FROM bandidan oldin keladi.

FROM bandi

FROM Kontaktlar

Bu FROM bandidir. U (FROM) bayonotidan keyin identifikatorni (Kontaktlar) o'z ichiga oladi.

FROM bandi tanlash uchun maydonlarni belgilamaydi.

WHERE bandi

WHERE City="Sietl"

Bu WHERE bandi. Unda (QAYER) iborasi, undan keyin (Shahar="Rostov") ifodasi mavjud.

SELECT, FROM va WHERE bandlari bilan ko'p narsalarni qilishingiz mumkin. Ushbu takliflardan foydalanish haqida ko'proq ma'lumot olish uchun quyidagi maqolalarga qarang:

Natijalarni saralash: ORDER BY

Microsoft Excel singari, Access ham jadvaldagi so'rov natijalarini saralash imkonini beradi. ORDER BY bandidan foydalanib, so'rov bajarilganda natijalar qanday tartiblanishini ham belgilashingiz mumkin. Agar ORDER BY bandi ishlatilsa, u SQL bayonotining oxirida paydo bo'lishi kerak.

ORDER BY bandi saralash qo'llaniladigan tartibda saralanadigan maydonlar ro'yxatini o'z ichiga oladi.

Misol uchun, siz avval natijalarni Kompaniya maydoni bo'yicha kamayish tartibida saralashni xohlaysiz, so'ngra bir xil Kompaniya maydoni qiymatiga ega yozuvlar mavjud bo'lsa, ularni elektron pochta manzili maydoni bo'yicha o'sish tartibida tartiblang. ORDER BY bandi quyidagicha ko'rinadi:

DESC kompaniyasi tomonidan buyurtma,

Eslatma: Odatiy bo'lib, Access qiymatlarni o'sish tartibida (A dan Z gacha, eng kichikdan kattagacha) tartiblaydi. Buning o'rniga qiymatlarni kamayish tartibida saralash uchun siz DESC kalit so'zini ko'rsatishingiz kerak.

ORDER BY bandi haqida qo'shimcha ma'lumot olish uchun ORDER BY bandi maqolasiga qarang.

Xulosa ma'lumotlari bilan ishlash: GROUP BY va HAVING bandlari

Ba'zan siz umumiy ma'lumotlar bilan ishlashingiz kerak bo'ladi, masalan, oyning umumiy savdosi yoki stokdagi eng qimmat narsalar. Buning uchun SELECT bandi maydonga agregat funktsiyasini qo'llaydi. Misol uchun, agar siz har bir kompaniya uchun elektron pochta manzillari sonini olish uchun so'rovni bajarmoqchi bo'lsangiz, SELECT bandi quyidagicha ko'rinishi mumkin:

Muayyan agregat funktsiyasidan foydalanish qobiliyati maydondagi ma'lumotlar turiga va kerakli ifodaga bog'liq. Mavjud agregat funktsiyalar haqida ko'proq ma'lumot olish uchun SQL statistik funktsiyalariga qarang.

Agregat funksiyada ishlatilmaydigan maydonlarni belgilash: GROUP BY bandi

Agregat funktsiyalardan foydalanganda siz odatda GROUP BY bandini yaratishingiz kerak bo'ladi. GROUP BY bandi agregat funktsiyasi qo'llanilmaydigan barcha maydonlarni belgilaydi. Agar jamlash funktsiyalari so'rovning barcha maydonlariga tegishli bo'lsa, GROUP BY bandini yaratishingiz shart emas.

GROUP BY bandi WHERE bandi bo'lmasa, WHERE yoki FROM bandidan keyin darhol kelishi kerak. GROUP BY bandi maydonlarni SELECT bandi bilan bir xil tartibda sanab beradi.

Oldingi misolni davom ettiramiz. SELECT bandida jamlash funksiyasi faqat [Email Address] maydoniga tegishli boʻlsa, GROUP BY bandi quyidagicha koʻrinadi:

Kompaniya bo'yicha guruhlash

GROUP BY bandi haqida koʻproq maʼlumot olish uchun GROUP BY bandi maqolasiga qarang.

Guruhlash shartlaridan foydalangan holda yig'ilgan qiymatlarni cheklash: HAVING bandi

Agar siz natijalarni cheklash uchun shartlarni belgilashingiz kerak bo'lsa, lekin siz ularni qo'llamoqchi bo'lgan maydon agregat funksiyada ishlatilsa, siz WHERE bandidan foydalana olmaysiz. Buning o'rniga HAVING bandidan foydalanish kerak. HAVING bandi WHERE bandi bilan bir xil ishlaydi, lekin jamlangan ma'lumotlar uchun ishlatiladi.

Misol uchun, AVG funktsiyasi (o'rtacha hisoblovchi) SELECT bandidagi birinchi maydonga qo'llaniladi, deylik:

SELECT COUNT(), Kompaniya

Agar siz so'rov natijalarini COUNT funktsiyasi qiymatiga qarab cheklashni istasangiz, WHERE bandidagi ushbu maydonga tanlash shartini qo'llay olmaysiz. Buning o'rniga shart HAVING bandiga joylashtirilishi kerak. Misol uchun, agar kompaniyada bir nechta elektron pochta manzillari bo'lsa, so'rovingiz qatorlarni qaytarishini istasangiz, quyidagi HAVING bandidan foydalanishingiz mumkin:

HAVING COUNT()>1

Eslatma: So'rov WHERE bandida ko'rsatilgan statistik funktsiyalarda foydalanilmaydigan maydonlarni tanlash shartlari va HAVING bandidagi statistik funktsiyalarda ishlatiladigan maydonlar uchun shartlar bilan WHERE bandini va HAVING bandini o'z ichiga olishi mumkin.

HAVING bandi haqida ko'proq ma'lumot olish uchun HAVING bandi maqolasiga qarang.

So'rov natijalarini birlashtirish: UNION operatori

UNION operatori bir vaqtning o'zida bir nechta o'xshash tanlov so'rovlari tomonidan qaytarilgan barcha ma'lumotlarni birlashtirilgan to'plam sifatida ko'rish uchun ishlatiladi.

UNION operatori ikkita SELECT iborasini bittaga birlashtirish imkonini beradi. Birlashtirilgan SELECT iboralari bir xil yoki mos keladigan ma'lumotlar turlariga ega chiqish maydonlarining soni va tartibi bir xil bo'lishi kerak. So'rov bajarilganda, har bir mos keladigan maydonlar to'plamidan olingan ma'lumotlar bitta chiqish maydoniga birlashtiriladi, shuning uchun so'rov natijasi har bir alohida SELECT iborasi kabi ko'p maydonga ega bo'ladi.

Eslatma: Qo'shilish so'rovlarida raqamli va matnli ma'lumotlar turlari mos keladi.

UNION operatoridan foydalanib, takroriy satrlar, agar mavjud bo'lsa, so'rov natijalariga kiritilishi kerakligini belgilashingiz mumkin. Buning uchun ALL kalit so'zidan foydalaning.

Ikkita SELECT iborasini birlashtirish uchun so'rov quyidagi asosiy sintaksisga ega:

1-maydonni tanlang
1-jadvaldan
UNION
TALANLAMA maydoni_a
Jadvaldan_a
;

Misol uchun, sizda "Mahsulotlar" va "Xizmatlar" deb nomlangan ikkita jadval bor deylik. Ikkala jadvalda mahsulot yoki xizmat nomi, narx va kafolat ma'lumotlari, shuningdek taklif etilayotgan mahsulot yoki xizmatning eksklyuzivligini ko'rsatuvchi maydon mavjud. Mahsulotlar va xizmatlar jadvallari har xil turdagi kafolatlarni taqdim etsa-da, asosiy ma'lumotlar bir xil (alohida mahsulot yoki xizmatlar kafolatlanganmi yoki yo'qmi). Ikki jadvaldagi to'rtta maydonni birlashtirish uchun quyidagi birlashma so'rovidan foydalanishingiz mumkin:

Ism, narx, kafolatli_mavjud, eksklyuziv_taklif
Mahsulotlardan
HAMMA ittifoq
Ism, narx, kafolatli_mavjud, eksklyuziv_taklif
FROM xizmatlar
;

UNION operatori yordamida SELECT iboralarini birlashtirish haqida ko'proq ma'lumot olish uchun qarang

Sizga “SELECT * WHERE a=b FROM c” yoki “SELECT WHERE a=b FROM c ON *” kerakmi?

Agar siz menga o'xshagan bo'lsangiz, rozi bo'lasiz: SQL - dastlab oson ko'rinadigan narsalardan biri (ingliz tilini o'qiydi!), lekin qandaydir tarzda to'g'ri sintaksisni topish uchun har bir oddiy so'rovni Google orqali ko'rishingiz kerak.


Va keyin qo'shilish, yig'ish, pastki so'rovlar boshlanadi va bu butunlay axlat bo'lib chiqadi. Shunga o'xshash narsa:


SELECT a'zolar.familiyasi || " " || Members.lastname "To'liq ism" AS FROM qarzlar INNER JOIN a'zolar ON member.memberid=borrowings.memberid INNER JOIN books ON books.bookid=borrowings.bookid WHERE borrowings.bookid IN (SELECT bookid FROM books WHERE stock>(SELECT avg(stock) ) FROM kitoblardan)) GROUP BY BY a'zolar.ism, a'zolar.familiya;

Bue! Bu har qanday yangi boshlanuvchini yoki hatto SQLni birinchi marta ko'rayotgan bo'lsa, o'rta darajadagi dasturchini qo'rqitadi. Lekin hammasi unchalik yomon emas.


Nima intuitiv ekanligini eslab qolish oson va ushbu qo'llanma yordamida men yangi boshlanuvchilar uchun SQL ga kirishdagi to'siqni kamaytirishga umid qilaman va allaqachon tajribaga ega bo'lganlarga SQLga qarashning yangi usulini taklif qilaman.


SQL sintaksisi turli ma'lumotlar bazalari orasida deyarli bir xil bo'lsa-da, ushbu maqola so'rovlar uchun PostgreSQL-dan foydalanadi. Ba'zi misollar MySQL va boshqa ma'lumotlar bazalarida ishlaydi.

1. Uchta sehrli so'z

SQLda juda ko'p kalit so'zlar mavjud, ammo SELECT, FROM va WHERE deyarli har bir so'rovda mavjud. Biroz vaqt o'tgach, siz ushbu uchta so'z ma'lumotlar bazasi so'rovlarini yaratishning eng asosiy jihatlarini anglatishini tushunasiz va boshqa, murakkabroq so'rovlar shunchaki ularning ustiga qo'shimchalardir.

2. Bizning bazamiz

Keling, ushbu maqolada misol sifatida foydalanadigan ma'lumotlar bazasini ko'rib chiqaylik:







Kitob kutubxonamiz va odamlarimiz bor. Chiqarilgan kitoblarni yozib olish uchun maxsus jadval ham mavjud.

  • "Kitoblar" jadvali kitobning nomi, muallifi, nashr etilgan sanasi va mavjudligi haqidagi ma'lumotlarni saqlaydi. Hammasi oddiy.
  • "A'zolar" jadvalida - kutubxonaga ro'yxatdan o'tgan barcha odamlarning ismlari va familiyalari.
  • "Qarz" jadvali kutubxonadan olingan kitoblar haqidagi ma'lumotlarni saqlaydi. Bookid ustuni "kitoblar" jadvalida olingan kitobning identifikatoriga, a'zolar ustuni esa "a'zolar" jadvalidagi tegishli shaxsga ishora qiladi. Shuningdek, bizda kitobning chiqarilgan sanasi va qaytarilishi kerak bo'lgan sana bor.

3. Oddiy so'rov

Oddiy so'rov bilan boshlaylik: bizga kerak ismlar Va identifikatorlar(id) muallif tomonidan yozilgan barcha kitoblarning "Dan Braun"


So'rov quyidagicha bo'ladi:


Bookidni "id" AS TANILASH, kitoblar nomidan QAYER muallifi="Dan Braun";

Va natija quyidagicha:


id sarlavha
2 Yo'qotilgan belgi
4 Inferno

Juda oddiy. Keling, nima bo'layotganini tushunish uchun so'rovni ko'rib chiqaylik.

3.1 FROM - biz ma'lumotlarni qaerdan olamiz

Bu hozir aniq bo'lib tuyulishi mumkin, ammo FROM keyinroq qo'shilish va quyi so'rovlarga kelganimizda juda muhim bo'ladi.


FROM so'rov uchun jadvalga ishora qiladi. Bu mavjud jadval (yuqoridagi misolda bo'lgani kabi) yoki qo'shilish yoki pastki so'rovlar orqali tezda yaratilgan jadval bo'lishi mumkin.

3.2 QAYER - qanday ma'lumotlar ko'rsatilgan

WHERE shunchaki filtr kabi harakat qiladi chiziqlar, biz chiqarmoqchi bo'lgan. Bizning holatda, biz faqat muallif ustunidagi qiymat "Dan Braun" bo'lgan qatorlarni ko'rishni xohlaymiz.

3.3 SELECT - ma'lumotlarni qanday ko'rsatish

Endi bizga kerak bo'lgan jadvaldan barcha ustunlar mavjud bo'lsa, biz ushbu ma'lumotlarni qanday aniq ko'rsatishni hal qilishimiz kerak. Bizning holatda, bizga faqat kitob nomlari va identifikatorlari kerak, shuning uchun biz shunday qilyapmiz. tanlaylik SELECT yordamida. Shu bilan birga, AS yordamida ustun nomini o'zgartirishingiz mumkin.


To'liq so'rovni oddiy diagramma yordamida tasvirlash mumkin:


4. Bog'lanishlar (birlashmalar)

Endi biz kutubxonadan chiqarilgan Den Braun kitoblarining sarlavhalarini (yagona bo'lishi shart emas) va bu kitoblar qachon qaytarilishi kerakligini ko'rmoqchimiz:


books.title AS "Sarlavha", borrowings.returndate "Qaytish sanasi" sifatida TANGLASH QARZLARDAN JOIN books ON borrowings.bookid=books.bookid WHERE books.author="Dan Braun";

Natija:


Sarlavha Qaytish sanasi
Yo'qotilgan belgi 2016-03-23 00:00:00
Inferno 2016-04-13 00:00:00
Yo'qotilgan belgi 2016-04-19 00:00:00

Ko'pincha so'rov avvalgisiga o'xshaydi dan tashqari bo'limlardan. Bu shuni anglatadiki biz boshqa jadvaldan ma'lumotlarni so'rayapmiz. Biz na “kitoblar” jadvaliga, na “qarz” jadvaliga kira olmaymiz. Buning o'rniga biz murojaat qilamiz yangi stol, bu ikkita jadvalni birlashtirish orqali yaratilgan.


qarzlar JOIN books ON borrowings.bookid=books.bookid - bu kitob qiymatlari bir xil bo'lgan "kitoblar" va "qarz olish" jadvallaridagi barcha yozuvlarni birlashtirish orqali tuzilgan yangi jadval deb hisoblang. Bunday birlashmaning natijasi quyidagicha bo'ladi:



Va keyin biz ushbu jadvalni yuqoridagi misoldagi kabi so'raymiz. Bu shuni anglatadiki, jadvallarni birlashtirganda, siz faqat qanday qilib qo'shilish haqida o'ylashingiz kerak. Va keyin so'rov 3-banddagi "oddiy so'rov" kabi aniq bo'ladi.


Keling, ikkita jadval bilan biroz murakkabroq birikmani sinab ko'raylik.


Endi biz "Dan Braun" muallifining kitoblarini kutubxonadan olgan odamlarning ism va familiyalarini olmoqchimiz.


Bu safar pastdan yuqoriga o'tamiz:


1-qadam- ma'lumotlarni qayerdan olamiz? Bizga kerak bo'lgan natijaga erishish uchun biz "a'zo" va "kitoblar" jadvallarini "qarz olish" jadvali bilan birlashtirishimiz kerak. JOIN bo'limi quyidagicha ko'rinadi:


borrowings JOIN books ON borrowings.bookid=books.bookid JOIN a'zolari ON Members.memberid=borrowings.memberid

Ulanish natijasini havolada ko'rish mumkin.


2-qadam- qanday ma'lumotlarni ko'rsatamiz? Bizni faqat kitob muallifi "Dan Braun" bo'lgan ma'lumotlar qiziqtiradi.


WHERE books.author="Dan Braun"

3-qadam- ma'lumotlarni qanday ko'rsatamiz? Endi ma'lumotlar olingandan so'ng, siz faqat kitoblarni olganlarning ism va familiyalarini ko'rsatishingiz kerak:


SELECT a'zolar.firstname "Ism" AS, Member.familiya AS "Familiya"

Super! Qolgan narsa uchta komponentni birlashtirish va bizga kerak bo'lgan so'rovni bajarishdir:


Members.firstname "Ism" AS, Member.lastname "Familiya" AS QARZLARDAN QO'SHILING kitoblarga QO'SHILING borrowings.bookid=books.bookid A'zolarga QO'SHILING borrowings.bookid=borrowings.memberid WHERE books.author="Dan Braun";

Bizga nima beradi:


Ism Familiya
Mayk Uillis
Ellen Xorton
Ellen Xorton

Ajoyib! Ammo ismlar takrorlanadi (ular noyob emas). Tez orada buni tuzatamiz.

5. Birlashtirish

Qo'pol qilib aytganda, Bir nechta qatorlarni bittaga aylantirish uchun yig'ish kerak. Shu bilan birga, yig'ish paytida turli xil ustunlar uchun turli xil mantiq ishlatiladi.


Keling, takroriy nomlar paydo bo'lgan misolimizni davom ettiramiz. Ellen Xorton bir nechta kitoblarni olgani aniq, ammo bu ma'lumotni ko'rsatishning eng yaxshi usuli emas. Siz boshqa so'rov yuborishingiz mumkin:


a'zolar.firstname "Ism" AS, Members.familiya "Familiya" AS, hisob(*) "Qarz qilingan kitoblar soni" AS QARZLARDAN JOIN books ON borrowings.bookid=books.bookid A'zolarga QO'SHILING Members.memberid=borrowings .memberid WHERE books.author="Dan Braun" GROUP BY BY a'zolar.firstname, Members.fastname;

Bu bizga kerakli natijani beradi:


Ism Familiya Qarzga olingan kitoblar soni
Mayk Uillis 1
Ellen Xorton 2

Deyarli barcha agregatlar GROUP BY bandi bilan birga keladi. Bu narsa so'rov orqali olinishi mumkin bo'lgan jadvalni jadvallar guruhlariga aylantiradi. Har bir guruh GROUP BY da biz ko'rsatgan ustunning noyob qiymatiga (yoki qiymatlar guruhiga) mos keladi. Bizning misolimizda oldingi mashqdan olingan natijani qatorlar guruhiga aylantiramiz. Shuningdek, biz bir nechta satrlarni butun songa (bizning holatda, qatorlar soni) aylantiradigan count bilan yig'ish qilamiz. Keyin bu ma'no har bir guruhga beriladi.


Natijadagi har bir qator har bir guruhni yig'ish natijasini ifodalaydi.



Mantiqiy xulosaga kelish mumkinki, natijadagi barcha maydonlar GROUP BY da ko'rsatilishi yoki ular bo'yicha yig'ish amalga oshirilishi kerak. Chunki boshqa barcha maydonlar turli qatorlarda bir-biridan farq qilishi mumkin va agar siz ularni SELECT bilan tanlasangiz, mumkin bo'lgan qiymatlardan qaysi birini olish kerakligi aniq emas.


Yuqoridagi misolda hisoblash funksiyasi barcha satrlarni qayta ishladi (chunki biz qatorlar sonini hisoblagan edik). sum yoki max kabi boshqa funktsiyalar faqat belgilangan qatorlarni qayta ishlaydi. Misol uchun, agar biz har bir muallif tomonidan yozilgan kitoblar sonini bilmoqchi bo'lsak, unda bizga quyidagi so'rov kerak bo'ladi:


Muallif, sum(aksiya) kitoblardan GURUH muallifi bo‘yicha TANLASH;

Natija:


muallif so'm
Robin Sharma 4
Den Braun 6
Jon Green 3
Amish Tripathi 2

Bu erda yig'indisi funktsiyasi faqat birja ustunini qayta ishlaydi va har bir guruhdagi barcha qiymatlar yig'indisini hisoblab chiqadi.

6. Quyi so‘rovlar


Quyi so'rovlar kattaroq so'rovlar ichiga kiritilgan oddiy SQL so'rovlaridir. Qaytarilgan natija turiga qarab ular uch turga bo'linadi.

6.1 Ikki o'lchovli jadval

Bir nechta ustunlarni qaytaradigan so'rovlar mavjud. Yaxshi misol - oldingi yig'ish mashqidagi so'rov. Quyi so'rov bo'lib, u yangi so'rovlarni amalga oshirish mumkin bo'lgan boshqa jadvalni qaytaradi. Oldingi mashqni davom ettirib, agar biz "Robin Sharma" muallifi tomonidan yozilgan kitoblar sonini bilmoqchi bo'lsak, unda mumkin bo'lgan usullardan biri quyi so'rovlardan foydalanishdir:


TANLASH * FROM (muallif, summa(aksiya) FROM kitoblardan GROUP BY BY) natijalar AS QAYER muallifi="Robin Sharma";

Natija:



Quyidagi tarzda yozilishi mumkin: ["Robin Sharma", "Dan Braun"]


2. Endi biz ushbu natijani yangi so'rovda ishlatamiz:


SELECT title, bookid FROM books WHERE author IN (muallifni SELECT FROM (muallif, summa(aksiya) FROM kitoblardan GROUP BY muallif) AS natijalar WHERE summa > 3);

Natija:


sarlavha bookid
Yo'qotilgan belgi 2
Siz o'lganingizda kim yig'laydi? 3
Inferno 4

Bu xuddi shunday:


SELECT sarlavhasi, kitoblar FROM kitoblar WHERE IN muallifi ("Robin Sharma", "Dan Braun");

6.3 Individual qiymatlar

Bitta satr va bitta ustunga olib keladigan so'rovlar mavjud. Ular doimiy qiymatlar sifatida ko'rib chiqilishi mumkin va qiymatlar ishlatiladigan har qanday joyda, masalan, taqqoslash operatorlarida ishlatilishi mumkin. Ular ikki o'lchovli jadvallar yoki bitta elementli massivlar sifatida ham ishlatilishi mumkin.


Keling, masalan, kutubxonadagi soni joriy o'rtacha ko'rsatkichdan oshib ketgan barcha kitoblar haqida ma'lumot olamiz.


O'rtacha ko'rsatkichni quyidagicha olish mumkin:


kitoblardan o'rtacha (zaxira) ni tanlang;

Bizga nima beradi:


7. Amallarni yozish

Ko'pgina ma'lumotlar bazasini yozish operatsiyalari murakkabroq o'qish operatsiyalariga nisbatan ancha sodda.

7.1 Yangilash

UPDATE so'rovining sintaksisi semantik jihatdan o'qish so'rovi bilan bir xil. Yagona farq shundaki, SELECT bilan ustunlarni tanlash o'rniga biz bilimlarni SET bilan o'rnatamiz.


Agar Den Braunning barcha kitoblari yo'qolgan bo'lsa, siz miqdor qiymatini tiklashingiz kerak. Buning uchun so'rov quyidagicha bo'ladi:


YANGILANISh kitoblari SET stock=0 WHERE muallif="Dan Braun";

WHERE avvalgidek ishni bajaradi: qatorlarni tanlaydi. Biz o'qishda foydalangan SELECT o'rniga endi SET dan foydalanamiz. Biroq, endi tanlangan satrlarda faqat ustun nomini emas, balki ushbu ustun uchun yangi qiymatni ham ko'rsatishingiz kerak.


7.2 O'chirish

OʻCHIRISH soʻrovi oddiygina ustun nomlari boʻlmagan SELECT yoki UPDATE soʻrovidir. Jiddiy. SELECT va UPDATE dagi kabi, WHERE bloki o'zgarishsiz qoladi: u o'chiriladigan qatorlarni tanlaydi. O'chirish operatsiyasi butun qatorni yo'q qiladi, shuning uchun alohida ustunlarni ko'rsatish mantiqiy emas. Shunday qilib, agar biz Den Braun kitoblari sonini tiklamaslikka, balki barcha yozuvlarni butunlay o'chirishga qaror qilsak, unda biz quyidagi so'rovni qilishimiz mumkin:


DELETE FROM books WHERE muallif="Dan Braun";

7.3 Qo'shish

Ehtimol, so'rovlarning boshqa turlaridan farq qiladigan yagona narsa - INSERT. Format quyidagicha:


INSERT INTO x (a,b,c) VALUES (x, y, z);

Bu erda a , b , c ustun nomlari va x , y va z - bu ustunlarga bir xil tartibda kiritilishi kerak bo'lgan qiymatlar. Asosan shunday.


Keling, aniq bir misolni ko'rib chiqaylik. Mana butun "kitoblar" jadvalini to'ldiradigan INSERT so'rovi:


INSERT INTO kitoblar (kitobi,nomi,muallifi,nashr qilingan,zaxira) QIYMATLAR (1,"Ikshvaku Scion","Amish Tripathi","06-22-2015",2), (2,"Yo'qolgan belgi"," Den Braun","2010-07-22",3), (3,"O'lganingda kim yig'laydi?","Robin Sharma","06-15-2006",4), (4,"Do'zax" ,"Dan Braun","05-05-2014",3), (5,"Yulduzlarimizdagi xato","Jon Grin","01-03-2015",3);

8. Tekshirish

Biz oxiriga yetdik, men kichik sinovni taklif qilaman. Maqolaning boshida ushbu so'rovga qarang. Buni tushuna olasizmi? Uni SELECT , FROM , WHERE , GROUP BY bo'limlariga ajratib ko'ring va quyi so'rovlarning alohida komponentlarini ko'rib chiqing.


Bu erda u yanada o'qilishi mumkin bo'lgan shaklda:


SELECT a'zolar.familiyasi || " " || Members.lastname "Toʻliq ism" AS FROM qarzlar ICHKI JOIN a'zolar ON Member.memberid=borrowings.memberid INNER JOIN books ON books.bookid=borrowings.bookid WHERE borrowings.bookid IN (bookid FROM SELECT books WHERE stock> (SELECT avg(stock) ) FROM kitoblardan)) GROUP BY BY a'zolar.ism, a'zolar.familiya;

Bu soʻrov kutubxonadan kitobni tekshirgan, umumiy soni oʻrtachadan yuqori boʻlgan odamlar roʻyxatini qaytaradi.


Natija:


To'liq ism
Lida Tayler

Umid qilamanki, siz buni hech qanday muammosiz tushundingiz. Agar yo'q bo'lsa, ushbu postni yaxshilashim uchun sharhlaringiz va fikr-mulohazalaringizni mamnuniyat bilan qabul qilaman.

Ushbu bobda siz boshqa tillarda yozilgan dasturlarni kengaytirish uchun SQL qanday ishlatilishini bilib olasiz. SQL ning protsessual bo'lmaganligi uni juda kuchli qilishiga qaramasdan, unga juda ko'p cheklovlarni ham qo'yadi. Ushbu cheklovlarni bartaraf etish uchun siz SQLni u yoki bu protsessual tilda yozilgan dasturlarga kiritishingiz mumkin (ma'lum bir algoritmga ega). Bizning misollarimiz uchun biz Paskal tilini tanladik, chunki bu til yangi boshlanuvchilar uchun eng oson tushuniladi, shuningdek, Paskal ANSI yarim rasmiy standartiga ega bo'lgan tillardan biridir.

SQL ILIKMASI NIMA

SQL-ni boshqa tilda joylashtirish uchun siz ushbu tilda SQL-ni joylashtirishni va, albatta, tilning o'zini qo'llab-quvvatlaydigan dasturiy ta'minot to'plamidan foydalanishingiz kerak. Tabiiyki, siz foydalanayotgan tilni yaxshi bilishingiz kerak. Asosan, siz SQL buyruqlaridan ma'lumotlar bazasi jadvallari bilan ishlash, chiqish natijalarini dasturga o'tkazish va ular kiritilgan dasturdan ma'lumotlarni qabul qilish uchun foydalanasiz, odatda asosiy dasturga (muloqot oynasidan ularni qabul qilishi yoki qabul qilmasligi mumkin) yoki ularni suhbat foydalanuvchisi va dasturga qaytarib yuboring).

NEGA INVEST SQL?

Biz SQL nima qila olishini ko'rsatishga biroz vaqt sarflagan bo'lsak-da, agar siz tajribali dasturchi bo'lsangiz, ehtimol siz o'z-o'zidan dastur yozishda unchalik foydali emasligini payqagandirsiz. Eng aniq cheklov shundaki, SQL bir vaqtning o'zida buyruqlar to'plamini bajarishi mumkin bo'lsa-da, interaktiv SQL asosan bir vaqtning o'zida bitta buyruqni bajaradi. Mantiqiy konstruksiya turlari, masalan, agar ... keyin ("agar ... keyin"), for ... do ("to ... bajarish") va while ... takrorlash ("while ... takrorlash") - ko'pgina kompyuter dasturlari tuzilmalari uchun foydalaniladi, bu erda yo'q, shuning uchun boshqa harakat natijasida bir harakatni bajarish, qanday bajarish yoki qancha vaqt davomida bajarish kerakligini hal qila olmaysiz. Bundan tashqari, interaktiv SQL qiymatlarni jadvalga kiritish, so'rovlar yordamida joylashtirish yoki tarqatish va, albatta, ularni biron bir qurilmaga chiqarishdan boshqa ko'p ish qila olmaydi.

Biroq, bu sohalarda ko'proq an'anaviy tillar kuchli. Ular dasturchi ma'lumotlarni qayta ishlashni boshlashi va uning natijalariga ko'ra u yoki boshqa amalni bajarish yoki biron bir shart bajarilgunga qadar harakatni takrorlash, mantiqiy marshrutlar va tsikllarni yaratish to'g'risida qaror qabul qilishi uchun mo'ljallangan. Qiymatlar istalgan sonli buyruqlar yordamida ishlatilishi va o'zgartirilishi mumkin bo'lgan o'zgaruvchilarda saqlanadi. Bu sizga foydalanuvchilarni fayldan ushbu buyruqlarni kiritish yoki chiqarishga yo'naltirish va chiqishni murakkab usullarda formatlash (masalan, raqamli ma'lumotlarni diagrammalarga aylantirish) imkoniyatini beradi. Ichki SQL-ning maqsadi ushbu imkoniyatlarni birlashtirishdan iborat bo'lib, SQL orqali ma'lumotlar bazasiga murojaat qiluvchi murakkab protsessual dasturlarni yozishga imkon beradi - tizimli qat'iylikni saqlagan holda, bunday ma'lumotlar tuzilishiga yo'naltirilmagan protsessual tilda murakkab jadval operatsiyalarini yo'q qilishga imkon beradi. protsessual tildan.

SQL QILMALARI QANDAY TUZILADI.

SQL buyruqlari asosiy dasturning dastlabki matnida joylashtiriladi, undan oldin - EXEC SQL (EXECute SQL) iborasi keladi. Quyida ichki o'rnatilgan SQL formasi uchun maxsus bo'lgan ba'zi buyruqlar o'rnatiladi va bu bobda tanishtiriladi. To'g'risini aytganda, ANSI standarti ichki o'rnatilgan SQL-ni qo'llab-quvvatlamaydi. U modul deb ataladigan kontseptsiyani qo'llab-quvvatlaydi, aniqrog'i u boshqa tilda joylashtirish emas, balki chaqiriladigan SQL protseduralari to'plamidir. SQL joylashtirish sintaksisining rasmiy ta'rifi SQL o'rnatilishi mumkin bo'lgan har bir tilning rasmiy sintaksisini kengaytirishni o'z ichiga oladi, bu ANSI bu juda uzoq va nomaqbul vazifadir. Biroq, ANSI to'rtta til uchun SQL joylashtirish sintaksisini aniqlaydigan to'rtta dasturni (standartning bir qismi emas) taqdim etadi: COBOL, PASCAL, FORTRAN va PL/1. C tili ham boshqa tillar kabi keng qo'llab-quvvatlanadi. Boshqa tilda yozilgan dasturga SQL buyruqlarini kiritganingizda, uni kompilyatsiya qilishdan oldin uni oldindan kompilyatsiya qilishingiz kerak. Precompiler (yoki preprotsessor) deb ataladigan dastur sizning dasturingiz matnini ko'rib chiqadi va SQL buyruqlarini asosiy til foydalanishi mumkin bo'lgan shaklga aylantiradi.

Keyin dasturni manba kodidan bajariladigan kodga aylantirish uchun oddiy tarjimondan foydalanasiz. ANSI tomonidan belgilangan modulli til yondashuviga ko'ra, asosiy dastur SQL protseduralarini chaqiradi. Jarayonlar asosiy dasturdan parametrlarni tanlaydi va qayta ishlangan qiymatlarni asosiy dasturga qaytaradi. Modul har bir SQL buyrug'idan iborat bo'lgan istalgan miqdordagi protseduralarni o'z ichiga olishi mumkin. G'oya shundan iboratki, protseduralar o'zlari joylashtirilgan tildagi protseduralar bilan bir xil tarzda ishlashi mumkin (garchi modul har xil tillardagi ma'lumotlar turlaridagi farqlar tufayli hali ham asosiy tilni aniqlashi kerak). Amalga oshirishlar SQL ichki joylashtirishni modullar allaqachon aniq belgilangandek amalga oshirish orqali standartga mos kelishi mumkin. Shu maqsadda prekompilyator kirish moduli deb nomlangan modul yaratadi. Berilgan dastur uchun har qanday miqdordagi SQL protseduralarini o'z ichiga olgan faqat bitta modul mavjud bo'lishi mumkin. SQL iboralarini to'g'ridan-to'g'ri asosiy kodga joylashtirish modullarni to'g'ridan-to'g'ri yaratishdan ko'ra osonroq va amaliyroq. SQL ilovasidan foydalanadigan har bir dastur uni bajarish jarayonida kirish identifikatori bilan bog'lanadi. Dastur bilan bog'langan kirish identifikatori dasturda bajarilgan SQL operatsiyalarini bajarish uchun to'liq imtiyozlarga ega bo'lishi kerak. Umuman olganda, ichki o'rnatilgan SQL dasturi, dasturni bajaruvchi foydalanuvchi kabi ma'lumotlar bazasida ro'yxatga olinadi. Tafsilotlar dizaynerga bog'liq, lekin dasturingizga CONNECT yoki shunga o'xshash buyruqni kiritish yaxshi fikr bo'lar edi.

SQLDA ASOSIY TIL OʻZGARCHILARIDAN FOYDALANISH

SQL va dasturlaringizning asosiy tilining qismlari bir-biri bilan aloqa qilishning asosiy usuli bu o'zgaruvchan qiymatlar orqali. Tabiiyki, turli tillar o'zgaruvchilar uchun turli xil ma'lumotlar turlarini taniydi. ANSI to'rtta asosiy til uchun SQL ekvivalentlarini belgilaydi - PL/1, Paskal, COBOL va FORTRAN; bularning barchasi batafsil tavsiflangan Ilova B. Boshqa tillar uchun ekvivalentlar dizayner tomonidan belgilanadi. Shuni yodda tutingki, DATE kabi turlar ANSI tomonidan tan olinmaydi; va shuning uchun ANSI standartida asosiy tillar uchun ekvivalent ma'lumotlar turlari mavjud emas. Matritsalar kabi murakkabroq asosiy til ma'lumotlar turlarining SQLda ekvivalenti yo'q. Qiymat ifodalaridan foydalansangiz, asosiy dasturdagi o'zgaruvchilardan ichki SQL iboralarida foydalanishingiz mumkin. (Ushbu bobda foydalanilgan SQL, agar boshqacha ko'rsatilmagan bo'lsa, ichki SQL sifatida tushuniladi.) O'zgaruvchining joriy qiymati buyruqda ishlatiladigan qiymat bo'lishi mumkin. Asosiy o'zgaruvchilar bo'lishi kerak -

* keyinroq tavsiflanadigan SQL DECLARE SESSION da e'lon qilinadi.

* SQL buyrug'idagi funktsiyalari bilan mos keladigan ma'lumotlar turiga ega bo'ling (masalan, raqamli maydonga kiritilgan bo'lsa, raqamli tur)

* Agar SQL buyrug'ining o'zi tayinlashni amalga oshira olmasa, ular SQL buyrug'ida foydalanilganda qiymatga tayinlanadi.

* SQL buyrug'ida tilga olinganda ikki nuqta (:) oldidan qo'ying

Asosiy o'zgaruvchilar SQL ustun nomlaridan ikki nuqta bilan farq qilganligi sababli, kerak bo'lsa, ustunlaringiz bilan bir xil nomdagi o'zgaruvchilardan foydalanishingiz mumkin. Faraz qilaylik, sizning dasturingizda to'rtta o'zgaruvchi bor, ular nomli: id_num, sotuvchi, loc va comm. Ularda siz sotuvchilar jadvaliga kiritmoqchi bo'lgan qiymatlar mavjud. Siz dasturingizda quyidagi SQL buyrug'ini joylashtirishingiz mumkin: EXEC SQL INSERT INTO Salespeople VALUES (:id_num, :salesperson, :loc, :comm) Ushbu o'zgaruvchilarning joriy qiymatlari jadvalga joylashtiriladi. Ko'rib turganingizdek, comm o'zgaruvchisi ushbu qiymat joylashtirilgan ustun bilan bir xil nomga ega. E'tibor bering, buyruq oxirida nuqta-vergul yo'q. Buning sababi, ichki o'rnatilgan SQL buyrug'i uchun tegishli tugatish, joylashtirish amalga oshirilgan tilga bog'liq.

Paskal va PL/1 uchun bu nuqta-vergul bo'ladi; COBOL uchun END-EXEC so'zi; va FORTRAN uchun hech qanday yakun bo'lmaydi. Boshqa tillarda bu amalga oshirishga bog'liq va shuning uchun biz interaktiv SQL va Paskal tillariga zid kelmaslik uchun har doim nuqta-verguldan foydalanishga rozi bo'lamiz (ushbu kitobda). Paskal o'rnatilgan SQL va mahalliy buyruqlarni xuddi shu tarzda - nuqta-vergul bilan tugatadi. Butun buyruqni yuqorida ta'riflanganidek qilishning yo'li, quyidagi misolda ko'rsatilganidek, uni aylantirib, turli o'zgaruvchan qiymatlar bilan takrorlashdir: while end-ot-file (kiritish) do begin readln ( id_num, salesperson, loc, comm); EXEC SOL INSERT INTO Salespeople VALUES (:id_num, :salesperson, :loc, :comm); oxiri; PASCAL dasturining fragmenti fayldagi qiymatlarni o'qiy oladigan, ularni to'rtta nomdagi o'zgaruvchilarda saqlaydigan, ushbu o'zgaruvchilarning qiymatlarini Sotuvchilar jadvalida saqlaydigan va keyingi to'rtta qiymatni o'qib chiqadigan tsiklni belgilaydi, bu jarayon to'g'ri kelguncha takrorlanadi. to'liq kirish fayli o'qildi. Har bir qiymat to'plami vagonni qaytarish bilan yakunlanadi (Paskal tilini bilmaganlar uchun readln funksiyasi kiritilgan ma'lumotlarni o'qiydi va ushbu ma'lumot manbasining keyingi qatoriga o'tadi). Bu sizga matnli fayldan relyatsion tuzilishga ma'lumotlarni uzatishning oson yo'lini beradi. Albatta, siz avval ma’lumotlarni xost tilingizda istalgan usulda qayta ishlashingiz mumkin, masalan, qiymatdan past bo‘lgan barcha komissiyalarni olib tashlash uchun. ); agar comm > = .12 bo'lsa, u holda EXEC SQL INSERT INTO Salespeople VALUES (:id_num, :salesperson, :loc, :comm); oxiri; Chiqishga faqat comm >= .12 shartiga javob beradigan satrlar kiritiladi. Bu shuni ko'rsatadiki, siz ikkala tsikl va shartlarni xost tili uchun odatdagidek ishlatishingiz mumkin.

O'ZGARCHILARNI E'lon qilish

SQL iboralarida havola qilingan barcha o'zgaruvchilar avval oddiy xost tili sintaksisidan foydalangan holda SQL DECLARE SECTION bo'limida e'lon qilinishi kerak. Siz dasturda bunday bo'limlarning istalgan soniga ega bo'lishingiz mumkin va ular o'zgaruvchidan foydalanilgunga qadar kodning biror joyida, xost tili tomonidan belgilangan cheklovlarga muvofiq joylashtirilishi mumkin. Deklaratsiya bo'limi ichki o'rnatilgan SQL buyruqlari bilan boshlanishi va tugashi kerak - BEGIN DECLARE SECTION va END DECLARE SECTION - oldidan odatdagidek EXEC SQL. Oldingi misolda ishlatilgan o'zgaruvchilarni e'lon qilish uchun quyidagilarni kiritishingiz mumkin: EXEC SQL BEGIN DECLARE SECTION; Var id-num: integer; Sotuvchi: qadoqlangan massiv (1 . .10) ot char; loc: packed array (1. .10) ot char; comm: real; EXEC SQL END E'lon qilish bo'limi; PASCAL tilini bilmaganlar uchun Var - bu e'lon qilingan o'zgaruvchilar qatoridan oldin joylashgan sarlavha va to'plangan (yoki o'ralmagan) massivlar raqamlar bilan ajralib turadigan qat'iy o'zgaruvchilar qiymatlari qatoridir (masalan, loc ning uchinchi belgisi loc( bo'ladi). 3)). Har bir o'zgaruvchidan keyin nuqta-vergul qo'llanilishi bu SQL emas, balki Paskal ekanligini ko'rsatadi.

O'ZGARCHI QIMMATLARNI CHIPLASH

SQL buyruqlari yordamida o'zgaruvchan qiymatlarni jadvallarga qo'yishdan tashqari, ushbu o'zgaruvchilar uchun qiymatlarni olish uchun SQL dan foydalanishingiz mumkin. Buning usullaridan biri INTO bandini o'z ichiga olgan SELECT buyrug'ining o'zgarishidir. Oldingi misolimizga qaytaylik va Peel qatorini Sellers jadvalidan xost tili o'zgaruvchilariga o'tkazamiz. EXEC SQL SELECT snum, sname, city, comm INTO:id_num, :salesperson, :loc, :comm FROM Salespeople WHERE snum = 1001; Tanlangan qiymatlar INTO bandida ko'rsatilgan tartibli nomlar bilan o'zgaruvchilarga joylashtiriladi. Albatta, INTO bandida ko'rsatilgan o'zgaruvchilar ushbu qiymatlarni qabul qilish uchun mos turdagi bo'lishi kerak va har bir tanlangan ustun uchun o'zgaruvchi bo'lishi kerak. Agar siz INTO bandining mavjudligini hisobga olmasangiz, bu so'rov boshqa har qanday so'rovga o'xshaydi. Biroq, INTO bandi so'rovga sezilarli cheklov qo'shadi. So'rov bir qatordan ko'p bo'lmasligi kerak. Agar u ko'p qatorlarni olsa, ularning hammasini bir vaqtning o'zida bir xil o'zgaruvchiga kiritib bo'lmaydi. Jamoa tabiiy ravishda muvaffaqiyatsizlikka uchraydi. Shu sababli, SELECT INTO faqat quyidagi sharoitlarda ishlatilishi kerak:

* siz ushbu misolda bo'lgani kabi noyob bo'lishi mumkin bo'lgan qiymatlarni tekshiradigan predikatdan foydalanganda. Siz bilgan qadriyatlar noyob bo'lishi mumkin, bu maqolada muhokama qilinganidek, majburiy o'ziga xoslik cheklovi yoki noyob indeksga ega bo'lgan qadriyatlardir. 17-boblar Va .

* Agar siz bir yoki bir nechta agregat funksiyalardan foydalansangiz va GROUP BY dan foydalanmasangiz.

* SELECT DISTINCT dan tashqi kalitda asosiy kalitning yagona qiymatiga ishora qiluvchi (tizimingizni mos yozuvlar yaxlitligini taʼminlovchi) predikatli tashqi kalitda quyidagi misolda boʻlgani kabi ishlatganingizda: EXEC SQL SELECT DISTINCT snum INTO:salesnum FROM Customers WHERE snum = (SELECT snum FROM Salespeople WHERE sname = "Motika"); Siz Salespeople.sname va Salespeople.snum ni ushbu jadvalning yagona va asosiy kalitlari, Customers.snum esa Salespeople.snumga havola qilingan tashqi kalit deb taxmin qilgan edingiz va bu so‘rov bitta qator hosil qiladi deb o‘ylagan edingiz. Boshqa holatlar ham borki, siz so'rov bitta satr chiqishi kerakligini bilishingiz mumkin, ammo ular kam ma'lum va ko'p hollarda siz ma'lumotlaringiz cheklovlar bilan amalga oshirib bo'lmaydigan yaxlitlikka ega ekanligiga tayanasiz. Bunga tayanmang! Siz bir muncha vaqt ishlatilishi mumkin bo'lgan dastur yaratyapsiz va kelajakda muvaffaqiyatsiz bo'lmasligi uchun uni o'ynaganingiz ma'qul. Qanday bo'lmasin, bitta qatorlarni yaratadigan so'rovlarni guruhlashning hojati yo'q, chunki SELECT INTO faqat qulaylik uchun ishlatiladi. Ko'rib turganingizdek, kursor yordamida bir nechta qatorlarni chiqaradigan so'rovlardan foydalanishingiz mumkin.

KURSOR

SQL ning kuchli tomonlaridan biri bu qancha qatorlar mavjudligini bilmasdan, blok yozuvi sifatida muayyan shartni qondirish uchun jadvalning barcha satrlarida ishlash qobiliyatidir. Agar o'n qator predikatni qondirsa, so'rov barcha o'n qatorni qaytarishi mumkin. Agar o'n million qator aniqlansa, barcha o'n million qatorlar chiqariladi. Buni boshqa tillar bilan bog‘lashga harakat qilganingizda biroz qiyin bo‘ladi. Chiqish qanchalik katta bo'lishini bilmasangiz, so'rov natijalarini o'zgaruvchilarga qanday belgilashingiz mumkin? Yechim kursor deb ataladigan narsadan foydalanishdir. Kursorni kompyuter ekranidagi joylashuvingizni bildiruvchi miltillovchi chiziq sifatida bilishingiz mumkin. Siz SQL kursorini analoglari to'liq bo'lmasa-da, shunga o'xshash so'rov chiqishida sizning joylashuvingizni belgilaydigan qurilma deb o'ylashingiz mumkin. Kursor so'rov bilan bog'langan o'zgaruvchilar turidir. Ushbu o'zgaruvchining qiymati so'rov amalga oshirilganda chiqadigan har bir satr bo'lishi mumkin. Asosiy o'zgaruvchilar singari, kursorlar ham foydalanishdan oldin e'lon qilinishi kerak. Bu DECLARE CURSOR buyrug'i bilan quyidagi tarzda amalga oshiriladi: EXEC SQL DECLARE CURSOR Londonsales FOR SELECT * FROM Salespeople WHERE city = "London"; So'rov darhol bajarilmaydi; faqat aniqlanmoqda. Kursor biroz ko'rinishga o'xshaydi, chunki kursor so'rovni o'z ichiga oladi va kursor ochilganda kursor tarkibi har qanday so'rov natijasiga o'xshaydi. Biroq, asosiy jadvallar yoki ko'rinishlardan farqli o'laroq, kursor qatorlari tartiblangan: birinchi, ikkinchi... ... va oxirgi kursor qatori mavjud. Bu tartib o'zboshimchalik bilan bo'lishi mumkin, so'rovdagi ORDER BY bandi orqali aniq nazorat qilinishi mumkin yoki u asbob tomonidan belgilangan sxema bo'yicha aniqlangan ba'zi tartiblarga sukut bo'lishi mumkin. Dasturingizda so'rovni bajarmoqchi bo'lgan nuqtani topsangiz, kursorni quyidagi buyruq bilan ochasiz: EXEC SQL OPEN CURSOR Londonsales; Kursordagi qiymatlarni ushbu maxsus buyruqni berganingizda olish mumkin, lekin oldingi DECLARE buyrug'i yoki keyingi FETCH buyrug'i emas. So'ngra, siz FETCH buyrug'idan foydalanib, ushbu so'rovdan bir vaqtning o'zida bitta qatorni chiqarasiz. EXEC SQL FETCH Londonsales INTO:id_num, :salesperson, :loc, :comm; Ushbu ifoda qiymatlarni birinchi tanlangan qatordan o'zgaruvchilarga o'tkazadi. Boshqa FETCH buyrug'i quyidagi qiymatlar to'plamini chiqaradi. G'oya FETCH buyrug'ini tsiklning ichiga qo'yishdir, shunda siz qatorni tanlaganingizdan so'ng, siz ushbu qatordan qiymatlar to'plamini o'zgaruvchilarga ko'chirishingiz mumkin, so'ngra keyingi qiymatlar to'plamini ko'chirish uchun tsiklga qaytasiz. bir xil o'zgaruvchilarga. Misol uchun, siz chiqishni bir vaqtning o'zida bitta satr chiqarishni xohlaysiz va har safar foydalanuvchidan keyingi qatorni ko'rishni davom ettirishni xohlaysizmi, Look_at_more:= True; EXEC SQL OPEN CURSOR Londonsales; Look_at_more esa EXEC SQL FETCH Londonsales INTO:id_num, :Salesperson, :loc, :comm; writeln(id_num, sotuvchi, joy, aloqa); writeln("Ko'proq ma'lumotlarni ko'rishni xohlaysizmi? (Y/H)"); readln (javob); u javob = "N" keyin Look_at_more: = False end; EXEC SQL CLOSE CURSOR Londonsales; Paskalda : = belgisi - " ning tayinlangan qiymati" degan ma'noni anglatadi, = hali ham odatdagi " teng " ma'nosiga ega. writeln funktsiyasi o'z natijasini yozadi va keyin yangi qatorga o'tadi. Ikkinchi yozuvdagi belgilar qiymatlari atrofidagi bitta qo'shtirnoq va if ... then bandi Paskalda keng tarqalgan bo'lib, bu SQL-da takroriy nusxalar bilan sodir bo'ladi. Ushbu parcha natijasida Look_at _more nomli mantiqiy o'zgaruvchi rost ga o'rnatilishi, kursor ochilishi va tsikl kiritilishi kerak. Loop ichida kursordan chiziq tanlanadi va ekranda ko'rsatiladi. Foydalanuvchidan keyingi qatorni ko'rishni xohlaysizmi, deb so'raladi. U N (Yo'q) ga javob bermaguncha, tsikl takrorlanadi va keyingi qiymatlar qatori tanlanadi. Paskal tilining o'zgaruvchilarni e'lon qilish bo'limida look_at_more va javob o'zgaruvchilari mos ravishda mantiqiy o'zgaruvchi va char o'zgaruvchisi sifatida e'lon qilinishi kerak bo'lsa-da, ular SQL buyruqlarida ishlatilmagani uchun SQL deklaratsiyasi bo'limiga kiritilmasligi kerak. Ko'rib turganingizdek, o'zgaruvchilar nomlari oldidagi ikki nuqta SQL bo'lmagan bayonotlar uchun ishlatilmaydi. Keyin, OCHIQ KURSOR operatoriga mos keladigan YAPISH KURSOR operatori mavjudligiga e'tibor bering. Siz tushunganingizdek, qiymat kursorini bo'shatadi, shuning uchun keyingi qiymatlarni tanlashga o'tishdan oldin so'rovni OPEN CURSOR operatori bilan qayta bajarish kerak bo'ladi. Kursor yopilgandan so'ng so'rov tomonidan tanlangan qatorlar uchun bu shart emas, garchi bu oddiy protsedura bo'lsa ham. Kursor yopilganda, SQL qaysi qatorlar tanlanganligini kuzatib bormaydi. Kursorni yana ochsangiz, so'rov shu nuqtadan qayta bajariladi va siz qaytadan boshlaysiz. Ushbu misol barcha qatorlar tanlanganda avtomatik ravishda tsikldan chiqmaydi. FETCH-da olish uchun boshqa qatorlar bo'lmasa, u INTO bandidagi o'zgaruvchilardagi qiymatlarni o'zgartirmaydi. Shuning uchun, agar ma'lumotlar tugagan bo'lsa, foydalanuvchi javobni kiritish orqali tsiklni tugatmaguncha, bu o'zgaruvchilar bir xil qiymatlar bilan qayta-qayta chiqariladi - N.

SQL KODLARI

Ma'lumotlar qachon tugashini bilish yaxshi bo'lardi, shunda foydalanuvchi xabardor bo'lishi mumkin va tsikl avtomatik ravishda tugaydi. Bu, masalan, SQL buyrug'i xato bilan bajarilganligini bilishdan ham muhimroqdir. SQLCODE o'zgaruvchisi (FORTRANda SQLCOD deb ham ataladi) ushbu funktsiyani ta'minlash uchun mo'ljallangan. U xost tilining oʻzgaruvchisi sifatida aniqlanishi va xost tilida koʻrsatilganidek, SQL aniq raqamli turlaridan biriga mos keladigan maʼlumotlar turiga ega boʻlishi kerak. Ilova B. SQLCODE qiymati har safar SQL buyrug'i bajarilganda o'rnatiladi. Asosan uchta imkoniyat mavjud: 1. Buyruq xatosiz bajarildi, lekin hech qanday effekt bermadi. Bu turli jamoalar uchun boshqacha ko'rinadi:

A) SELECT uchun so'rov bo'yicha hech qanday satr tanlanmaydi.

B) FETCH uchun oxirgi qator allaqachon tanlangan yoki kursordagi so‘rov bo‘yicha hech qanday satr tanlanmagan.

C) INSERT uchun hech qanday satr kiritilmagan (so'rov kiritish uchun qiymatlarni yaratish uchun ishlatilgan va har qanday satrlarni olishga harakat qilganda rad etilgan degan ma'noni anglatadi.

D) UPDATE va DELETE uchun hech bir satr predikat shartiga mos kelmadi va shuning uchun jadvalga hech qanday o'zgartirish kiritilmaydi.

Har qanday holatda, kod SQLCODE = 100 ga o'rnatiladi.

2. Yuqoridagi shartlarning hech birini qanoatlantirmasdan, normal bajarilgan buyruq. Bunday holda, SQLCOD = 0 kodi o'rnatiladi.

3. Buyruq xatolik hosil qildi. Agar bu sodir bo'lsa, joriy tranzaksiya tomonidan ma'lumotlar bazasiga kiritilgan o'zgartirishlar tiklanadi (23-bobga qarang). Bunday holda, kod SQLCODE ga o'rnatiladi = dizayner tomonidan aniqlangan ba'zi salbiy raqam. Ushbu raqamning vazifasi muammoni iloji boricha aniq aniqlashdir. Asosan, sizning tizimingiz subprogramma bilan jihozlangan bo'lishi kerak, bu holda sizning dizayneringiz tomonidan aniqlangan salbiy raqamning qiymatini hal qiluvchi ma'lumotni berish uchun bajarilishi kerak. Bunday holda, ekranda ba'zi xato xabari ko'rsatiladi yoki jurnal fayliga yoziladi, shu bilan birga dastur joriy tranzaksiyadagi o'zgarishlarni tiklaydi, ma'lumotlar bazasidan uziladi va undan chiqadi. Endi biz yaxshilashimiz mumkin

Looplarni BOSHQARISH UCHUN SQLCODE FOYDALANISH

kursor bo'sh bo'lsa, barcha qatorlar tanlangan yoki xatolik yuzaga kelsa, tsikldan avtomatik ravishda chiqish uchun oldingi misolimiz: Look_at_more: = lhe; EXEC SQL OPEN CURSOR Londonsales; Look_at_more va SQLCODE = O esa EXEC SQL FETCH London$ales INTO:id_num, :Sotuvchi, :loc, :comm; writeln(id_num, sotuvchi, joy, aloqa); writeln("Ko'proq ma'lumotlarni ko'rishni xohlaysizmi? (Y/H)"); readln (javob); Agar javob = "N" bo'lsa, Look_at_more: = Fabe; oxiri; EXEC SQL CLOSE CURSOR Londonsales;

QAChON TAKLIF

Bu shart bajarilganda chiqish uchun qulay - barcha qatorlar tanlangan. Ammo, agar siz xatoga yo'l qo'ysangiz, yuqoridagi uchinchi holat uchun tavsiflanganga o'xshash ishni bajarishingiz kerak. Buning uchun SQL GOTO bandini taqdim etadi. Aslida, SQL uni juda keng ishlatishga imkon beradi, shunda dastur ma'lum bir SQLCODE qiymati ishlab chiqarilgan bo'lsa, GOTO buyrug'ini avtomatik ravishda bajarishi mumkin. Buni WHENEVER bandi bilan birgalikda qilishingiz mumkin. Bu holat uchun misoldan parcha bor: EXEC SQL WHENEVER SQLERROR GOTO Error_handler; EXEC SQL QACHON TOPIMASA DAVOM ETILADI; SQLERROR - bu SQLCODE haqida xabar berishning yana bir usuli< 0; а NOT FOUND - это другой способ сообщить что SQLCODE = 100. (Некоторые реализации называют последний случай еще как - SQLWARNING.) Error_handler - это им того места в программе в которое будет пере- несено выполнение программы если произошла ошибка (GOTO может состоять из одного или двух слов). Такое место определяется любым способом соответствующим для главного языка, например, с помощью метки в Паскале, или имени раздела или имени параграфа в КОБОЛЕ (в дальнейшем мы будем использовать термин - метка). Метка более удач- но идентифицирует стандартную процедуру распространяемую проектировщиком для включения во все программы.

CONTINUE SQLCODE qiymati uchun maxsus hech narsa qilmaydi. Bu ham standart qiymatdir. agar siz SQLCODE qiymatini aniqlaydigan WHENEVER buyrug'idan foydalanmasangiz. Biroq, bu faol bo'lmagan ta'riflar sizga dasturingizning turli nuqtalarida oldinga va orqaga o'tish, amallarni bajarish va bajarmaslik qobiliyatini beradi. Misol uchun, agar sizning dasturingiz qiymatlarni ishlab chiqarishi kerak bo'lgan so'rovlardan foydalanadigan bir nechta INSERT iboralarini o'z ichiga olsa, siz maxsus xabarni chop etishingiz yoki so'rovlar bo'sh qaytayotganini va hech qanday qiymat kiritilmaganligini tushuntiruvchi biror narsa qilishingiz mumkin. . Bunday holda siz quyidagilarni kiritishingiz mumkin: EXEC SQL WHENEVER NOT FUND GOTO NO_rows; No_rows - bu ma'lum bir amalni o'z ichiga olgan ba'zi kodlardagi yorliq. Boshqa tomondan, agar siz dasturda keyinroq tanlov qilishingiz kerak bo'lsa, ushbu nuqtada quyidagilarni kiritishingiz mumkin, EXEC SQL WHENEVER NOT FUND DAVOM ET; shunday qilib, namuna olish barcha qatorlar olinmaguncha takrorlanadi, bu maxsus ishlov berishni talab qilmaydigan oddiy protsedura.

KURSORLARNI O'ZGARTIRISH

Kursorlar jadvaldan qatorlar guruhini tanlash uchun ham ishlatilishi mumkin, keyin ularni birma-bir o'zgartirish yoki o'chirish mumkin. Bu sizga UPDATE va DELETE buyruqlarida ishlatiladigan predikatlarning ayrim cheklovlarini chetlab o'tish imkoniyatini beradi. Siz kursor so'rovi predikatida qatnashgan jadvalga yoki ushbu buyruqlarning predikatlarida bajarib bo'lmaydigan uning har qanday quyi so'rovlariga murojaat qilishingiz mumkin. Ta'kidlanganidek 16-bob SQL standarti o'rtachadan past reytingga ega bo'lgan barcha foydalanuvchilarni quyidagi shaklda o'chirishga urinishni rad etadi: EXEC SQL DELETE FROM Iste'molchilar reytingi< (SELECT AVG (rating) FROM Customers); Однако, вы можете получить тот же эффект, используя запрос для выбора соответствующих строк, запомнив их в курсоре, и выполнив DELETE с использованием курсора. Сначала вы должны объявить курсор: EXEC SQL DECLARE Belowavg CURSOR FOR SELECT * FROM Customers WHERE rating < (SELECT AVG (rating) FROM Customers); Затем вы должны создать цикл, чтобы удалить всех заказчиков выбранных курсором: EXEC SQL WHENEVER SQLERROR GOTO Error_handler; EXEC SQL OPEN CURSOR Belowavg; while not SOLCODE = 100 do begin EXEC SOL FETCH Belowavg INTO:a, :b, :c, :d, :e; EXEC SOL DELETE FROM Customers WHERE CURRENT OF Belowavg; end; EXEC SOL CLOSE CURSOR Belowavg; Предложение WHERE CURRENT OF означает что DELETE применяется к строке которая в настоящее время выбрана курсором. Здесь подразумевается, что и курсор и команда DELETE, ссылаются на одну и ту же таблицу, и следовательно, что запрос в курсоре - это не объединение. Курсор должен также быть модифицируемым. Являясь модифицируемым, курсор должен удовлетворять тем же условиям что и представления (см. 21-bob). Bundan tashqari, ORDER BY va UNION ko'rinishlarida ruxsat berilmagan kursorlarda ruxsat etiladi, lekin kursorni o'zgartirishdan himoya qiladi. Yuqoridagi misolda biz ushbu o'zgaruvchilardan foydalanishni maqsad qilmagan bo'lsak ham, kursordan o'zgaruvchilar to'plamiga qatorlarni tanlashimiz kerakligini unutmang. Bu FETCH buyrug'i sintaksisi tomonidan talab qilinadi. UPDATE xuddi shunday ishlaydi. Siz ball=300 bo'lgan mijozlarga ega bo'lgan barcha sotuvchilarning komissiya qiymatini quyidagi tarzda oshirishingiz mumkin. Avval siz kursorni e'lon qilasiz: EXEC SOL DECLARE CURSOR High_Cust AS SELECT * FROM Salespeople WHERE snum IN (SELECT snum FROM FROM Customers WHERE reytingi = 300); Keyin siklda modifikatsiyalarni bajarasiz: EXEC SQL OPEN CURSOR High_cust; SQLCODE = 0 esa EXEC SOL FETCH High_cust INTO boshlanadi:id_num, :salesperson, :loc, :comm; EXEC SQL YANGILANISh Salespeople SET comm = comm + .01 High_cust HOZIRGI QAYERDA; oxiri; EXEC SQL CLOSE CURSOR High_cust; E'tibor bering, ba'zi ilovalar kursor ta'rifida kursor ma'lum ustunlarda UPDATE buyrug'ini bajarish uchun ishlatilishini ko'rsatishingizni talab qiladi. Bu kursor ta'rifining yakuniy bandi yordamida amalga oshiriladi - FOR UPDATE. High_cust kursorini shu tarzda e'lon qilish va xabarlar ustunini YANGILASH uchun quyidagi bandni kiriting: EXEC SQL High_Cust KURSORNI SELECT AS * FROM Salespeople WHERE snum IN (SELECT snum FROM FROM Customers WHERE rating = UPDATEOF) FOR. comm; Bu sizga ma'lumotlar bazasining butun tartibini buzishi mumkin bo'lgan tasodifiy o'zgarishlardan himoya qiladi.

INDICATOR O'ZGARCHI

Null - bu SQL tomonidan aniqlangan maxsus tokenlar. Ularni asosiy o'zgaruvchilarga joylashtirish mumkin emas. Asosiy o'zgaruvchiga NULL qiymatlarni kiritishga urinish noto'g'ri bo'ladi, chunki asosiy tillar ta'rifiga ko'ra SQLda NULL qiymatlarni qo'llab-quvvatlamaydi. Asosiy o'zgaruvchiga NULL qiymatini kiritishga urinish natijasi dizayner tomonidan aniqlangan bo'lsa-da, bu natija ma'lumotlar bazasi nazariyasiga zid bo'lmasligi kerak va shuning uchun xatoga olib kelishi kerak: SQLCODE manfiy raqam sifatida va xato boshqaruvini chaqiring. muntazam. Tabiiyki, bundan qochish kerak. Shuning uchun siz dasturingizni buzmaydigan haqiqiy qiymatlarga ega NULL qiymatlarni tanlashingiz mumkin. Dastur ishlamay qolsa ham, asosiy o'zgaruvchilardagi qiymatlar noto'g'ri bo'ladi, chunki ular NULL qiymatlarga ega bo'lolmaydi. Ushbu holat uchun taqdim etilgan muqobil usul indikator o'zgaruvchan funksiyadir. Ko'rsatkich o'zgaruvchisi SQL deklaratsiyasi bo'limida e'lon qilinadi va boshqa o'zgaruvchilarga o'xshaydi. U SQLdagi raqamli turga mos keladigan xost tili turiga ega bo'lishi mumkin. Xost tili o'zgaruvchisiga NULL qiymatini qo'yish kerak bo'lgan operatsiyani bajarganingizda, xavfsiz tomonda bo'lish uchun indikator o'zgaruvchisidan foydalanishingiz kerak. Siz ko'rsatkich o'zgaruvchisini SQL buyrug'iga to'g'ridan-to'g'ri himoya qilmoqchi bo'lgan asosiy til o'zgaruvchisidan keyin joylashtirasiz, bo'sh joy va vergulsiz, garchi ixtiyoriy ravishda INDICATOR so'zini kiritishingiz mumkin. Buyruqdagi indikator o'zgaruvchisiga dastlab 0 qiymati beriladi. Biroq, agar NULL qiymat ishlab chiqarilsa, indikator o'zgaruvchisi manfiy songa teng bo'ladi. NULL qiymati topilganligini ko'rish uchun indikator o'zgaruvchisining qiymatini tekshirishingiz mumkin. Faraz qilaylik, shahar va komma qavatlarida, Vendor jadvallarida NOT NULL cheklovi yo'q va biz SQL deklaratsiyasi bo'limida ikkita PASCAL tamsayı o'zgaruvchilari i_a va i_bni e'lon qilamiz. (E'lonlar bo'limida ularni indikator o'zgaruvchilari sifatida ifodalovchi hech narsa yo'q. Ular indikator o'zgaruvchilari sifatida foydalanilganda indikator o'zgaruvchilarga aylanadi.) Bitta imkoniyat mavjud: EXEC SQL OPEN CURSOR High_cust; SQLCODE = O esa EXEC SQL FETCH High_cust INTO:id_num, :salesperson, :loc:i_a, :commINDlCATOR:i_b boshlanadi; Agar i_a > = O va i_b > = O bo'lsa (NULLlar ishlab chiqarilmaydi) EXEC SQL YANGILANISH Salespeople SET comm = comm + .01 Hlgh_cust HOZIRGI QERDA; else (bir yoki ikkala NULL) boshlanadi If i_a< O then writeln ("salesperson ", id_num, " has no city"); If i_b < O then writeln ("salesperson ", id_num, " has no commission"); end; {else} end; {while} EXEC SQL CLOSE CURSOR High_cust; Как вы видите, мы включили, ключевое слово INDICATOR в одном случае, и исключили его в другом случае, чтобы показать, что эффект будет одинаковым в любом случае. Каждая строка будет выбрана, но команда UPDATE выполнится только если NULL значения не будут обнаружены. Если будут обнаружены NULL значения, выполнится еще одна часть программы, которая распечатает предупреждающее сообщение, где было найдено каждое NULL значение. Обратите внимание: переменные indicator должны проверяться в главном языке, как указывалось выше, а не в предложении WHERE команды SQL. Последнее в принципе не запрещено, но результат часто бывает непредвиденным.

NULL SQL QIYMATLARINI EMULATSIYA QILISH UCHUN INDIKATOR OʻZGARCHIDAN FOYDALANISH

Yana bir imkoniyat - indikator o'zgaruvchisini har bir xost tili o'zgaruvchisi bilan bog'lash, SQL NULL qiymatlarining xatti-harakatlarini taqlid qiluvchi maxsus usulda ishlash. Dasturingizda ushbu qiymatlardan birini ishlatganingizda, masalan, if ... then bandida, avvalo, uning qiymati=NULL ekanligini bilish uchun tegishli indikator o'zgaruvchisini tekshirishingiz mumkin. Agar shunday bo'lsa, unda siz o'zgaruvchiga boshqacha munosabatda bo'lasiz. Misol uchun, agar i_city indikator o'zgaruvchisi bilan bog'langan asosiy o'zgaruvchan shahar uchun shahar maydonidan NULL qiymati chiqarilgan bo'lsa, siz shahar qiymatini bo'shliqlar ketma-ketligiga o'rnatasiz. Bu faqat agar siz uni printerda chop qilsangiz kerak bo'ladi; uning ma'nosi dasturingiz mantig'idan farq qilmasligi kerak. Tabiiyki, i_city avtomatik ravishda salbiy qiymatga o'rnatiladi. Faraz qilaylik, sizning dasturingizda quyidagi konstruksiya mavjud edi: Agar sity = "London" bo'lsa, u holda comm: = comm + .01 else comm: = comm - .01 shahar o'zgaruvchisiga kiritilgan har qanday qiymat "London" ga teng bo'ladi yoki teng emas. Shunday qilib, har bir holatda komissiya qiymati ko'tariladi yoki kamayadi. Biroq, SQLdagi ekvivalent buyruqlar boshqacha bajariladi: EXEC SQL UPDATE Salespeople SET comm = comm + .01 WHERE sity = "London"; va EXEC SQL UPDATE Salespeople SET comm = comm .01; QAYERDA shahar< >"London" (PASCAL versiyasi faqat bitta qiymat bilan ishlaydi, SQL versiyasi esa barcha jadvallar bilan ishlaydi.) Agar SQL versiyasida city qiymati NULL bo'lsa, ikkala predikat ham noma'lum bo'ladi va shuning uchun comm qiymati o'zgartirilmaydi. nima bo'lganda ham. NULL qiymatlarni istisno qiladigan shart yaratish orqali siz xost tilingizning xatti-harakatini bunga moslashtirish uchun indikator oʻzgaruvchisidan foydalanishingiz mumkin: Agar i_city > = O boʻlsa, start Agar city = “London” boʻlsa, u holda comm: = comm + .01 else comm: = comm - .01; oxiri; (boshi va oxiri bu erda faqat tushunish uchun kerak)
QAYD: Ushbu misolning oxirgi satrida eslatma mavjud - (boshi va oxiri faqat tushunish uchun kerak)
Murakkab dasturlarda siz shahar qiymati =NULL ekanligini ko'rsatish uchun mantiqiy o'zgaruvchini "true" ga o'rnatishingiz mumkin. Keyin bu o'zgaruvchini xohlagan vaqtda tekshirishingiz mumkin.

INDICATOR O'ZGARTIRISHNING BOSHQA ISHLATISHLARI

Ko'rsatkich o'zgaruvchisi NULL qiymatini belgilash uchun ham ishlatilishi mumkin. Uni oddiy o'zgaruvchining nomiga UPDATE yoki INSERT buyrug'idagi SELECT buyrug'idagi kabi qo'shing. Agar indikator o'zgaruvchisi manfiy qiymatga ega bo'lsa, maydonga NULL qiymat qo'yiladi. Masalan, i_a yoki i_b indikator o'zgaruvchilari manfiy bo'lganda, quyidagi buyruq NULL qiymatlarni Vendors jadvalining shahar va aloqa maydonlariga joylashtiradi; aks holda, u erda asosiy o'zgaruvchilarning qiymatlarini qo'yadi: EXEC SQL INSERT INTO Salespeople VALUES (:Id_num, :salesperson, :loc:i_a, :comm:i_b); Ko'rsatkich o'zgaruvchisi o'chirilayotgan qatorni ko'rsatish uchun ham ishlatiladi. Agar siz SQL belgilar qiymatlarini barcha belgilarni ushlab turish uchun etarli bo'lmagan asosiy o'zgaruvchiga kiritsangiz, bu sodir bo'ladi. Bu VARCHAR va LONG nostandart ma'lumotlar turlari bilan bog'liq alohida muammodir (qarang Ilova C). Bunday holda, o'zgaruvchi qatorning birinchi belgilari bilan to'ldiriladi va oxirgi belgilar yo'qoladi. Agar indikator o'zgaruvchisi ishlatilsa, u tashlanayotgan satr qismining uzunligini ko'rsatuvchi musbat qiymatga o'rnatiladi va shu bilan sizga qancha belgilar yo'qolganligi haqida xabar beradi. Bunday holda, siz ko'rish orqali tekshirishingiz mumkin - indikator o'zgaruvchisining qiymati > 0, yoki< 0.

XULOSA

Ikki yondashuvning kuchli tomonlarini birlashtirish uchun SQL buyruqlari protsessual tillarda joylashtirilgan. Ishni bajarish uchun ba'zi qo'shimcha SQL vositalari kerak bo'ladi. Old kompilyator deb ataladigan dastur tomonidan xost tili tarjimoni tomonidan foydalanish uchun mos shaklga tarjima qilingan va ushbu xost tilida prekompilyator yaratadigan pastki dasturlarga protsedura chaqiruvi sifatida ishlatiladigan ichki o'rnatilgan SQL buyruqlari kirish modullari deb ataladi. ANSI quyidagi tillarda SQL joylashtirishni qo'llab-quvvatlaydi: PASCAL, FORTRAN, COBOL va PL/I. Boshqa tillar ham qo'llaniladi, ayniqsa C. Ichki SQL-ni qisqacha tavsiflashga urinish uchun ushbu bobdagi eng muhim parchalar:

* Barcha ichki o'rnatilgan SQL buyruqlari EXEC SQL bilan boshlanadi va ishlatiladigan xost tiliga bog'liq bo'lgan tarzda tugaydi.

* SQL buyruqlarida mavjud bo'lgan barcha asosiy o'zgaruvchilar ularni ishlatishdan oldin SQL deklaratsiyasi bo'limida e'lon qilinishi kerak.

* SQL buyrug'ida foydalanilganda barcha asosiy o'zgaruvchilardan oldin ikki nuqta qo'yilishi kerak.

* So'rovlar o'z natijalarini to'g'ridan-to'g'ri asosiy o'zgaruvchilarda INTO bandi yordamida saqlashi mumkin, agar ular bitta qatorni tanlasa.

* Kursorlar so'rov natijalarini saqlash va bir vaqtning o'zida bir qatorga kirish uchun ishlatilishi mumkin. Kursorlar e'lon qilinishi mumkin (agar ular o'z ichiga olgan so'rovni aniqlasa), ochiq (agar ular so'rovni bajarsa) va yopiq (agar ular kursordan so'rov natijasini o'chirib tashlasa). Kursor ochiq bo'lsa, FETCH buyrug'i uni navbat bilan so'rov chiqishining har bir satriga o'tkazish uchun ishlatiladi.

* Kursorlarni o'zgartirish yoki faqat o'qish uchun mo'ljallangan. O'zgartirish mumkin bo'lishi uchun kursor ko'rinish javob beradigan barcha mezonlarga javob berishi kerak; bundan tashqari, u ORDER BY yoki UNION bandlaridan foydalanmasligi kerak, ularni baribir ko'rishlar ishlatib bo'lmaydi. O'zgartirilmaydigan kursor faqat o'qish uchun mo'ljallangan kursordir.

* Agar kursorni oʻzgartirish mumkin boʻlsa, uning yordamida WHERE CURRENT OF bandi orqali ichki oʻrnatilgan UPDATE va DELETE buyruqlari qaysi qatorlarga taʼsir qilishini aniqlash mumkin. DELETE yoki UPDATE kursor so'rovda foydalanayotgan jadvaldan tashqarida bo'lishi kerak.

* SQLCODE ichki SQL ishlatadigan har bir dastur uchun raqamli o'zgaruvchi sifatida e'lon qilinishi kerak. Uning qiymati har bir SQL buyrug'i bajarilgandan so'ng avtomatik ravishda o'rnatiladi.

* Agar SQL buyrug'i odatdagidek bajarilgan bo'lsa, lekin natija yoki ma'lumotlar bazasida kutilgan o'zgarishlarni keltirmagan bo'lsa, SQLCODE = 100. Agar buyruq xatolikka yo'l qo'ygan bo'lsa, SQLCODE xatoni tavsiflovchi ba'zi apparat tomonidan belgilangan salbiy raqamga teng bo'ladi. Aks holda, SQLCODE = 0.

* WHENEVER bandi SQLCODE = 100 (topilmadi) yoki SQLCODE manfiy son (SQLERROR) bo'lganda bajarilishi kerak bo'lgan harakatni aniqlash uchun ishlatilishi mumkin. Harakat dasturdagi ma'lum bir belgiga o'tish bo'lishi mumkin (GOTO

 


O'qing:



Fayllarni qanday arxivlash kerak?

Fayllarni qanday arxivlash kerak?

Ushbu darsda siz arxivlovchi dasturlar bilan tanishasiz, ushbu dasturlardan birini yuklab olib, uni kompyuteringizga o'rnatishingiz mumkin, shuningdek...

Android operatsion tizimining qaysi versiyasi yaxshiroq Android versiyasi

Android operatsion tizimining qaysi versiyasi yaxshiroq Android versiyasi

Ko'pgina Android versiyalarida konfet yoki tort nomlari mavjud. 2008-yil sentabrida ommaga chiqarilgan OS ning birinchi versiyasida (1.0) mavjud emas edi...

Mkv ni qanday ochish kerak Mkv ni ko'rgan ma'qul

Mkv ni qanday ochish kerak Mkv ni ko'rgan ma'qul

MKV fayllari haqida gapirishdan oldin, bir oz tarixga qaraylik. Matroska videolari sifatida ham tanilgan MKV fayllari...

Windows-da mkv video faylini qanday ochish mumkin Mkv formati nima?

Windows-da mkv video faylini qanday ochish mumkin Mkv formati nima?

Ushbu maqolada biz sizga .mkv kengaytmali fayllar haqida nimalarni bilishingiz kerakligini aytib beramiz va videolarni birinchi marta yuklab olgan har bir kishi uchun paydo bo'ladigan savolga javob beramiz ...

tasma tasviri RSS