Файл: 02. 09. 2010 1 басылым 03. 09. 2013 2 басылым.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.11.2023

Просмотров: 86

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


SELECT * FROM Customers WHERE rating = 100;

Жалғыз жақшалар мұнда қолданылмайды, себебі бағалау – ол сандық өріс. Сұраныс нәтижесі Сурет 3. 7-де көрсетілген.

=============== SQL Execution Log ============

| SELECT * |

| FROM Customers |

| WHERE rating = 100; |

| ============================================= |

| сnum cname city rating snum |

| ------ -------- ------ ---- ------ |

| 2001 Hoffman London 100 1001 |

| 2006 Clemens London 100 1001 |

| 2007 Pereira Rome 100 1001 |

=============================================

Сурет 3.7: SELECT предикаттағы сандық өрісімен

3 зертханалық сабағына арналған тапсырмалар:

1. Реттер кестесідегі рет нөмірді, соманы және күнді шығаратын SELECT командасын жазыңыз.

2. Реттер кестесіндегі нөмірі 1001-ге тең болатын сатушылардың барлық жолдарын шығаратын сұраныс жазыңыз.

3. Кестені бағандарын мына ретпен city, sname, snum, comm шығаратын сұраныс жазыңыз.

4. San Jose-дегі әрбір тапсырушының атымен бірге оның бағасын(rating) шығаратын SELECT командасын жазыңыз.

5. Реттер кестесінен барлық сатушылардың snum өрісінің мәндерін ағымдағы ретпен қайталаусыз шығаратын сұраныс жазыңыз.
4 зертханалық сабағы (2-сағат).

Тақырыбы: РЕЛЯЦИОНДЫ ЖӘНЕ БУЛЕВ ОПЕРАТОРЛАРЫНЫҢ ОДАН ДА КӨП ПРЕДИКАТТАРДЫ ШЫҒАРУДА ҚОЛДАНУ

Әдістемелік нұсқау.

========= РЕЛЯЦИОНДЫ ОПЕРАТОРЛАР =======

Реляционды оператор – бұл екі мәннің арасындағы салыстырудың қандай да бір типін көрсететін математикалық символ . 2 + 3 = 5 немесе city = "London" теңдіктері қалай қолданылатыннын сіздер көрдіңіздер. Бірақ бұдан басқа да реляционды операторлар бар. Сіз барлық саудагерлердің анықталған мөлшерден жоғары коммисионымен көргіңіз келеді деп есептейік .

Сіз "үлкен" - (>) типтегі салыстыруды қолдана аласыз. SQL қолданатын реляционды операторлар:

= теңдік, > үлкен, < кіші, >= үлкен не тең, <= кіші не тең, <> тең емес

Бұл операторлар сандық мәндер үшін стандарт мәнге ие болады . Символдың мәні үшін олардың анықталуы сіз колданған ,

ASCII және EBCDIC , түрлендіру форматына байланысты болады. SQL символдық мәндерді түрлендіру форматында көрсетілгендей негізгі нөмірлер терминінде салыстырады . Даже значение символа, такого как "1" сияқты ,нөмірді көрсететін , символдың мәні өзіне тең болуы қажет емес. Реляционды операторды сіз алфавиттік қатар орнату үшін қолдануыңызға болады - мысалы , "a" < "n" мұндағы a алфавиттік қатарда бірінші - бірақ бұның бәрі түрлендіру форматының параметрімен шектеледі .


ASCII- да және EBCDIC- да да, символдар – мәндері бойынша : алфавиттік қатарда олардың алдындағы басқа символдардан кіші және бір вариантты болады ( жоғарғы немесе төменгі ). В ASCII, жоғарғы р регистрдегі барлық символдар - төменгі регистрдің барлық символдарынан кіші, сондықтан "Z" < "a", ал барлық нөмірлер – барлық символдардан кіші, сондықтан "1" < "Z". Бұл EBCDIC – ке де қатысты. Бұл келісімді қарапайымды ету үшін сіз ASCII - ді қолданады деп есептейік. Егер сіз қандай формат қолданатыныңызды немесе оның қалай жұмыс істейтініне күмандансаңыз өзіңіздің документацияңыздың жүйесімен танысыңыз.

Бұл жерде салыстырылатын мәндер - скаляр мәндер деп аталады . Скаляр мәндер скаляр өрнектермен қолданылады; 1 + 2 –бұл скаляр өрнек 3 скаляр мәнін көрсетеді. Скаляр мән , арифметикалық операторлармен тек нөмірлер қолданатыны белгілі болса да , символ немесе сан болуы мүмкін , + (қосу) немесе *(жұлдызша) деген сияқты.

Сіз 200- ден жоғары (rating) бағасын беретін көргігіңізкеледі делік . 200 - скаляр мән болғандықтан және бағалау бағанындағы мән де скаляр болғандықтан оларды салыстыру үшін реляционды операторды қолданамыз.

SELECT * FROM Customers WHERE rating > 200;

