ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.11.2023
Просмотров: 77
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
(УСТРАНЕНИЕ ИЗБЫТОЧНОСТИ) Назар аударатын болсақ біз жасаған қорытынды әрбір комбинация үшін екі түрлі мағынаға ие болады, сондай-ақ екіншісінде кері ретпен болады. Бұлай болудың себебі әрбір мағына әррбір псевдонимде бірінші рет көрсетілген, және екінші рет ( сим-
метриялы) предикатта көрсетілген. Осылайша, псевдонимде А мағынасы алдымен В мағынасымен бір комбинацияда таңдап алынады, ал содан кейін екінші псевдонимде А мағынасы бірінші псевдонимдегі В мағынасының кңомбинациясымен таңдап алынады.Біздің мысалда бірінші 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. Әр күн сайын өз ретімен тапсырушы санын тіркейтін сұраныс құрыңыз.(Егер сатушы сол күні бірден көп ретті қамтыса, онда ол бір рет қана есепке алынуы керек).