Тақырыбы: КЕСТЕЛЕРДІҢ ӨЗАРА БІРІГУІ
Әдістемелік нұсқау. Кестелердің өзімен бірігуін қалай жасауға болады?
Кестені өзімен біріктіру үшін,сіз кестенің әрбір жолын, бір уақытта, әрі оның өзімен комбинациясы және кестенің әрбір басқа жолымен комбинациясы етіп алуыңызға болады.
Одан кейін сіз мульти кестелерді біріктірудегі сияқты, әрбір комбинацияны предикат терминімен бағалайсыз. Бұл сізге жалғыз кестелердің ішіндегі әртүрлі позициялар арасындағы белгілі байланыс түрлерін, бірнеше жолды өріс мәнімен анықтау көмегімен, оңай құруға көмектеседі. Мысалы, сіз кестенің өзімен бірігуін бір кестенің екі көшірмесінің бірігуі секілді бейнелеуіңізге болады.Шын мәнінде кестелер көшірілмейді,бірақ SQL бұл мүмкін болатындай команданы орындайды.
Басқаша айтатын болсақ, бұл бірігу-екі кесте арасындағы кез-келген басқа бірігу сияқты, бір ескеретіні бұл жағдайда екі кесте де бірдей.
ПСЕВДОНИМДЕР (бүркеншік аттар)
Кестелердің өзімен бірігуі үшін қолданылатын команда синтаксисі, бір көшірмедегі көптеген кестелердің бірігуі секілді.Сіз кестелерді өзімен біріктіру кезінде, бағанның барлық қайталанатын аттарын, кестенің атының префиксімен толтырасыз. Ішкі сұраныс кезінде осы кестелерге жүгіну үшін, сіз осы кестеге екі әртүрлі ат қоюыңыз керек.
Сіз оны айнымалы диапазоны, корреляция айнымалысы немесе жай ғана псевдонимдер деп аталатын уақыт аттарын анықтау көмегімен істей аласыз.
Сіз оларды сұраныстағы FROM сөйлемінен анықтайсыз. Бұл өте оңай: сіз кесте атын тересіз, бос орын қалтырасыз, содан кейін оған псевдонимді тересіз. Тапсырыс берушілердің, бірдей рейтингқа ие болатын, барлық жұбын табатын бір мысал бар.
(нәтижесі 9.1 суретте көрсетілген ):
SELECT first.cname, second.cname, first.rating FROM Customers first, Customers second
WHERE first.rating = second.rating;
=============== SQL Execution Log ==============
| Giovanni Giovanni 200 |
| Giovanni Liu 200 |
| Liu Giovanni 200 |
| Liu Liu 200 |
| Grass Grass 300 |
| Grass Cisneros 300 |
| Clemens Hoffman 100 |
| Clemens Clemens 100 |
| Clemens Pereira 100 |
| Cisneros Grass 300 |
| Cisneros Cisneros 300 |
| Pereira Hoffman 100 |
| Pereira Clemens 100 |
| Pereira Pereira 100 |
===============================================
9.1 Сурет: Кестенің өзімен бірігуі
(9.1 суретте кейін келтірілетін мысалдардағы сияқты, нәтиже терезесінде толық сұраныс симайды, және сәйкесінше қиылысатынына назар аударыңыздар.)
Жоғарыда көрсетілген команда бойынша SQL "бірінші" және "екінші" деп аталатын екі кестені біріктіретіндей іс-әрекет көрсетеді. Екеуі де –іс жүзінде тапсырыс беруші кестесі болып табылады, бірақ псевдонимдер тәуелсіз қайта өнделуіне рұқсат береді.
Бірінші және екінші псевдонимдер сұраныстың FROM сөйлемінде кесте көшірмесі атынан кейін орналасқан. Назар аударатын болсақ псевдонимдер SELECT сөйлемінде де қолданылуы мүмкін, егер олар FROM сөйлемінде анықталмаса да.
Бұл- өте жақсы. SQL алдымен кез-келген мұндай псевдонимдерді өз үміті бойынша жіберіп отырады, бірақ егер олар ары қарай сұраныстың FROM сөйлемінде анықталмаса команданы орындамайды.
Псевдонимдер тек команда орындалып жатқанда ғана бар болады! Сұраныс аяқталып қалғанда, онда қолданылатын псевдонимдер ешқандай мағынаға ие болмайды.
Енді, тапсырыс берушінің кестесінің екі көшірмесі бар болып тұрған кезде, олармен жұмыс істеу үшін,бұл операцияны SQL дәл басқа бірігулер сияқты- бір псевдонимнің әрбір жолын алып және оны басқа псевдонимнің әрбір жолымен салыстыра отырып өндей алады.
(УСТРАНЕНИЕ ИЗБЫТОЧНОСТИ) Назар аударатын болсақ біз жасаған қорытынды әрбір комбинация үшін екі түрлі мағынаға ие болады, сондай-ақ екіншісінде кері ретпен болады. Бұлай болудың себебі әрбір мағына әррбір псевдонимде бірінші рет көрсетілген, және екінші рет ( сим-
метриялы) предикатта көрсетілген. Осылайша, псевдонимде А мағынасы алдымен В мағынасымен бір комбинацияда таңдап алынады, ал содан кейін екінші псевдонимде А мағынасы бірінші псевдонимдегі В мағынасының кңомбинациясымен таңдап алынады.Біздің мысалда бірінші Hoffman Clemens-пен бірге таңдап алынды,ал содан кейін Clemens Hoffman-мен бірге таңдап алынды.Дәл осы жағдай Cisneros және Grass, Liu және Giovanni-мен орындалды және т.с.с.Сонымен қатар Liu және Liu жолын шығару үшін, әрбір жол өз-өзімен салыстырылды. Бұндайдан аулақ болудың қарапайым тәсілі екі мағынаға, біреуі екіншісіне қарағанда кем немесе оған әліпбилік тәртіппен қайталанып отыратындай, тәртіп орнату болып табылады. Бұл предикатты ассиметриялық қылады, сондықтан да дәл сол мағыналар керісінше ретте қайталанып алынбайды, мысалы:
SELECT tirst.cname, second.cname, first.rating
FROM Customers first, Customers second
WHERE first.rating = second.rating AND first.cname < second.cname;
Бұл сұраныстың нәтижесі 9.2 суретте көрсетілген.
Hoffman әліпбилік рет бойынша Periera-ның алдында болады, сондықтан комбинация предикаттың екі шартын да қанағаттандыратын болғандықтан нәтижеде көрсетілген. Егер осы комбинация кері ретпен шығатын болса,яғни егер бірінші кестенің псевдонимінде Periera псевдонимнің екінші кетесіндегі Hoffman-мен салыстырылатын болса,онда екінші шарт кездеспейді. Аналогиялық тұрғыдан ойлайтын болсақ, Hoffman өзі болған сол рейтингтің бар болуынан таңдап алынбайды, себебі оның аты өзінің атының алдында әліпбилік тәртіппен орналаспаған.
=============== SQL Execution Log ==============
| SELECT first.cname, second.cname, first.rating |
| FROM Customers first, Customers second |
| WHERE first.rating = second.rating |
| AND first.cname < second.cname |
| =============================================== |
| cname cname rating |
| ------- --------- ------- |
| Hoffman Pereira 100 |
| Giovanni Liu 200 |
| Clemens Hoffman 100 |
| Pereira Pereira 100 |
| Gisneros Grass 300 |
=================================================
9.2 сурет:
Егер сіз сұраныста жолдарды өзімен салыстыруды енгізгіңіз келсе <орнына < = қолдануыңызға болады.
ҚАТЕЛЕРДІ ТҮЗЕТУ
Осылайша біз SQL-дің бұндай ерекшелігін қателердің белгілі бір түрін тексеру үшін қолданамыз.Кестелер ретін қарап отырған кезде, сіз cnum және snum өрістері тұрақы бір байланыста болатынын көресіздер.Әрбір тапсырыс беруші тек бір сатушыға ғана белгіленуі керек, әр қашан тапсырыс берушінің номері тәртіп кестесінде шығып тұруы керек, ол сатушының номерімен сәйкес келуі керек. Келесі команда осы облыстағы кез-келген келіспеушілікті анықтайды:
SELECT first.onum, tirst.cnum, first.snum,
second.onum, second.cnum,second.snum
FROM Orders first, Orders second
WHERE first.cnum = second.cnum
AND first.snum < > second.snum;
Бұл қиын болып көрінгенімен, бұл команданың логикасы қарапайым.Ол тәртіп кестесінің бірінші жолын алып, оны бірінші псевдониммен есте сақтап, және оны тәртіп кестесінің әрбір жолын екінші пседониммен комбинациясын бірінен сон бірін тексереді. Егер жол комбинациясы предикатты қанағаттандыратын болса, онда ол нәтиже үшін таңдап алынады.Бұл жағдайда предикат осы жолды қарастырады, cnum=2008 өрісі, ал snum=1007 өрісі осындай болатынжолды тауып, одан кейін әрбір келесі жолды сол cnum өрісінің мәнімен қарастырады.Егер ол snum өрісіндегі мағынадан өзгеше қандай-да бір мән тапса, онда предикат дұрыс болады және келесі жолдар комбинациясынан таңдалған өрісті шығарады.Егер snum мағынасы берілген cnum мағынасымен біздің кетеде сәйкес келсе, бұл команда ешқандай нәтиже шығармайды.
КӨПТЕГЕН БҮРКЕНІШ АТТАР
Командадағы кестенің альтернативті атын құру кезінде кез –келген уақытта бүркеніш ат қолдана аласыз. Мысалы , егер сіздің кестеңіздің аты өте ұзақ және күрделі болса , онда сіз олардың орнына a немесе b сияқты символдардан тұратын қарапайым бүркеніш ат қолдануыңызға болады, және олар SELECT және предикат сөйлемдерінде кестенің аты орнына қолданылады. Олар сұранысқа қатысты қолданылады ( 11 бөлімде талқыланған ).
ОДАН ДА КӨП КОМПЛЕКСТІК БІРІГУЛЕР
Сіз сұраныстағы бір кестеге кез-келген бүркеніш ат санын қолдана аласыз. Бірақ берілген SELECT* сөйлемінде екіден көп бүркеніш ат қолдануға болмайды.
Айталық, сіз сатушыңызға тапсырыс берушіңізді тағайындаған жоқсыз. Әр компания әрбір сатушысынна бастапқыда әрқайсысы бір рейтингтік мәннен тұратын үш тапсырыс берушіден тағайындау керек. Қай сатушыға қай тапсырыс берушіні сіз өзіңіз білесіз, бірақ сіз тағайындайтын тапсырыс берушілеріңіздің мүмкін комбинациясын көру үшін келесі сұранысты қолданасыз. ( Қорытынды 9.3 суретте көрсетілген ):
SELECT a.cnum, b.cnum, c.cnum
FROM Customers a, Customers b, Customers c
WHERE a.rating = 100 AND b.rating = 200 AND c.rating = 300;
=============== SQL Execution Log ==============
| AND c.rating = 300; |
| =============================================== |
| cnum cnum cnum |
| ----- ------ ------ |
| 2001 2002 2004 |
| 2001 2002 2008 |
| 2001 2003 2004 |
| 2001 2003 2008 |
| 2006 2002 2004 |
| 2006 2002 2008 |
=================================================
9.3 Сурет Әр түрлі рейтингтегі қолданушылар комбинациясы
Көріп тұрғандай бұл сұраныс үш мәнді бағадан тұратын тапсырыс берушілер комбинациясынан тұрады, сондықтан бірінші баған 100 деген бағадан тұратын тапсырыс берушілерден, екіншісі 200 және соңғысы 300 деген бағадан тапсырыс берушілерден тұрады. Олар барлық мүмкін болатын комбинацияларда қайталанады. Бұл- бір бағанда мәндерді салыстыратындықтан, GROUP BY немесе ORDER BY- мен қатар орындалмайтын топтамалардың сұрыпталуы.
SELECT сөлеміндегі FROM сұраныс сөйлемінде кездесетін әрбір бүркеніш атты немесе кестені әрдайым қолдану қажет емес. Кейде , сұраныс предикатында шақырылғандықтан, сөйлем немесе кесте сұранысқа ие болады. Мысалы, келесі сұраныс сатушысы Serres ( snum 1002 ) болған барлық қалалардың тапсырыс берушілерін табады.( Қорытынды 9.4 суретте көрсетілген ):
SELECT b.cnum, b.cname FROM Customers a, Customers b
WHERE a.snum = 1002 AND b.city = a.city;
=============== SQL Execution Log ============
| SELECT b.cnum, b.cname |
| FROM Customers a, Customers b |
| WHERE a.snum = 1002 |
| AND b.city = a.city; |
| ==============================================|
| cnum cname |
| ------ --------- |
| 2003 Liu |
| 2008 Cisneros |
| 2004 Grass |
=============================================
9.4 Сурет Serres –ке қатысты барлық қалалардағы тапсырыс берушілерді табу .
a бүркеніш аты бағанның мәні snum = 1002 болмаған жағдайда предикатты қате етеді. Осындай жағдайда бүркеншік ат Serres сатушысының тапсырыс берушісінен басқасының барлығын жібереді. в бүркеншік аты сол а-ға арналған қаланың ағымдағы атының мәніне сәйкес келетін барлық жолдарға дұрыс деп саналады; егер қаланың мәні а-да берілсе, сұраныс кезінде а бүркеншік атының жолы 1 рет дұрыс болады. в бүркеншік атының осы жолдарын табу – а бүркеншік атының жалғыз мақсаты, сондықтан да біз барлық бағандарды бірге таңдамаймыз. Көріп тұрғанымыздай, Serres меншік тапсырушылары өзі табылып тұрған қаланың өзінен табылады, сондықтан олардың а бүркеншік атынан таңдалуы міндетті болады. Қысқасы, бүркеніш ат Serres, Liu, және Grass тапсырушыларының жолдарын табады. в бүркеншік аты кез келген тапсырушыларды табады (San Jose және Berlin сәйкесінше), Liu, және Grass- тың өзін қосқанда.
Сіз сондай – ақ әр түрлі кестелер және жалғыз кестенің бүркеншік аты болатын біріктіру құра ласыз. Келесі сұраныс Тұтынушылардың кестесін өз-өзімен ьіріктіреді:бір сатушының қызметін пайдаланатын тапсырушылардың барлық жұптарын табу үшін. Дәл сол уақытта бұл сұраныс тапсырыс берушіні Сатушылар кестесімен (сол сатушы атымен) байланыстырады (қорытындысы 9.5 суретінде көрсетілген):
SELECT sname, Salespeople.snum, first.cname second.cname
FROM Customers first, Customers second, Salespeople
WHERE first.snum = second.snum AND Salespeople.snum = first.snum
AND first.cnum < second.cnum;
=============== SQL Execution Log ==================
| SELECT cname, Salespeople.snum, first.cname |
| second.cname |
| FROM Customers first, Customers second, Salespeople |
| WHERE first.snum = second.snum |
| AND Salespeople.snum = first.snum |
| AND first.cnum < second.cnum; |
| ====================================================|
| cname snum cname cname |
| ------ ------ -------- -------- |
| Serres 1002 Liu Grass |
| Peel 1001 Hoffman Clemens |
=====================================================
Сурет-9.5: Кестенің өз-өзімен және басқа кестелермен бірігуі
№8 практикалық сабағына арналған тапсырмалар:
1. Бір қалада тұратын сатушылар жұбын шығаратын сұраныс жазыңыз.Сатушылардың өздерімен қоса комбинацияларын, және де кері түрде шығатын жолдар көшірмесін алып тастаңыз.
2. Тапсырыс берушілердің мәліметі, олардың аттары бойынша реттелген жұптардың барлығын шығаратын сұраныс құр. Алдыңғыдағыдай қорытындыдан шығатын көшірмелерді алып тастау қажет.
3. Барлық тапсырыс берушілердің атын (name) мен қаласын (city) Hoffman-дағыдай бағамен шығатын сұраныс жаз. Hoffman-ның бағасын емес, оның cnum өрісін пайдаланатын сұраныс құр, және де сол өріс бағаның күрт өзгеруіне байланысты қолданылатын болсын.
4. БІЛІМ АЛУШЫЛАРДЫҢ (МАГИСТРАНТАРДЫҢ) өздік жұмысы
Өздік жұмысты ұйымдастыру бойынша әдістемелік нұсқаулар: білім алушылардың (магистрантардың) өздік жұмысы (БӨЖ) реферат түрінде орындалады және білім алушылардың (магистрантардың) өздік жұмысын қойлатын талаптарға сәйкес тапсырылады.
Өздік жұмысты бақылау келесі формада өтуі мүмкін:
– жасалған жұмысты көрсету;
– өздік меңгерген тақырып бойынша баяндама;
– аудиториялық сабақтарды немесе ОББӨЖ-де ауызша сұрау;
– жазбаша орындалған тапсырмаларды қорғау.
Өздік жұмысының нәтижелерін тапсырмаған студент қорытынды аттестацияға жіберілмейді.
Өз бетімен меңгерген материал оқытушумен бірге меңгерілген материалмен қоса қорытынды бақылауға шығарылады.
4.1. Білім алушылардың оқытушы басшылығымен орындайтын өздік жұмыстары(БОӨЖ)
БОӨЖ №1
SQL – МЕН ЖҰМЫС
1. Тапсырыс берушілер кестесіндегі қай өріс алғашқы кілт болып табылады?
2. Тапсырыс берушілер кестесіндегі 4-ші баған нені білдіреді?
3. Жол басқаша қалай аталады? Баған?
4. Кестенің алғашқы бес жолды көру үшін сұраныс жасамауға болады. Неге?
БОӨЖ №2
SQL-мен ЖҰМЫС
1. SQL-да берілген типтердің арасындағы негізгі айырмашылықтары қандай?
2. ANSI типі DATA мәліметтерін оқи ма(Распознает) ?
3. SQL-дің қай ішкі бөлімі кестеге мәліметтер орналастыру үшін қолданылады?
4. Кілтті сөз дегеніміз не?
БОӨЖ №3
SQL – МЕН ЖҰМЫС
1. Реттер кестесідегі рет нөмірді, соманы және күнді шығаратын SELECT командасын жазыңыз.
2. Реттер кестесіндегі нөмірі 1001-ге тең болатын сатушылардың барлық жолдарын шығаратын сұраныс жазыңыз.
3. Кестені бағандарын мына ретпен city, sname, snum, comm шығаратын сұраныс жазыңыз.
4. San Jose-дегі әрбір тапсырушының атымен бірге оның бағасын(rating) шығаратын SELECT командасын жазыңыз.
5. Реттер кестесінен барлық сатушылардың snum өрісінің мәндерін ағымдағы ретпен қайталаусыз шығаратын сұраныс жазыңыз.
БОӨЖ №4
SQL – МЕН ЖҰМЫС
1.$1,000-дан аспайтын мәннен тұратын барлық реттерді бере алатын сұраныс жаса.
2.Лондондағы барлық сатушыларға 10-нан артық комиссиялық sname және city өрісін беретін сұраныс жаса.
3. Нәтижесі барлық тапсырыс берушілердің бағасы =< 100 болатын Тапсырыс беруші кестесіне сұраныс жаса, егер олар Римде болмаса.
4. Сұраныстың нәтижесі қандай?
SELECT * FROM Orders
WHERE (amt < 1000 OR NOT (odate = 10/03/1990 AND cnum > 2003 ));
5. Келесі сұраныстың нәтижесі қандай?
SELECT * FROM Orders
WHERE NOT ((odate = 10/03/1990 OR snum > 1006) AND amt > = 1500);
6. Сұранысты оңайлатып қалай жазуға болады?
SELECT snum, sname, city, comm. FROM Salespeople
WHERE ( comm > + .12 OR comm < .14 );
БОӨЖ №5
SQL – МЕН ЖҰМЫС
1. 3 қазандағы барлық табыс соммасын санайтын сұраныс жазыңыз.
2. Тапсырушы кестесінде city өрісіндегі мән NULL әртүрлі санын санайтын сұраныс құрыңыз.
3. Әрбір тапсырушы үшін ең төмен сомманы таңдайтын сұраныс құрыңыз.
4. Тапсырушының аты-жөні G әріпінен басталатындай етіп алфавиттік ретпен таңдайтын сұраныс құрыңыз.
5. Әр қаланың жоғарғы бағасын таңдайтын сұраныс құрыңыз.
6. Әр күн сайын өз ретімен тапсырушы санын тіркейтін сұраныс құрыңыз.(Егер сатушы сол күні бірден көп ретті қамтыса, онда ол бір рет қана есепке алынуы керек).
БОӨЖ №6
SQL – МЕН ЖҰМЫС
1.Әрбір сатушының 12% комиссиялығы бар деп есептейік. Рет номерін, сатушы номерін әне сатушы комиссиялығының осы реттегі суммасын шығаратын Реттер кестесіне сұраныс жазыңыз.
2. Әрбір қаладағы жоғарғы бағаны табатын Тапсырушы кестесіне сұраныс жазыңыз. Нәтиже осындай формада болуы қажет:
For the city (city), the highest rating is: (rating).
3. Тапсырушылар ретін кері ретте шығаратын сұраныс жазыңыз. Баға ( rating ) өрісінің нәтижесі тапсырушының атымен немесе оның номерімен белгіленуі керек.
4. Әр күнге жалпы ретті шығаратын және нәтижесін кері ретте орналастыратын сұраныс жазыңыз.
БОӨЖ №7
SQL – МЕН ЖҰМЫС
1. Бір қалада тұратын сатушылар жұбын шығаратын сұраныс жазыңыз.Сатушылардың өздерімен қоса комбинацияларын, және де кері түрде шығатын жолдар көшірмесін алып тастаңыз.
2. Тапсырыс берушілердің мәліметі, олардың аттары бойынша реттелген жұптардың барлығын шығаратын сұраныс құр. Алдыңғыдағыдай қорытындыдан шығатын көшірмелерді алып тастау қажет.
3. Барлық тапсырыс берушілердің атын (name) мен қаласын (city) Hoffman-дағыдай бағамен шығатын сұраныс жаз. Hoffman-ның бағасын емес, оның cnum өрісін пайдаланатын сұраныс құр, және де сол өріс бағаның күрт өзгеруіне байланысты қолданылатын болсын.
БОӨЖ-ні жүргізу түрі: Зертханалық сабақтың тақырыбы бойынша тапсырмаларды орындау керек.
4.2.Өздік жұмыс тақырыптары:
-
ДҚ түсінігі. Терминдердің мағынасы: кесте, біріншілік кілт.
-
Деректерді ұсынудың моделдері
-
Деректер қорының обектілерін басқару.
-
Кестелер арасында байланыстар. Кесте құруда қолданылатын типтер.
-
SELECT таңдау операторы. Кестеден жазбаларды таңдау. WHERE және ORDER BY операторларының элементтері, олардың тағайындалулары.
-
SQL- сұранысы көмегімен кестелерді біріктіру. Ішкі біріктірулер.
-
Кестелер арасындағы байланыс. Сұранымдар.
-
Сұраным көмегiмен белгілі-бір өрістер бойынша кестедегі жазбаларды сұрыптау.
-
Реляциялық деректер базасы. SQL . Мәліметтердің әртүрлі типтері
-
SQL -ді кестеден ақпаратты шығаруда қолдану. Қосымшаларды пайдалануда таңдау жасау
-
Реляциялық және бульдік операторларды одан да көп предикаттарды шығаруда пайдалану
-
Шарттарға арнайы операторларды қолдану.
-
Агрегаттық функциялар.
-
Кестелердің өзара бірігуі
-
Деректер қорының қауіпсіздігін басқару.
БӨЖ-н жүргізу түрі: Тақырыптар бойынша тапсырмалар орындау
Достарыңызбен бөлісу: |