Негізгі Булевы операторлары да SQL да қарастырылады. Буль өрнегі Предикаттар сияқты не дұрыс не дұрыс емес болып табылады. Булев операторларын бір немесе бірнеше дұрыс/дұрыс емес мәндер байланыстырып тұрады және жаолғыз дұрыс немесе дұрыс емес шешім шығарады.

SQL де Бульдің стандартты операторлары :

AND, OR, и NOT.

=============== SQL Execution Log ============

| SELECT * |

| FROM Customers |

| WHERE rating > 200; |

| ============================================= |

| snum cname city rating snum |

| ----- -------- -------- ----- ------ |

| 2004 Crass Berlin 300 1002 |

| 2008 Cirneros San Jose 300 1007 |

=============================================

4.1 сурет: үлкен (>) қолданылуы

Буль операторының бұдан да қиын түрлері кездеседі ( " алынып тасталған немесе " типтегі ), бірақ олар мына 3 жай операторлардан - AND, OR, NOT жасалуы мүмкін.

Булевтің дұрыс/ дұрыс емес логикасы – сандық компьютер амалына негізделгеннін қалай түсінесіз; және іс жүзінде барлық SQL( немесе кезөкелгнбасқа бір тіл) Булевой логикасының деңгеіне келтірілуі мүмкін.

Буль операторлары және олар қалай жұмыс істейді:

* AND аргумент ретінде екі Бульді алады ( A AND B түрінде) және оларды екеуі де дұрыс па екендігін ақиқатқасай бағалайды.

* OR аргумент ретінде екі Бульді алады( A OR B түрінде) және оның біреуі дұрыс па екендігін бағалайды.

* NOT аргумент ретінде бірлік Бульді алады ( NOT A түрінде) және оның мәнін дұрыс еместен дұрысқа немесе дұрыстан дұрыс емеске ауыстырады.



Предикаттарды Буль операторымен байланыстыра отыра,сіз олардың мүмкіндігін айтарлықтай өсіре аласыз. Сіз барлық 200 – ден жоғары баға беретін тапсырыс берушілерді

San Jose те көргіңіз келеді делік:

SELECT * FROM Customers WHERE city = " San Jose' AND rating > 200;

Бұл тапсырыстың қорытындысы 4.2 суретте көрсетілген. Бұл шартты қанағаттандыратын бір ғана тапсырыс беруші бар.

Егер сіз OR ді қолдансаңыз San Jose болған барлық тапсырыс берушілерді аласыз немесе (OR) 200 – ден жоғары бағаланғандарды аласыз.

=============== SQL Execution Log ============

| SELECT * |

| FROM Customers |

| WHERE city = 'San Jose' |

| AND rating > 200; |

| ============================================= |

| сnum cname city rating snum |

| ------ -------- -------- ---- ----- |

| 2008 Cirneros San Jose 300 1007 |

=============================================

4.2 сурет: AND қолданатын SELECT

SELECT * FROM Customers WHERE city = " San Jose' OR rating > 200;

Бұл тапсырыстың қорытындысы 4.3 суретте көрсетілген.

NOT Буль мәнін инвертирлеу үшін қолданылуы мүмкін. NOT- пен берілген тапсырыс мысалы анықталған:

SELECT * FROM Customers WHERE city = " San Jose' OR NOT rating > 200;

Бұл тапсырыстың қорытындысы 4.4 суретте көрсетілген.

=============== SQL Execution Log ============

| SELECT * FROM Customers WHERE city = 'San Jose' OR rating > 200;

| ============================================= |

| сnum cname city rating snum |

| ----- ------- -------- ----- ------ |

| 2003 Liu San Jose 200 1002 |

| 2004 Grass Berlin 300 1002 |

| 2008 Cirneros San Jose 300 1007 |

=============================================

4.3 сурет: OR қолданатын SELECT

=============== SQL Execution Log ============

| SELECT * |

| FROM Customers |

| WHERE city = 'San Jose' |

| OR NOT rating > 200; |

| ============================================= |

| cnum cname city rating snum |

| ------ -------- ------ ----- ----- |

| 2001 Hoffman London 100 1001 |

| 2002 Giovanni Rome 200 1003 |

| 2003 Liu San Jose 200 1002 |

| 2006 Clemens London 100 1001 |

| 2008 Cirneros San Jose 300 1007 |

| 2007 Pereira Rome 100 1004 |

=============================================

4.4 сурет: NOT қолданатын SELECT

Grass – тан басқа барлық жазбалар қолданылды. Grass San JoSe- де болған жоқ , және оның бағсы 200- ден үлкен, сондықтан олекі тексеруден де өтпеді.Әрбір басқа жолдарда екі критерийдің бірі кездесіп отырды .Назар аударыңыз NOT операторы Булев операторының алдына түсіп отыру керек, мәні өзгеретіндей , және реляционды оператордың алдына симау керек. Мысалы предикаттың дұрыс енгізілмеуі:

rating NOT > 200

Ол басқа белгілеуді көрсетеді. SQL келесіні қалай бағалайды екен?

