Тақырыбы: РЕЛЯЦИОНДЫ ЖӘНЕ БУЛЕВ ОПЕРАТОРЛАРЫНЫҢ ОДАН ДА КӨП ПРЕДИКАТТАРДЫ ШЫҒАРУДА ҚОЛДАНУ
Әдістемелік нұсқау.
========= РЕЛЯЦИОНДЫ ОПЕРАТОРЛАР =======
Реляционды оператор – бұл екі мәннің арасындағы салыстырудың қандай да бір типін көрсететін математикалық символ . 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-сағат).
Тақырыбы: ШАРТТАРҒА АРНАЙЫ ОПЕРАТОРЛАРДЫ ҚОЛДАНУ.
Әдістемелік нұсқау.
4-бөлімдегі қаралған РЕЛЯЦИЯЛЫҚ ЖӘНЕ БУЛЬДІК ОПЕРАТОРЛАРҒА ҚОСЫМШАДА SQL арнайы IN, BETWEEN, LIKE, және IS
NULL операторлары қолданылады.Бұл бөлімде оларды қалай қолдану керек және реляциялық операторлар қиынырақ және қуатты предикаттарды жасауға қалай мүмкіндік беретінін оқимыз. IS NULL- операторын қарастырғанда берілгендерді және NULL мәнін қоспайды,ол берілгендердің жоқтығын көрсетеді.Сонымен қатар сендер осы операторлармен қоса NOT операторының әр түрлі жағдайда қолданылуын қарастырасыңдар
============ IN ОПЕРАТОРЫ ===============
IN Операторы берілген мәннің қосылу қосылмауын анықтайтын мәндер жинағын анықтайды. Егер сендер Barcelona мен London-дағы барлық сатушыларды тапқыңыз келсе, онда келесі сұраныстарды қолданасыңдар. Нәтижесі 5.1 суретте көрсетілген
SELECT * FROM Salespeople WHERE city = 'Barcelona' OR city = 'London';
Сол ақпаратты алудың қарапайым әдісі де бар:
SELECT * FROM Salespeople WHERE city IN ( 'Barcelona', 'London' );
Бұл сұраныстың шешімі 5.2 суретте көрсетілген.
Көріп тұрғандай, IN үтірлермен ерекшеленген, жақшаға алынған мәндер жиынын анықтайды. Ол жиындағы мәндерден сәйкестік табу үшін берілген өрістің түрлі мәндерін тексереді. Егер бұл орындалса, предикат- дұрыс.Жиын символдардан емес, номерлер мәнінен тұрса, онда тырнақша алынады. Snum = 1001, 1007, және 1004 мәндері бар сатушыларға қатысты барлық тапсырыс берушілерді табайық,.
Бұл сұраныстың шешімі 5.3 суретте көрсетілген.
SELECT * FROM Customers WHERE cnum IN ( 1001, 1007, 1004 );
=============== SQL Execution Log ============
| SELECT * FROM Salespeople WHERE city = 'Barcelona' OR city = 'London';
| ==============================================|
| snum sname city comm |
| ------ ---------- ----------- ------- |
| 1001 Peel London 0.12 |
| 1004 Motika London 0.11 |
| 1007 Rifkin Barcelona 0.15 |
===============================================
5.1 сурет. Барселондағы және Лондондағы сатушылардың табуы.
=============== SQL Execution Log ============
| SELECT * FROM Salespeople WHERE city IN ('Barcelona', 'London';
| ==============================================|
| snum sname city comm |
| ------ ---------- ----------- ------- |
| 1001 Peel London 0.12 |
| 1004 Motika London 0.11 |
| 1007 Rifkin Barcelona 0.15 |
===============================================
5.2 сурет. SELECT IN қолданады.
=============== SQL Execution Log ============
| SELECT * |
| FROM Customers |
| WHERE snum IN ( 1001, 1007, 1004 ); |
| ============================================= |
| snum cname city rating snum |
| ------ -------- ------ ---- ------ |
| 2001 Hoffman London 100 1001 |
| 2006 Clemens London 100 1001 |
| 2008 Cisneros San Jose 300 1007 |
| 2007 Pereira Rome 100 1004 |
=============================================
5.3 сурет. SELECT номерлермен IN – ді қолданады.
=========== ОПЕРАТОР BETWEEN ==========
BETWEEN IN операторына ұқсас. IN орындайтын сияқты, жиындағы номерлерді қарастырудан өзгешелігі, BETWEEN предикатты дұрыс ететін мәндері кішірейетін диапазонды анықтайды. Сіздер бастапқы мәні бар, AND кілттік сөзі және соңғы мәні бар BETWEEN кілттік сөзін енгізулеріңіз керек. IN- ға қарағанда, BETWEEN реттікке сезімтал болғандықтан, оның сөйлемдегі бастапқы мағынасы алфавиттегі немесе сандық ретпен болуы керек. Ағылшын тілінен қарағанда, SQL “мән BETWEEN мәні және мән арасында “ айтпайды, ал “BETWEEN мәні мән “.(Бұл LIKE операторына тән). Келесі мысал Сатушылар таблицасынан 10 және 12 аралығындағы комиссионды сатушылардан тұрады.(шешім 5.4 суретте көрсетілген):
SELECT * FROM Salespeople
WHERE comm BETWEEN .10 AND .12;
BETWEEN операторы үшін, екімәнді шекарадағы кез келгенмен сәйкес келетін мән предикаттың дұрыс болуына әкеледі (бұл жағдайда, . 10 және . 12) .
=============== SQL Execution Log ============
| SELECT * FROM Salespeople WHERE comm BETWEEN .10 AND .12;
==============================================|
| snum sname city comm |
| ------ ---------- ----------- ------- |
| 1001 Peel London 0.12 |
| 1004 Motika London 0.11 |
| 1003 Axelrod New York 0.10 |
===============================================
5.4 сурет: SELECT BETWEEN қолданады.
SQL BETWEEN қосылмауына қолдау көрсетпейді. Сіз қосылған интерпретация тиімді болу үшін, шекаралық мәніңізді анықтауыңыз керек немесе келесі типтегідей:
SELECT * FROM Salespeople WHERE ( comm BETWEEN .10, AND .12 )
AND NOT comm IN ( .10, .12 );
Жалпы көрініс бойынша, бұл жағдай тиімсіздеу, бірақ бұл қиын предикаттар тудыратын жаңа операторлардың Буль операторымен алмасуын береді. Көбінесе, сіз (IN үшін) жиыннан немесе (BETWEEN үшін) диапазоннан алынатын мәндерді салыстыру үшін реляционды оператор қолданған сияқты IN және BETWEEN қолданасыз.
Және де, реляционды оператор сияқты, BETWEEN ASCIL эквиваленттеріндегі терминдерінде символды өрістермен жұмыс істей алады.Бұл реттелген алфавит мәндерінен мәндер қатарын таңдау үшін BETWEEN қолдануға болатынын көрсетеді.
=============== SQL Execution Log ============
| SELECT * FROM Salespeople WHERE ( comm BETWEEN .10 AND .12
| AND NOT comm IN ( .10 .12; |
| ==============================================|
| snum sname city comm |
| ------ ---------- ----------- ------- |
| 1004 Motika London 0.11 |
===============================================
5.5 сурет: BETWEEN – ді қосылмаған ету.
Бұл сұраныс алфавитті диапазонға түскен тапсырыс берушілдердің аттарын таңдайды:
SELECT * FROM Customers WHERE cname BETWEEN 'A' AND 'G';
Шешім келесі суретте көрсетілген:
Қосылған BETWEEN өзінде Grass және Giovanni болмайды. Бұл BETWEEN түзу емес жолдарды салыстыратынын көрсетеді.. 'G' жолы Giovanni- ға қарағанда қысқа, сондықтан BETWEEN-ді 'G' пробелімен шығарады. Пробелдер алфавит ретіндегі символдардан асып түседі( реализацияның көбінде ), сондықтан Giovanni таңдалмайды. Бұл Grass-қа да қатысты. Мұны алфавиттік диапазоннан мәндерді шығару үшін BETWEEN - ді қолданғанда естен шығармау қажет.Әдетте сіз диапазонды диапазонның басталу және диапазонның аяқталу символымен көрсетесіз( орнына z-ті қоя салуға болады ).
=============== SQL Execution Log ============
| SELECT * FROM Customers WHERE cname BETWEEN 'A' AND 'G';
| ============================================= |
| cnum cname city rating snum |
| ------ -------- ------ ---- ------ |
| 2006 Clemens London 100 1001 |
| 2008 Cisneros San Jose 300 1007 |
=============================================
5. 6 сурет: BETWEEN алфавиттік ретте қолданылуы
============ LIKE ОПЕРАТОРЫ =============
Жол астындағыны табу үшін LIKE – ті CHAR немесе VARCHAR типтегі өрістерге қолданамыз. Яғни ол символ өрісін оның жолының бөлігі шартты қанағаттандыра ма жоқ па соны көру үшін іздейді. Символ ретінде ол топтық символдарды қолданады(wildkards) – бір нәрсеге сәйкес келетін арнайы символдар.
LIKE – пен қолданылатын екі топтық символдар типі бар:
* ( _ ) сызу символы бірлік символдың орнын басады. Мысалы, 'b_t' символы 'bat' или 'bit' сөздеріне сәйкес келеді, бірақ 'brat' – қа сәйкес келмейді.
* знак процента (%) пайыздық символ символдардың кез-келген тізбегінің орнын басады (нөл символымен қоса). Мысалы, '%p%t' символы
'put', 'posit' немесе 'opt' сөздеріне сәйкес келеді, бірақ 'spite' –қа емес.
Аттары G – ден басталатын барлық тапсырыс берушілерді табайық( қорытынды 5.7 суретте көрсетілген):
SELECT * FROM Customers WHERE cname LIKE 'G%';
=============== SQL Execution Log ============
| SELECT * FROM Customers WHERE cname LIKE 'G';
| ============================================= |
| cnum cname city rating snum |
| ------ -------- ------ ---- ------ |
| 2002 Giovanni Rome 200 1003 |
| 2004 Grass Berlin 300 1002 |
=============================================
5. 7 сурет: LIKE - ті %-пен қолданатын SELECT
Егер сіз қалай жазылатынын білмейтін ат немесе басқа бір мән іздесеңіз LIKE – ті қолдану ыңғайлы болады. Сіз өзіңіздің бір сатушыңыздың атын әріптермен қалай жазылғанын Peal немесе Peel дәл білмейсіз делік.Сіз өзіңіз білетін бөлігін және барлық мүмкін қостарды табатындай топтық символдарды қолдануыңызға болады ( бұл сұраныстың қорытындысы 5.8 суретте көрсетілген):
SELECT * FROM Salespeople WHERE sname LIKE 'P _ _ l %';
Әрбіреуі бір символды көрсететін сызба топтық символдары бізде бар 'P' және 'l' – ге екі ғана символ қосады, сондықтан Prettel –ге ұқсас ат көрсетілуі мүмкін емес. ' % ' топтық символы – егер sname өрісінің ұзындығы Peel атындағы символдардың санынан көп болса, жолдың аяғында реализацияның көбінде қажет (sname –нің қандай да бір басқа мәндері – төрт символдан ұзағырақ болғандықтан ). Мұндай жағдайда, поля sname өрісінің мәні, Peel түрінде сақталады және пробелдермен қолданылады. Осыдан, 'l' символы жолдың соңы ретінде қарастырылмайдыне. ' % ' топтық символы – бұл пробелдерге жай ғана сәйкес келеді. Бұл sname өрісі VARCHAR типінде қолданылса маңызды емес.
=============== SQL Execution Log ============
| SELECT * FROM Salespeople WHERE sname LIKE ' P 1% ';
| ==============================================|
| snum sname city comm |
| ------ ---------- ----------- ------- |
| 1001 Peel London 0.12 |
===============================================
5.8 сурет: SELECT LIKE -ті (_) сызбасымен қолданса
Егер сізге жолдан пайыздық немесе сызба белгісін іздеу керек болса, сіз не істейсіз? LIKE предикатында, кез-келген бірлік символды ESC символы ретінде анықтай аласыз. Предикатта ESC символы бірден пайыздық немесе сызба белгісінің алдында қолданылады және ол пайыздық немесе сызба белгісі топтық символ ретінде емес символ ретінде интерпретацияланады. Мысалы, біз сызбасы бар баған sname-ді былай таба аламыз:
SELECT * FROM Salespeople WHERE sname LIKE '%/_%'ESCAPE'/';
Бұл деректермен ешқандай қорытынды болмайды, өйткені біз сатушының атына ешқандай сызбаны қоспадық . ESCAPE сөйлемі '/ ' – ті ESC символы ретінде анықтайды. Символ ESC используемый в LIKE –те қолданылатын ESC символы тпотық символ ретінде өңделмейді ,ол бағанда ізделетін пайыз белгісімен,сызба белгісімен немесе ESCAPE түрінде қолданылады. Символ ESC символы бірлік болу керек және бірлік символға бірден қолданылады.
Жоғарыдағы мысалда, басталудың пайыздық және аяқталудың пайыздық топтық символ ретінде өңделеді; сызба ғана өзіне көрсетілген.
Жоғарыда айтылғандай, ESC символы өздігінен қолданылуы мүмкін. Басқаша айтқанда, егер сіз ESC символымен бағанды іздесеңіз оны екі рет енгізіңіз. Біріншіден бұл ESC символы "келесі символды символ ретінде алады" дегенді білдіреді, және екіншіден ESC символы өздігінен екенін білдіреді.
Алдыңғы мысалды sname –де '_/' бағанының орнын анықтауда қайта қолдананайық:
SELECT * FROM Salespeople WHERE sname LIKE ' % /_ / / %'ESCAPE'/';
Мұндай деректермен тағы ешқандай қорытынды болмайды. Жол (/_) сызба символымен және ESC(//) символымен , сонымен қатар жол аяғындағы (%) символының кез-келген тізбегіменқолданылады және (%) символдарының кез-келген мағынасымен салыстырылады.
НӨЛДІК МӘНДЕРМЕН ( NULL ) ЖҰМЫС
Көбінесе, таблицада әрбір өріс үшін ешқандай мағынасы жоқ жазбалар болады, өйткені мысалы ақпарат аяқталмағандықтан немесе бұл өріс толтырылмағандықтан. SQL сізге өрісте мәннің орнына NULL(ПУСТОЙ) мәнін енгізуге мүмкіндік бере отырып мұндай жағдайды ескереді. өрістің мәні NULL-ге тең болғанда, бұл мәліметтер базасының программасы арнайы бұл өрісті осы жол үшін ешқандай мәні болмайды деп маркерлеген (немесе жазбаның). Бұл өріске жай берілуінен ажыратылады,мәліметтер базасы кез-келген басқа мәндер сияқты нөл немесе бос орын мәні де өңделеді. NULL техникалық мән болмайтындай онда да деректер типі болмайды. Ол өрістің кез келген типіне орналаса алады. Соған қарамастан, SQL-да NULL нуль ретінде жиі айтылады.
Мысалы, сіз әлі сатушыға белгіленбеген жаңа тапсырушыны алдыңыз. Тапсырушының белгіленуі қажет сатушыны тосқанша, сіз тапсырушыны қайта орналастыруда жоғалып қалмайтындай етіп, оны деректер базасына тура қазір тіркей аласыз.Сіз тапсырушыға арналған NULL мәні бар жолды snum өрісінде енгізуіңізге және бұл өрісті мәнмен кейінерек сатушы тағайындалған кезде толтыруыңызға болады.
========== NULL ОПЕРАТОРЫ =========
NULL мәннің жоқтығын білдіретіндіктен, NULL пайдаланылған кез келгеніне салыстырудың нәтижесін біле алмайсыз. NULL кез келген мәнмен, тіпті тура сондай басқа NULL-мен салыстырылғанда, нәтижесі не қате, не дұрыс болмайды, ол – белгісіз. Булев белгісізі тіпті предикатта белгісіз мәнді шығара отырып сұраныспен таңдалмайтын қате жол сияқты болады, естеріңізде болсын: NOT (қате) – дұрысқа тең, ал NOT (белгісіз) – белгісізге тең.
Осыдан шығатыны: 'city = NULL' немесе 'city IN (NULL)' типіндегі өрнек city мәнінен тәуелсіз белгісіз болады.
Сіздер қате мен белгісіз арасындағы айырмашылықты – предикаттың шарттарына сәйкес келмейтін бағандардың мәндерінен тұратын және бағандарында NULL бар жолдар білуіңіз керек.
COUNT-тың АРНАЙЫ АТРИБУТТАРЫ
COUNT функциясы басқалардан сәл өзгешелеу. Ол берілген кестенің бағанының мәндерінің санын немесе жолдар санын есептейді. Баған мәндерін санағанда ол берілген өрісте әр түрлі мәндердің шамасының санын шығару үшін DISTINCT-пен бірге қолданылады
Біз оны,мысалы, осы уақытта кестеде көрсетілген сатушылардың нөмірлерін санау үшін қолдана алар едік (6.3 суретте көрсетілген ):
SELECT COUNT ( DISTINCT snum ) FROM Orders;
DISTINCT-тың ҚОЛДАНЫЛУЫ
Назар аударыңыздар, жоғарыда келтірілген мысалда өрістің атымен аталатын және онымен бірге қолданылатын DISTINCT жай жақшада орналасқан. Бірақ әдеттегідей
SELECT-тен кейін емес.
Бұл қолданысты индивидуал бағандарға пайдаланылатын DISTINCT пен COUNT
ANSI стандартын талап етеді, бірақ бағдарламалардың көп мөлшері оларға бұндай талаптар қоя бермейді.
=============== SQL Execution Log ============
| SELECT COUNT (DISTINCT snum) |
| FROM Orders; |
| ==============================================|
| ------- |
| 5 |
===============================================
6.3 сурет: Өріс мәндерін санау
сіз өрістен көп мәнді( COUNT ) санын DISNINCT-тің көмегімен бір сұраныста таңдай аласыз. Біз көргендей 3-тарауда сіз DISTINCT-тің көмегімен жолды таңдағанда бұл сұранысыңыз жүзеге аспады. DISTINCT агрегаттың кез-келген функциясымен бірге қолданыла алады, бірақ көбінесе ол COUNT-пен бірге жиі қолданылалы. MAX және МІN – мен қолданылса ол ешқандай эффектсіз болады, ал SUM және АVG – пен сіз әдетте қайталанылатын мәндерді енгізгенде қолданасыз, барлық бағандардың жалпы және орташа мәндерінен заңды түрде эффектті.
Достарыңызбен бөлісу: |