SELECT * FROM Customers WHERE NOT city = " San Jose' OR rating > 200;

NOT бұл жерде city = 'SanJose' өрнегіне ғана қолданылады, немесе rating > 200 өрнегіне де ? Жазылып тұрғандай, жауап баяғыдай болады. SQL NOT-ты Буль өрнегімен өзінен кейін бірден қолдануы мүмкін. Мына командадан сіз басқа жауап алуыңыз мүмкін:


SELECT * FROM Customers WHERE NOT( city = " San Jose' OR rating > 200 );

Бұнда SQL жай жақшаларды ішіндегі барлығы бірінші бағаланатындай және сыртындағылардың көмегімен бір өрнек секілді өңделеді(бұл математикада стандартты интерпритация болып табылады ). Басқа сөзбен айтқанда, SQL city = " San Jose' теңдігі немесе rating > 200 теңдігі ақиқатқа сай келетіндей әрбір жолды алады және анықтайды. Егер кез-келген шарт дұрыс болса,жақша ішіндегі Буль өрнегі де дұрыс. Бірақ , егер жақша ішіндегі Буль өрнегі дұрыс болса, онда біртұтас ретінде предикат дұрыс емес, өйткені NOT дұрысты дұрыс емеске ауыстырады және керісінше.

Бұл тапсырыстың қорытындысы 4.5 суретте көрсетілген.

Мынадай қиын мысал бар. Сіз оның логикасын қорыта аласыз ба соны көрейік.(қорытынды 4.6 суретте көрсетілген):

SELECT * FROM Orders WHERE NOT ((odate = 10/03/1990 AND snum >1002)

OR amt > 2000.00);

=============== SQL Execution Log ============

| SELECT * |

| FROM Customers |

| WHERE NOT (city = 'San Jose' |

| OR rating > 200); |

| ============================================= |

| cnum cname city rating snum |

| ----- -------- ------- ----- ------ |

| 2001 Hoffman London 100 1001 |

| 2002 Giovanni Rome 200 1003 |

| 2006 Clemens London 100 1001 |

| 2007 Pereira Rome 100 1004 |

=============================================

4.5 сурет: NOT қолданатын SELECT және кіріспе сөйлем

=============== SQL Execution Log ==============

| SELECT * FROM Orders WHERE NOT ((odate = 10/03/1990 AND snum > 1002) |

| OR amt > 2000.00); |

| =============================================== |

| onum amt odate cnum snum |

| ------ -------- ---------- ----- ----- |

| 3003 767.19 10/03/1990 2001 1001 |

| 3009 1713.23 10/04/1990 2002 1003 |

| 3007 75.75 10/04/1990 2004 1002 |

| 3010 1309.95 10/06/1990 2004 1002 |

=================================================

4.6 сурет: Толық (комплексті) тапсырыс

Булев опреаторлары индивидуалды түрде қарапайым болса да, комплексті өрнекке келтірілгенде олар ондай жеңіл болмайды.
Алдындағы мысал қалай есептелгені жөнінде түсініктеме.Предикаттағы Бульдің анағұрлым тереңірек енгізілген өрнегі - бұл odate =

10/03/1990 және snum > 1002 AND – тің көмегімен біріктірілген болып табылады, бұл осы екі шарт кездесетін барлық жолдар үшін Бульдің бір өрнегінің дұрыстығы арқылы бағаланады. Бұл құрмалас Булев өрнегі

( оны біз нөмір бірінші Булев деп атаймыз, немесе B1 ) (B2) (amt) > 2000.00 өрнегімен OR арқылы бірігеді, үшінші бір (B3) өрнегін тудыра отырып, берілген жолдың дұрыс жолы болып табылатын не B1 не B2 – дұрыс жолы болып табылады.

B3 толығымен жақшаға алынып NOT –ты анықтайды,және ол Бульдің(В4) предикаттың шарты болып табылатын ақырғы өрнегін көрсетеді.

Осылайша B4, сұраныс предикаты, - В3 бұрыс болғанда, әрқашанда дұрыс болады,

B1 мен B2 – дұрыс емес болғанда В3 әрқашанда бұрыс. B1 жол үшін бұрыс егер жолдың реттік мерзімі 10/03/1990 болмаса, немесе егер snum-ның мәні 1002-ден аспаса. B2 әрқашанда барлық жолдарға бұрыс болып табылады,қосындының мәні 2000.00-нан аспайды. Кез-келген 2000.00-нан асатын жол B2 -ні дұрыс қылады; нәтижесінде B3 дұрыс болады, ал B4 бұрыс. Барлық осы жолдар нәтижеден жойылады.Қалған 3 қазан жолдар snum > 1002 болады, (3 қазанға snum = 1007 болатын onum 3001) олар дұрыс В3-тің және бұрыс сұраныс предикаты көмегімен В1-ді дұрыс қылады. Олар да нәтижеден жойылады.Нәтиже қалған жол үшін көрсетіледі.


4 зертханалық сабағына арналған тапсырмалар:

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 зертханалық сабағы (2-сағат).