SQL ішіндегі кірістірілген және байланыстырылған ішкі сұраулар, EXISTS предикаты. EXISTS операторын пайдалану Бар функциясын пайдаланып сұраулар

БАР ҚАЙДА

Ішкі сұрауда бір немесе бірнеше жолдың болуы тексеріледі. Кем дегенде бір жол сұрауға сәйкес келсе, логикалық мән TRUE қайтарылады. Қосымша ЕМЕС кілт сөзі көрсетілгенде, ішкі сұрау ешқандай сәйкес жолдарды қайтармаса, логикалық мәні TRUE қайтарылады.

ішкі сұрау

Толық қалыптасқан ішкі сұрау негізінде алынған деректер жинағы шығарылады.

Жалпы ережелер

EXISTS операторы негізгі сұраудың ішкі сұрауында бір немесе бірнеше жолдардың бар-жоғын тексереді.

ТАҢДАУ * ЖОҚ ЖҰМЫСТАРДАН (ТАҢДАУ * FROM қызметкер ҚАЙДА jobs.job_id=employye.job_id);

Бұл мысал қосымша ЕМЕС кілт сөзін пайдаланып жазбалар ішкі сұрауын тексереді. Келесі мысал негізгі нәтижелер жинағын шығарып алу үшін ішкі сұраудағы арнайы жазбаларды іздейді.

ТАҢДАУ au_lname авторлардан WHERE EXISST (ТАҢДАУ * FROM publishers WHERE authors.city=publishers.city);

Бұл сұрау баспагерлермен бір қалада тұратын авторлардың фамилияларын (au_lname) қайтарады. Ішкі сұрауда жұлдызшаны пайдалануға болатынын ескеріңіз, себебі ішкі сұрау TRUE логикалық мәні бар бір ғана жазбаны қайтаруы керек. Мұндай жағдайларда бағандар маңызды емес. Негізгі нүкте - жолдың болуы.

Көптеген сұрауларда EXISTS операторы ANY сияқты функцияны орындайды. EXISTS операторы әдетте корреляциялық сұраулармен пайдаланылғанда ең тиімді болып табылады.

EXISTS операторы мағыналық жағынан ANY операторына баламалы.

EXISTS мәлімдемесіндегі ішкі сұрау әдетте іздеудің екі түрінің бірін орындайды. Бірінші опция қойылмалы таңбаны - жұлдызшаны (мысалы, SELECT * FROM...) пайдалану болып табылады, бұл жағдайда сіз ешқандай нақты бағанды ​​немесе мәнді шығарып алмайсыз. Мұндағы жұлдызша «кез келген бағанды» білдіреді. Екінші опция ішкі сұрауда тек бір нақты бағанды ​​таңдау болып табылады (мысалы, SELECT aujd FROM). Кейбір жеке платформалар бірнеше бағандардағы ішкі сұрауларға рұқсат береді (мысалы, SELECT aujd, aujname FROM...). Дегенмен, бұл мүмкіндік сирек кездеседі және басқа платформаларға тасымалдануы қажет кодта аулақ болу керек.

Платформалар арасындағы айырмашылықтар

Барлық платформалар біз жоғарыда сипатталған пішінде EXISTS операторын қолдайды.

«Бұрын оңайырақ болды» — мен SQL тіліндегі келесі сұрауды оңтайландыру үшін отырғанда ойладым басқару студиясы. Мен MySQL астында жазған кезде бәрі оңайырақ болды - ол жұмыс істейді немесе жұмыс істемейді. Не баяулайды, не баяулайды. Түсіндіру менің барлық мәселелерімді шешті, басқа ештеңе қажет емес. Қазір менде сұраулар мен процедураларды/функцияларды әзірлеуге, жөндеуге және оңтайландыруға арналған қуатты орта бар және менің ойымша, бұл бейберекетсіздік тек көбірек проблемаларды тудырады. Ал неге бәрі? Кірістірілген сұрау оңтайландырғышы жаман болғандықтан. Егер MySQL және PostgreSQL-де жазамын

a, b, c ішінен * таңдаңыз, мұнда a.id = b.id, b.id = c.id

және планшеттердің әрқайсысында кемінде 5 мың жол болады - бәрі қатып қалады. Және Құдайға шүкір! Өйткені, әйтпесе әзірлеуші, ең жақсысы, дұрыс жазуға жалқаулықты дамытады, ал ең нашар, ол не істеп жатқанын мүлдем түсінбейді! Өйткені, MSSQL-дегі бірдей сұрау бірдей жұмыс істейді

a.id = b.id біріктіру c b.id = c.id бойынша біріктіруден * таңдаңыз

Кірістірілген оңтайландырушы артық сұрауды тазартады және бәрі жақсы болады.

Ол сондай-ақ не істеу керек екенін өзі шешеді - бар немесе қосылу және т.б. Және бәрі мүмкіндігінше оңтайлы жұмыс істейді.

Бір ғана БІРАҚ бар. Бір кезде оңтайландырушы сүрініп қалады күрделі сұраужәне өтеді, содан кейін сіз үлкен мәселеге тап боласыз. Сіз оны бірден ала алмайсыз, бірақ кестелердің салмағы критикалық массаға жеткенде.

Сонымен, мақаланың мәніне келдік. бар және өте ауыр операцияларда. Бұл шын мәнінде бөлек ішкі сұрау әрқайсысы үшіннәтиже сызықтары. Ал егер ұя салу болса, онда ол әдетте жарықты өшіреді. 1, 10, 50 жолдар қайтарылғанда бәрі жақсы болады. Сіз айырмашылықты сезбейсіз, мүмкін қосылу одан да баяу болуы мүмкін. Бірақ 500 шығарылған кезде проблемалар басталады. Бір сұраудағы 500 ішкі сұрау маңызды.

Адамның түсінуі тұрғысынан, бар және бар жақсырақ болса да, бірақ 50+ жолды қайтаратын сұраулар үшін уақыт шығындары тұрғысынан олар қабылданбайды.

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

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

a.id ішінен * таңдаңыз (id ішінен идентификаторды таңдаңыз) бар жерден * таңдаңыз (b.id = a.id ішінен жоғарғы 1 1 таңдаңыз) a.id = b бойынша b қосылымынан * таңдаңыз. id a.id жоқ жерден * таңдаңыз (b ішінен id таңдаңыз) жоқ жерден * таңдаңыз (b ішінен жоғарғы 1 1 1, b.id = a.id) сол жақ қосылымнан * таңдаңыз b a. id = b.id, мұнда b.id нөл

Қайталап айтамын - MSSQL оңтайландырғышы осы мысалдарды оңтайландырады максималды өнімділікжәне мұндай қарапайым өтініштері бар ақымақ адамдар ешқашан болмайды.

Енді қайта жазуға тура келетін нақты сұраудың мысалын қарастырайық, себебі ол жай ғана кейбір үлгілерде қатып қалды (құрылым өте жеңілдетілген және түсініктер ауыстырылған, деректер қорының кейбір оңтайлы емес құрылымынан қорқудың қажеті жоқ). ).

Өнімнің, оның тобының және егер бар болса, негізгі топтың параметрлеріне назар аудара отырып, әртүрлі тіркелгілердегі барлық қайталанатын «өнімдерді» шығарып алуыңыз керек.

PRODUCTs ішінен d.PRODUCT_ID таңдаңыз, PRODUCT_GROUP sg солға қосылыңыз M_PG_DEPENDENCY sd (sg.PRODUCT_GROUP_ID = sd.M_PG_DEPENDENCY_CHILD_ID), PRODUCT d, PRODUCT_GROUP Dg сол жақ M_PG_DEPgd.dg .M_PG_DEPENDENCY_CHILD_ID) мұнда s.PRODUCT_GROUP_ID=сек. PRODUCT_GROUP_ID және d.PRODUCT_GROUP_ID=dg.PRODUCT_GROUP_ID және sg.PRODUCT_GROUP_PERSPEC=dg.PRODUCT_GROUP_PERSPEC және sg.PRODUCT_GROUP_NAME=dg.PRODUCT_NAME_NAME және A.PRODUCT_NAME.p. PRODUCT_TYPE=d.PRODUCT_TYPE және s.PRODUCT_IS_SECURE=d.PRODUCT_IS_SECURE және s.PRODUCT_MULTISELECT=d.PRODUCT_MULTISELECT және dg.PRODUCT_GROUP_IS_TMPL=0 және ((sd.M_PG_DEPENDENCY_CHILD_ID нөл және dd.M_PG_DEPENDENCY_CHILD_ID нөлге тең) PRODUCT_1g бастап PRODUCT_1g бар 1 мұнда sd.M_PG_DEPENDENCY_PARENT_ID = sg1.PRODUCT_GROUP_ID және dd .M_PG_DEPENDENCY_PARENT_ID = dg1.PRODUCT_GROUP_ID және sg1.PRODUCT_GROUP_PERSPEC=dg1.PRODUCT_GROUP_PERSPEC және sg1.PRODUCT_GROUP_NAME=dg1.PRODUCT_NAME және))

Оңтайландырушы бас тартқан кезде осылай болады. Әр жол үшін дерекқорды өлтіретін ауыр бар орындалды.

s.PRODUCT_TYPE=d.PRODUCT_TYPE және s.PRODUCT_NAME=d.PRODUCT_NAME және s.PRODUCT_IS_SECURE=d.PRODUCT_IS_SECURE және s.PRODUCT_SECURE және s.PRODUCT_ULG.PRODUCT_ULG.PRODUCT_TYPE=d.PRODUCT_TYPE құрылғыларында PRODUCT d өнімінен d.PRODUCT_ID таңдаңыз g s.PRODUCT_GROUP_ID = sg.PRODUCT_GROUP_ID d.PRODUCT_GROUP_ID=dg.PRODUCT_GROUP_ID жүйесінде PRODUCT_GROUP тобына қосылыңыз және sg.PRODUCT_GROUP_NAME=dg.PRODUCT_GROUP_NAME және sg.PRODUCT_GROUP_PERDUCT_DPERDUCT_PRODUCT_GROUP_SP қалды. sg.PRODUCT_GROUP_ID бойынша ENDENCY sd = sd.M_PG_DEPENDENCY_CHILD_ID DG бойынша M_PG_DEPENDENCY dd қосылды .PRODUCT_GROUP_ID = dd.M_PG_DEPENDENCY_CHILD_ID қалдырды PRODUCT_GROUP sgp sgp.PRODUCT_GROUP_ID = sd.M_PG_DEPENDENCY_PARENT_ID қалдырды PRODUCT_GROUP dgp dgp.dg.END_Dg. PARENT_ID және sgp.PROD UCT_GROUP_NAME = dgp.PRODUCT_GROUP_NAME және null (sgp.PRODUCT_GROUP_IS_TMPL, 0) = бос (dgp. PRODUCT_GROUP_IS_TMPL, 0) мұнда (sd.M_PG_DEPENDENCY_CHILD_ID бос және dd.M_PG_DEPENDENCY_CHILD_ID бос) немесе (sgp.PRODUCT_GROUP_NAME бос емес және dgp.PRODUCT нөл емес)

Осы түрлендірулерден кейін көріністің өнімділігі табылған өнімдер санымен экспоненциалды түрде өсті. Дәлірек айтқанда, іздеу уақыты іс жүзінде сәйкестіктер санына тәуелсіз болды және әрқашан өте аз болды. Болуы керек сияқты.

Бұл MSSQL оптимизаторына сену қатал әзіл ойнай алатынының айқын мысалы. Оған сенбеңіз, жалқау болмаңыз, қолмен қосылыңыз, әр уақытта белгілі бір жағдайда не жақсы екенін ойлаңыз - бар, бар немесе қосылыңыз.

SQL тілінің EXISTS предикаты логикалық тапсырманы орындайды. IN SQL сұрауларыбұл предикат форманың өрнектерінде қолданылады

БАР (ТАҢДАУ * КЕСТЕ_NAME ...).

Бұл өрнек сұрау шартқа сәйкес келетін бір немесе бірнеше жолды тапқанда ақиқат мәнін қайтарады және жолдар табылмаған кезде жалған мәнін қайтарады.

EXISTS үшін бұл керісінше. Өрнек

ЖОҚ (ТАҢДАУ * TABLE_NAME ...)

сұрауда жолдар табылмаған кезде ақиқат мәнін және кем дегенде бір жол табылғанда жалған мәнін қайтарады.

SQL EXISTS предикаты бар қарапайым сұраулар

Мысалдарда біз кітапхананың дерекқорымен және оның «Қолданылатын кітап» (BOOKINUSE) және «Пайдаланушы» (USER) кестелерімен жұмыс істейміз. Әзірге бізге тек «Қолданылатын кітап» (BOOKINUSE) кестесі қажет.

АвторТақырыпPubyearInv_NoҚолданушының ID
ТолстойСоғыс және бейбітшілік2005 28 65
Чеховшие бағы2000 17 31
ЧеховТаңдаулы әңгімелер2011 19 120
Чеховшие бағы1991 5 65
Ильф пен ПетровОн екі орындық1985 3 31
МаяковскийӨлеңдер1983 2 120
ПарснапДоктор Живаго2006 69 120
ТолстойЖексенбі2006 77 47
ТолстойАнна Каренина1989 7 205
ПушкинКапитанның қызы2004 25 47
ГогольОйнатады2007 81 47
ЧеховТаңдаулы әңгімелер1987 4 205
ПарснапТаңдаулылар2000 137 18

1-мысал.Толстойдың кітаптары берілген және Чеховтың кітаптары берілген пайдаланушылардың жеке куәліктерін анықтаңыз. Сыртқы сұрау Толстойдың кітаптары берілген пайдаланушылар туралы деректерді таңдайды, ал EXISTS предикаты ішкі сұрауда тексерілетін қосымша шартты анықтайды - Чеховтың кітаптары берілген пайдаланушылар. Ішкі сұраудағы қосымша шарт сыртқы және ішкі сұраулардағы пайдаланушы идентификаторларының сәйкес келуі болып табылады: User_ID=tols_user.user_id. Өтініш келесідей болады:

Бұл сұрау келесі нәтижені береді:

EXISTS және IN предикаттарының арасындағы айырмашылықтар

EXISTS предикаты бар сұрауларға бір қарағанда, сіз ол бірдей сияқты әсер қалдыруыңыз мүмкін предикат IN. Бұл олай емес. Олар өте ұқсас болғанымен. IN предикаты өз аргументінде көрсетілген диапазондағы мәндерді іздейді және егер мұндай мәндер болса, онда осы ауқымға сәйкес барлық жолдар таңдалады. EXISTS предикатының нәтижесі дәлелде көрсетілген мәндерге сәйкес келетін мәндер бар ма деген сұраққа «иә» немесе «жоқ» жауабы болып табылады. Сонымен қатар, IN предикатының алдында диапазондағы мәндерге сәйкес келетін жолдарды іздеуге болатын баған атауы болады. EXISTS предикаты мен IN предикаты арасындағы айырмашылықты көрсететін мысалды және IN предикаты арқылы шешілген мәселені қарастырайық.

4-мысал. 31 идентификаторы бар пайдаланушыға кітаптары берілген авторлар кітаптарын берген пайдаланушылардың идентификаторларын анықтаңыз. Сұрау келесідей болады:

Қолданушының ID
120
65
205

Ішкі сұрау (IN-ден кейін) авторларды таңдайды: Чехов; Ильф пен Петров. Сыртқы сұрау осы авторлардың кітаптарын шығарған барлық пайдаланушыларды таңдайды. Біз EXISTS предикатына қарағанда IN предикатының алдында баған аты тұрғанын көреміз, бұл жағдайда – Автор.

EXISTS предикаты және қосымша шарттары бар сұраулар

Сұраудағы EXISTS предикатына қосымша, кем дегенде бір қосымша шартты қолдансаңыз, мысалы, көмегімен көрсетілген агрегаттық функциялар, онда мұндай сұраулар қарапайым деректерді талдау үшін қызмет ете алады. Мұны келесі мысалмен көрсетейік.

5-мысал.Пастернактың кем дегенде бір кітабын шығарған және 2-ден көп кітап шығарған пайдаланушылардың жеке куәліктерін анықтаңыз. Біз келесі сұрауды жазамыз, онда бірінші шарт кірістірілген сұраумен EXISTS предикаты арқылы көрсетіледі, ал HAVING операторымен екінші шарт әрқашан кірістірілген сұраудан кейін болуы керек:

Өтініш нәтижесі:

Қолданушының ID
120

BOOKINUSE кестесінен көрініп тұрғандай, Пастернактың кітабы да 18 идентификаторы бар пайдаланушыға берілген, бірақ оған бір ғана кітап берілген және үлгіге кірмеген. Ұқсас сұрауға COUNT функциясын қайта қолдансаңыз, бірақ бұл жолы таңдалған жолдарды санау үшін (мұны өзіңіз орындаңыз), сіз Пастернактың кітаптарын оқыған қанша пайдаланушы басқа авторлардың кітаптарын оқығаны туралы ақпаратты ала аласыз. Бұл деректерді талдау саласына қатысты.

EXISTS предикаты бар сұраулар екі кестеде

EXISTS предикаты бар сұраулар бірнеше кестеден деректерді шығарып ала алады. Қолдану арқылы көптеген мәселелерді бірдей нәтижемен шешуге болады JOIN операторы, бірақ кейбір жағдайларда EXISTS пайдалану азырақ күрделі сұрау жасауға мүмкіндік береді. Нәтижелік кестеде тек бір кестенің бағандары болатын жағдайларда EXISTS қолданған дұрыс.

Келесі мысалда, сол дерекқордан, BOOKINUSE кестесінен басқа, сізге USER кестесі де қажет болады.

Сұрау нәтижесі келесі кесте болады:

Автор
Чехов
Маяковский
Парснап

JOIN операторын пайдалану сияқты, бірнеше кесте болған жағдайда, кестелерді қосатын пернелердің мәндерінің сәйкестігін тексеру үшін кесте бүркеншік атын пайдалану керек. Біздің мысалда кестенің бүркеншік аттары bk және us, ал кестелерді байланыстыратын кілт - User_ID.

EXISTS предикаты екіден көп кестелерді біріктіруде

Енді нәтиже кестеде тек бір кестенің бағандары болатын жағдайларда EXISTS пайдалану неге қолайлы екенін егжей-тегжейлі қарастырамыз.

Біз «Жылжымайтын мүлік» базасымен жұмыс істейміз. Мәміле кестесі мәмілелер туралы деректерді қамтиды. Біздің тапсырмаларымыз үшін осы кестеде мәміле түрі - сату немесе жалға алу туралы деректері бар Түр бағанасы маңызды болады. Объектілер кестесі объектілер туралы мәліметтерді қамтиды. Бұл кестеде логикалық пішімдегі лоджия немесе балконның болуы туралы деректерді қамтитын Бөлмелер (бөлмелер саны) және LogBalc бағандарының мәндері қажет: 1 (иә) немесе 0 (жоқ). Клиент, Менеджер және Ие кестелері сәйкесінше клиенттер, компания менеджерлері және меншік иелері туралы деректерді қамтиды. Бұл кестелерде FName және LName сәйкесінше аты және тегі болып табылады.

7-мысал.Лоджиясы немесе балконы жоқ жылжымайтын мүлікті сатып алған немесе жалға алған клиенттерді анықтаңыз. Біз келесі сұрауды жазамыз, онда EXISTS предикаты екі кестені біріктіру нәтижесіне қол жеткізуді көрсетеді:

Бағандар Клиент кестесінен жұлдызша операторы арқылы таңдалғандықтан, осы кестенің барлық бағандары көрсетіледі, оларда EXISTS предикаты көрсеткен шартқа сәйкес келетін клиенттердің санына сәйкес жолдар саны да болады. Біріктіруі ішкі сұрау арқылы қол жеткізілетін кестелерден ешқандай бағандарды шығарудың қажеті жоқ. Сондықтан, машина уақытын үнемдеу үшін тек бір баған алынады. Ол үшін SELECT сөзінен кейін бірлік жазылады. Дәл осындай әдіс келесі мысалдардағы сұрауларда қолданылады.

EXISTS предикатымен SQL сұрауын өзіңіз жазыңыз, содан кейін шешімді қараңыз

Біз EXISTS предикатымен бірге SQL сұрауларын жазуды жалғастырамыз

9-мысал.Жалға берілген объектілердің иелерін анықтаңыз. Біз келесі сұрауды жазамыз, онда EXISTS предикаты екі кестені біріктіру нәтижесіне қол жеткізуді де көрсетеді:

Алдыңғы мысалдағыдай, сыртқы сұрау арқылы қол жеткізілетін кестедегі барлық өрістер қайтарылады.

10-мысал.Менеджер Савельев басқарған меншік иелерінің санын анықтаңыз. Біз сыртқы сұрау үш кестенің қосылуына қатынасатын сұрауды жазамыз, ал EXISTS предикаты тек бір кестеге қатынасты көрсетеді:

Барлық сұраулар бар дерекқормен салыстырылады. Сәтті пайдалану!

Реляциялық мәліметтер базасы және SQL тілі

Новосибирск мемлекеттік экономика және басқару академиясы

ПӘН БОЙЫНША ЛАБОРАТОРИЯЛЫҚ ПРАКТИКУМ

«ДЕРЕКҚОР»

Зертханалық жұмыс No7

«SQL деректер қорының тілі: деректерді өңдеу командалары»

НОВОСИБИРСК 2000 ж

SQL – құрылымдық сұраныс тілінің аббревиатурасы. Тілдің атауынан оның негізгі мақсаты мәліметтер қорынан ақпарат алу үшін сұраныстарды қалыптастыру екені анық. Мәліметтерді шығарып алу командалары SQL тілінің ажырамас бөлігі – DML деректермен жұмыс істеу тілінің негізін құрайды. Дегенмен, DML дерекқордан деректерді алуға арналған командалардан ғана тұрады. Сондай-ақ деректерді өзгертуге, деректерді басқаруға және т.б. командалар бар.

Зертханалық жұмыста DML тілінің негізгі құралдары қарастырылады. Орындалуда зертханалық жұмысбіз SQL2 стандартын ұстанамыз.

SQL үлкен тіл болғандықтан, біз тек негізгі командаларды қарастырамыз. Әр түрлі арнайы SQL құралдары келесі зертханаларда қарастырылады.

Зертханалық жұмыстарды орындау үшін деректердің реляциялық моделінің негіздерін, реляциялық алгебра және реляциялық есептеу негіздерін және MS SQL Server ДҚБЖ-мен жұмыс істеу принциптерін білу қажет.

Зертханалық жұмысты орындау нәтижесінде SQL тілінің командалары арқылы мәліметтерді өңдеу әдістерін меңгересіз, MS SQL Server ДҚБЖ іске асырылған тілдің диалектісін қарастырасыз.

КІРІСПЕ

SQL сұрауларды жасауға және дерекқорды жаңартуға арналған деректерді өңдеу мүмкіндіктерінің кең ауқымын қамтиды. Бұл мүмкіндіктер реляциялық модель талаптарына сәйкес келетін оның физикалық құрылымына емес, деректер қорының логикалық құрылымына ғана сүйенеді.

SQL синтаксисінің бастапқы құрылымы Codd реляциялық есебіне негізделген (немесе кем дегенде солай болып көрінді). Реляциялық алгебрада қолдау көрсетілетін жалғыз операция одақ болды.

Алдыңғы стандартта жасалған реляциялық есептеуге ұқсас синтаксиске қосымша, SQL2 тікелей операцияларды біріктіру, қиылысу, айырмашылық және біріктіруді жүзеге асырады. Таңдау, жоба және өнім операцияларына тікелей дерлік қолдау көрсетілді (және жалғасуда), ал бөлу және тағайындау операциялары күрделірек пішінде қолдау көрсетіледі.

Біз алдымен SQL сұрау тілін, содан кейін оның деректерді енгізу және өзгерту операцияларын сипаттаймыз. Деректерді өзгерту операциялары соңғы рет сипатталады, өйткені олардың құрылымы белгілі бір дәрежеде сұрау тілінің құрылымына тәуелді.

Қарапайым сұраулар

Біз үшін қарапайым сұранысдерекқорда тек бір кестеге қол жеткізетін сұрау болады. Қарапайым сұраулар бізге SQL негізгі құрылымын көрсетуге көмектеседі.

Қарапайым өтініш.Тек бір дерекқор кестесіне қатынасатын сұрау.

Сұраныс:Кім сылақшы болып жұмыс істейді?

WHERE SKILL_TYPE = "Сылақшы"

Нәтиже:

Г. Риковер

Бұл сұрау ең көп таралған үшеуін көрсетеді сөз тіркестері SQL: SELECT, FROM және WHERE. Біздің мысалда біз оларды әртүрлі жолдарға орналастырғанымызбен, олардың барлығы бір жолда көрінуі мүмкін. Оларды басқаша шегінуге де болады, ал сөз тіркестерінің ішіндегі сөздерді бос орындардың ерікті санымен бөлуге болады. Әр сөз тіркесінің ерекшеліктерін қарастырайық.

таңдаңыз. ТАҢДАУ сөйлемі нәтижелік кестеде пайда болуы тиіс бағандардың тізімін береді. Бұл әрқашан кейбір реляциялық кестенің бағандары. Біздің мысалда алынған кесте бір бағаннан (NAME) тұрады, бірақ жалпы ол бірнеше бағандарды қамтуы мүмкін; ол есептелген мәндерді немесе тұрақтыларды қамтуы мүмкін. Біз осы нұсқалардың әрқайсысына мысалдар келтіреміз. Егер алынған кестеде бірнеше баған болуы керек болса, барлық қажетті бағандар кейін тізімделеді ТАҢДАУ пәрмендеріүтірмен бөлінген. Мысалы, SELECT WORKER_ID, NAME тіркесі WORKER_ID және NAME бағандарынан тұратын кестені береді.

SELECT сөйлемі.Алынған кестенің бағандарын анықтайды.

бастап. FROM сөйлемі сұрау арқылы қатынасатын бір немесе бірнеше кестелерді көрсетеді. ТАҢДАУ және ҚАЙДА сөйлемдерінде тізімделген барлық бағандар FROM пәрменінде тізімделген кестелердің бірінде болуы керек. SQL2-де бұл кестелер схемада негізгі кестелер немесе деректер көріністері ретінде тікелей анықталуы мүмкін немесе олардың өздері SQL сұрауларының нәтижесінде пайда болатын атаусыз кестелер болуы мүмкін. Соңғы жағдайда сұрау FROM пәрменінде нақты беріледі.

FROM сөйлемі.Сұрау арқылы қатынасатын бар кестелерді көрсетеді.

Қайда. WHERE сөйлемінде шарт бар. соның негізінде кесте(лер) жолдары таңдалады. Біздің мысалда шарт: SKILL_TYPE бағанында әрқашан SQL мәтіндік константаларымен орындалатындай, апострофтармен қоршалған "Сылақшы" тұрақтысы болуы керек. WHERE сөйлемі ең өзгермелі SQL пәрмені болып табылады; ол әртүрлі шарттарды қамтуы мүмкін. Біздің талқылауымыздың көп бөлігі WHERE пәрменінде рұқсат етілген әртүрлі конструкцияларды суреттеуге арналады.

WHERE сөйлемі.Көрсетілген кестелерден қандай жолдар таңдалатынына негізделген шартты көрсетеді.

Жоғарыдағы SQL сұрауы жүйемен келесі ретпен өңделеді: FROM, WHERE, SELECT. Яғни, FROM командасында көрсетілген кесте жолдары өңдеу үшін жұмыс аймағында орналастырылады. Әр жолға ретімен WHERE сөйлемі қолданылады. WHERE шартын қанағаттандырмайтын барлық жолдар қараудан шығарылады. Содан кейін WHERE шартын қанағаттандыратын жолдар SELECT операторы арқылы өңделеді. Біздің мысалда әрбір осындай жолдан NAME таңдалады және барлық таңдалған мәндер сұрау нәтижелері ретінде шығарылады.

Сұраныс:Кеңсе ғимараттары туралы барлық ақпаратты беріңіз.

WHERE TYPE = "Кеңсе"

Нәтиже:

BLDG ID ADRESSTYPEQLTY ДЕҢГЕЙІ

Қарағаш к-сі, 312, 123 2-кабинет

Березовая көш., 210. 1011 Office Z 1

Осиновая көш., 111. 1213 Office 4 1

ТАҢДАУ пәрменіндегі жұлдызша (*) «барлық жолды» білдіреді. Бұл біз жиі қолданатын ыңғайлы стенография.

Сұраныс:Әр электриктің апталық жалақысы қанша?

ТАҢДАУ АТЫ, «Апталық жалақы = ", 40 * HRLY_RATE

WHERE SKILL_TYPE = "электрик"

Нәтиже:

М.Фарадей Апталық жалақы = 500,00

Х.Колумб Апталық жалақы = 620,00

Бұл сұрау таңба тұрақтыларының екеуін де (біздің мысалда «Апталық жалақы =») және ТАҢДАУ пәрменіндегі есептеулерді пайдалануды суреттейді, SELECT операторында сандық бағандар мен сандық тұрақтыларды, сондай-ақ стандартты арифметикалық операторларды ( +, -, *, /), жақшаның көмегімен қажетінше топталады. Біз сондай-ақ жаңасын қостық ТАПСЫРЫС командасы BY, ол сұрау нәтижесін көрсетілген баған бойынша өсетін әріптік-сандық ретпен сұрыптайды. Нәтижелерді кему ретімен сұрыптағыңыз келсе, пәрменге DESC қосу керек. ORDER BY сөйлемі нәтижелерді бірнеше бағандар бойынша сұрыптай алады, кейбіреулері өсу ретімен, ал басқалары кему ретімен. Сұрыптаудың негізгі кілт бағаны бірінші болып тізімделеді.

Символ тұрақтысы.Әріптерден, сандардан және «арнайы» таңбалардан тұратын тұрақты.

Сұраныс:Кімнің сағатына 10 доллардан 12 долларға дейінгі ставкасы бар?

ҚАЙДА HRLY_RATE > = 10 ЖӘНЕ HRLY_RATE< - 12

Нәтиже:

ЖҰМЫСШЫ идентификаторы NAME HRLY_RATE SKILL_TYPE SUPV_ID

Бұл сұрау WHERE операторының кейбір қосымша мүмкіндіктерін көрсетеді: салыстыру операторлары және логикалық ЖӘНЕ операторы. Алты салыстыру операторы (=,<>(тең емес),<, >, <=, >=). Логикалық операторлар ЖӘНЕ, НЕМЕСЕ және ЕМЕС құрама шарттарды жасау немесе шартты жоққа шығару үшін пайдаланылуы мүмкін. Жақшаларды бағдарламалау тілдерінде кең таралған жағдайларды топтастыру үшін пайдалануға болады.

Салыстыру операторлары =,<>, <, >, <=, >=.

Логикалық операцияларЖӘНЕ (ЖӘНЕ), НЕМЕСЕ (НЕМЕСЕ) және ЕМЕС (ОЛ) .

Осы сұрауды құрастыру үшін BETWEEN (арасында) операторын да пайдалануға болады:

ҚАЙДА HRLY_RATE 10 мен 12 АРАСЫНДА

BETWEEN шаманы екі басқа шамамен салыстыру үшін қолдануға болады, егер салыстырылған шама осы шамалардың әрқайсысына немесе олардың арасындағы кез келген мәнге тең болуы мүмкін болса, біріншісі екіншісінен аз.

Сұраныс: Сылақшыларды, шатырларды және электриктерді тізімдеңіз.

БІЛГІЛІК_ТҮРІ ҚАЙДА («Сылақшы», «Шатыршы», «Электрші»)

Нәтиже:

WORKER_ID NAME HRLY_RATE SKILL_TYPE SUPV_ID

1412 К.Немо 13.75 Сылақшы 1520

2920 Р.Гаррет 10.00 Руфер 2920

1520 Г.Рикковер 11.75 Сылақшы 1520

Бұл сұрау IN (B) салыстыру операторын пайдалануды түсіндіреді. WHERE шарты егер жолдың мамандық түрі жақшада көрсетілген жиынтықта орналасса, яғни мамандық түрі сылақшы, шатыршы немесе электрик болса, ақиқат болып саналады. Ішкі сұрауларда IN операторын қайтадан көреміз.

Мамандығымыздың жазылуын дәл есте сақтай алмаймыз делік: «электрик» немесе «инженер-электрон» немесе басқа нәрсе. Анықталмаған таңбалар жолдарын ауыстыратын қойылмалы таңбалар сұраудағы қате емлені табуды жеңілдетеді.

Үлгі таңбалары.Анықталмаған таңбалар жолдарын ауыстыратын таңбалар.

Сұраныс:Мамандық түрі «Елек» деп басталатын қызметкерлерді көрсетіңіз.

ҚАЙДА SCILL_TYPE LIKE («Таңдау%»)

Нәтиже:

ЖҰМЫСШЫ ИДЕНТІ АТЫ HRLY_RATE SKILL_TYPE SUPV_ID

1235 М.Фарадей 12.50 Электрик 1311

1311 H. Колумб 15.50 Электр 1311

SQL тілінде екі қойылмалы таңба бар: % (пайыз) және _ (астын сызу). Асты сызу дәл бір анықталмаған таңбаны ауыстырады. Пайыз нөлден басталатын таңбалардың ерікті санын ауыстырады. Қойылмалы таңбалар пайдаланылған кезде LIKE операторы таңба айнымалы мәндерін тұрақтылармен салыстыру үшін қажет. Басқа мысалдар:

АТЫ "__Колумб" сияқты

АТЫ "__K%" ҰНАУ

Бірінші мысалдағы шарт дұрыс болады, егер NAME екі таңбадан кейін «Колумбтан» тұрса. WORKER кестесінде барлық атаулар бірінші әріптен және нүктеден басталады. Осылайша, біз осы шартты пайдалана отырып. «Колумб» тегі бар барлық қызметкерлерді табайық. Екінші мысалдың шарты тегі «К» әрпінен басталатын барлық қызметкерлерді табуға мүмкіндік береді.

Сұраныс:Келесі екі апта ішінде басталатын барлық жұмыстарды табыңыз.

ҚАЙДА START_DATE CURRENT_DATE ЖӘНЕ АРАСЫНДА

Нәтиже:(Ағымдағы күн АҒЫМДАҒЫ КҮН = 10.10 деп есептейік)

WORKER_ID BLDG_ID START_DATE NUM_DAYS

1235 312 10.10 5

1235 515 17.10 22

3231 111 10.10 8

1412 435 15.10 15

3231 312 24.10 20

1311 460 23.10 24

Бұл сұрау BETWEEN операторын күн мен аралық мәндерімен пайдалануды көрсетеді. CURRENT_DATE – әрқашан бүгінгі күнді қайтаратын функция. Өрнек

CURRENT_DATE + INTERVAL "14" КҮН

ағымдағы күнге екі апталық кезеңді қосады. Осылайша, START_DATE бағанының мәні 10/10 және 10/24 аралығында болса, ТАПСЫРМА таңдалады (бүгін 10/10 деп есептегенде). Бұдан біз күн өрістеріне интервал мәндерін қоса алатынымызды көреміз. Сонымен қатар, біз интервалдардың мәндерін бүтін мәндерге көбейте аламыз. Мысалы, белгілі бір апталар санынан кейін қандай сан болатынын білгіміз келеді делік (NUM_WEEKS айнымалысымен белгіленеді). Біз мұны келесідей жасай аламыз:

CURRENT_DATE + INTERVAL "7" DAY * NUM_WEEKS

2. Көп кестелік сұраныстар

Деректер элементтерін бір кестенің шекаралары арқылы байланыстыру мүмкіндігі кез келген дерекқор тілі үшін маңызды. Реляциялық алгебрада бұл функция біріктіру операциясы арқылы орындалады. SQL-тің көп бөлігі тікелей реляциялық есептеулерге негізделгенімен, SQL әртүрлі кестелердегі деректерді реляциялық алгебраның біріктіру операциясына ұқсас түрде қосады. Енді мұның қалай жасалатынын көрсетеміз. Өтінішті қарастырыңыз:

Сұраныс:

Жауапқа қажетті деректер екі кестеде берілген: ЖҰМЫСШЫ және ТАПСЫРМА. SQL шешімі FROM пәрменіндегі екі кестені де тізімдеуді және WHERE сөйлемінің арнайы түрін көрсетуді талап етеді:

SKILL_TYPE ТАҢДАУ

ЖҰМЫСШЫДАН, ТАПСЫРМА

WHERKER.WORKER_ID = ASSIGNMENT.WORKER_ID

ЖӘНЕ BLDG_ID = 435

Бұл жерде не болып жатыр? Жүйенің бұл сұрауды өңдеуінің екі кезеңін қарастыруымыз керек.

1. Әдеттегідей, алдымен FROM сөйлемі өңделеді. Дегенмен, бұл жағдайда команда екі кестені көрсететіндіктен, жүйе осы кестелердің жолдарының декарттық көбейтіндісін жасайды. Бұл екі кестенің бағандарынан тұратын бір үлкен кестенің (логикалық түрде) жасалғанын білдіреді, бір кестенің әрбір жолы екінші кестенің әрбір жолымен жұптастырылған. Біздің мысалда WORKER кестесінде бес баған және ТАПСЫРМА кестесі төрт баған болғандықтан, FROM командасы арқылы жасалған декарттық өнімде тоғыз баған болады. Декарттық көбейтіндінің қатарларының жалпы саны m * n-ге тең, мұндағы m - ЖҰМЫСШЫ кестесінің жолдарының саны; және n – ТАПСЫРМА кестесіндегі жолдар саны. WORKER кестесінде 7 жол және ТАПСЫРМА кестесінде 19 жол болғандықтан, декарттық өнімде 7x19 немесе 133 жол болады. Егер FROM командасы екіден көп кестелерді тізімдесе, командада көрсетілген барлық кестелердің декарттық көбейтіндісі жасалады.

Декарттық өнім. Бір кестенің әрбір жолын қосу нәтижесі әрқайсысыбасқа кестенің қатары.

2. Гигант реляциялық кестені құрғаннан кейін жүйе бұрынғыдай WHERE командасын пайдаланады. Кестенің әрбір жолы FROM командасы арқылы жасалады. WHERE шартының орындалғанын тексеру үшін тексеріледі. Шартты қанағаттандырмайтын жолдар қараудан шығарылады. Содан кейін SELECT сөйлемі қалған жолдарға қолданылады.

Сұрауымыздағы WHERE сөйлемінде екі шарт бар:

1. ЖҰМЫСШЫ. WORKER_ID = ТАПСЫРМА.ЖҰМЫСШЫ_ID

2. BLDG_ID = 435

Бұл шарттардың біріншісі – қосылу шарты. ЖҰМЫСШЫ және ТАПСЫРМА кестелерінің екеуінде де ЖҰМЫСШЫ_ID деп аталатын баған болғандықтан, олардың декарттық өнімінде осы атаумен екі баған болатынын ескеріңіз. Оларды ажырату үшін баған атауының алдына нүктемен бөлінген бастапқы кестенің атауын қоямыз.

Бірінші шарт таңдалған кез келген жолда WORKER кестесіндегі WORKER_ID бағанының мәні ТАПСЫРМА кестесіндегі WORKER_ID бағанының мәніне сәйкес келуі керек дегенді білдіреді. Іс жүзінде біз екі кестені WORKER_ID арқылы біріктіреміз. Осы екі бағанның мәндері тең емес барлық жолдар өнім кестесінен шығарылады. Реляциялық алгебраның табиғи қосылу операциясын орындаған кезде де дәл осындай жағдай орын алады. (Алайда, табиғи біріктіруден әлі де біршама айырмашылық бар: SQL қосымша WORKER_ID бағанын автоматты түрде жоймайды). BLDG_ID = 435 қосымша шартымен осы екі кестенің толық қосылуы суретте көрсетілген. 1. ТАҢДАУ пәрменін пайдалану ақырында келесі сұрау нәтижесін береді:

БІЛІКТІЛІК ТҮРІ

Сылақшы

Шатыршы

Электрик

Күріш. 1. ЖҰМЫСШЫ және ТАПСЫРМА кестелеріне қосылу

Енді біз SQL-де кестені өзіне қосу жолын көрсетеміз.

Сұраныс:Менеджерлерінің аты-жөнін көрсете отырып, қызметкерлерді тізімдеңіз.

A.WORKER_NAME, B.WORKER_NAME ТАҢДАУ

ЖҰМЫСШЫ А, ЖҰМЫСШЫ Б

ҚАЙДА B.WORKER_ID = A.SUPV_ID

Бұл мысалдағы FROM сөйлемі WORKER кестесінің екі «көшірмелерін» жасайды, оларға А және В бүркеншік атын береді. Бүркеншік ат кестеге берілген балама атау болып табылады. Содан кейін WORKER кестесінің A және B көшірмелері B ішіндегі WORKER_ID және A ішіндегі SUPV_ID теңдік шартына негізделген WHERE пәрменімен біріктіріледі. Осылайша, А жолының әрбір жолы А жолының менеджері туралы ақпаратты қамтитын B жолына біріктіріледі. (Cурет 2).

Күріш. 2. WORKER кестесінің екі данасын біріктіру

Әр жолдан екі қызметкердің атын таңдау арқылы біз қажетті тізімді аламыз:

A.NAMEB.NAME

М.Фарадей Х.Колумб

К.Немо Г.Рикковер Р.Гарретт Р.Гарретт

П. Мейсон П. Мейсон Г. Риковер Г. Риковер Х. Колумб Х. Колумб Дж. Адвокат П. Мейсон

Лақап аты.Кестеге берілген балама атау.

A.WORKER_NAME жұмысшыны және B.WORKER_NAME менеджерді білдіреді. Кейбір жұмысшылар өздерінің жеке менеджерлері екенін ескеріңіз, бұл олардың қатарындағы WORKER_ID - SUPV_ID теңдігінен туындайды.

SQL тілінде бір уақытта екі кестеден артық байланыстыруға болады:

Сұраныс

ЖҰМЫСШЫ_NAME ТАҢДАУ

ЖҰМЫСШЫДАН, ТАПСЫРМАДАН, Ғимараттан

WHERE WORKER.WORKER_ID = ASSIGNMENT.WORKER_ID AND ASSIGNMENT.BLDG_ID = BUILDING.BLDG_ID ЖӘНЕ

TYPE = "Кеңсе"

Нәтиже:

М.Фарадей

Г. Риковер

Дж.Адвокат

Егер баған атауы (мысалы, WORKER_ID немесе BLDG_ID) бірнеше кестеде пайда болса, екіұштылықты болдырмау үшін баған атауын бастапқы кестенің атымен бірге қою керек екенін ескеріңіз. Бірақ егер баған атауы біздің мысалдағы TYPE сияқты тек бір кестеде болса, онда ешқандай түсініксіздік жоқ, сондықтан кесте атауын көрсету қажет емес.

Бұл сұраудағы SQL пәрмендері үш реляциялық дерекқор кестелерінен бір кесте жасайды. Алғашқы екі кесте WORKER_ID арқылы қосылады, содан кейін үшінші кесте нәтиже кестеге BLDG_ID арқылы қосылады. Шарт

TYPE = "Кеңсе"

WHERE тармағы кеңсе ғимараттарынан басқа барлық жолдарды алып тастайды. Бұл сұраныс талаптарына сәйкес келеді.

3. Ішкі сұраулар

Ішкі сұрау.Сұрау ішіндегі сұрау

Ішкі сұрауды сұраудың WHERE сөйлемінің ішінде орналастыруға болады, осылайша WHERE сөйлемінің мүмкіндіктерін кеңейтеді. Мысал қарастырайық.

Сұраныс: 435-ші ғимаратқа бекітілген жұмысшылардың мамандықтары қандай?

SKTLL_TYPE ТАҢДАУ

ЖҰМЫСШЫНЫҢ_ЖҰМЫСШЫСЫ МЕНЕН

(Жұмысшы_идентификаторын ТАҢДАҢЫЗ

ҚАЙДА BLDG_ID = 435)

Бұл мысалдағы ішкі сұрау

(Жұмысшы_идентификаторын ТАҢДАҢЫЗ

ҚАЙДА BLDG_ID = 435)

Ішкі сұрауды қамтитын сұрау шақырылады сыртқы сұраунемесе негізгі сұраныс. Ішкі сұрау келесі қызметкер идентификаторларының жинағын жасауға әкеледі:

ЖҰМЫСШЫ идентификаторы

Сыртқы сұрау.Барлық ішкі сұрауларды қамтитын негізгі сұрау.

Бұл идентификаторлар жинағы сыртқы сұраудағы ішкі сұраудың орнын алады. Осы сәттен бастап сыртқы сұрау ішкі сұрау арқылы жасалған жиынды пайдаланып орындалады. Сыртқы сұрау WHERE тармағына сәйкес WORKER кестесінің әрбір жолын өңдейді. Егер жолдың WORKER_ID мәні ішкі сұрау арқылы жасалған (IN) жиынында жатса, онда жолдың SKILL_TYPE таңдалады және нәтиже кестеде көрсетіледі:

БІЛІКТІЛІК ТҮРІ

Сылақшы

Шатыршы

Электрик

Ішкі сұраудың SELECT сөйлемінде WORKER_ID және тек WORKER_ID болуы өте маңызды. Әйтпесе, WORKER_ID жұмысшы идентификаторларының жиынында екенін білдіретін сыртқы сұраудың WHERE сөйлемінің мағынасы болмайды.

Негізгі сұрау кем дегенде бір жолды қарастырмас бұрын ішкі сұрау логикалық түрде орындалуы мүмкін екенін ескеріңіз. Бір мағынада ішкі сұрау негізгі сұраудан тәуелсіз. Оны толық сұрау ретінде орындауға болады. Мұндай ішкі сұрау негізгі сұраумен корреляцияланбайды дейміз. Жақында көретініміздей, ішкі сұрауларды өзара байланыстыруға болады.

Корреляциясыз ішкі сұрау.Мәні кез келген сыртқы сұраудан тәуелсіз ішкі сұрау.

Мұнда ішкі сұрау ішіндегі ішкі сұраудың мысалы келтірілген.

Сұраныс: кеңсе ғимараттарына тағайындалған қызметкерлердің тізімін жасаңыз.

Біз қайтадан байланысты қарастырған сұрауды қарастырамыз.

WORKER_MAME ТАҢДАУ

ЖҰМЫСШЫСЫ_ЖҰМЫСШЫСЫ ҚАЙДА

(Жұмысшы_идентификаторын ТАҢДАҢЫЗ

BLDG_ID ҚАЙДА

ТҮРІ = «Кеңсе»))

Нәтиже:

М.Фарадей

Г. Риковер

Дж.Адвокат

Кез келген жерде баған атауларын кесте атауларымен префикспен қоюдың қажеті жоқ екенін ескеріңіз, өйткені әрбір ішкі сұрау тек бір кестені өңдейді, сондықтан ешқандай түсініксіздік туындамайды.

Сұрауды орындау ішкі-сыртқы ретпен орындалады. Яғни, алдымен ең ішкі сұрау (немесе «төменгі») орындалады, содан кейін оны қамтитын ішкі сұрау, содан кейін сыртқы сұрау орындалады.

Корреляциялық ішкі сұраулар. Жоғарыда қарастырылған барлық ішкі сұраулар олар пайдаланылған негізгі сұраулардан тәуелсіз болды. Тәуелсіз деп біз ішкі сұрауларды толық сұраулар ретінде өздігінен орындауға болатынын айтамыз. Біз енді орындалу нәтижелері негізгі сұрау қарастыратын жолға байланысты болатын ішкі сұраулар класын қарастыруға көшеміз. Мұндай ішкі сұраулар корреляциялық ішкі сұраулар деп аталады.

Корреляциялық ішкі сұрау. Нәтижесі негізгі сұрау қарастыратын жолға тәуелді ішкі сұрау.

Сұраныс:Сағаттық мөлшерлемелері менеджерлерінен жоғары қызметкерлерді тізімдеңіз.

ЖҰМЫСШЫ_NAME ТАҢДАУ

ҚАЙДА A.HRLY_RATE >

(B.HRLY_RATE ТАҢДАУ

ҚАЙДА Б.ЖҰМЫСШЫ_ID = A.SUPV_ID)

Нәтиже:

Бұл сұранысты орындаудың логикалық қадамдары:

1. Жүйе ЖҰМЫСШЫ кестесінің екі данасын жасайды: А көшірмелері және В көшірмелері. Біз анықтаған әдіс бойынша А қызметкерге, В менеджерге сілтеме жасайды.

2. Содан кейін жүйе әрбір A жолын қарастырады. Берілген жол WHERE шартын қанағаттандыратын болса таңдалады. Бұл шарт оның HRLY_RATE мәні ішкі сұрау жасаған HRLY_RATE мәнінен үлкен болса, жол таңдалатынын білдіреді.

3. Ішкі сұрау WORKER_ID мәні A жолының SUPV_ID мәніне тең болатын B жолынан HRLY_RATE мәнін таңдайды. осы сәтнегізгі сұраныс бойынша қарастырылады. Бұл менеджердің HRLY_RATE бағасы.

A.HRLY_RATE тек бір мәнмен салыстыруға болатындықтан, ішкі сұрау тек бір мәнді қайтаруы керек екенін ескеріңіз. Бұл мән қандай A жолы қарастырылып жатқанына байланысты өзгереді. Осылайша, ішкі сұрау негізгі сұраумен корреляцияланады. Корреляциялық ішкі сұраулардың басқа мысалдарын кейінірек кірістірілген функцияларды зерттеген кезде көреміз.

EXISTS және NOT EXISTS операторлары

Біз белгілі бір ғимаратта жұмыс істеуге тағайындалмаған жұмысшыларды анықтағымыз келеді делік. Сырттай қарағанда, мұндай сұраныс сұраныстың растаушы нұсқасын жоққа шығару арқылы оңай қанағаттандырылатын сияқты. Мысалы, бізді BLDG_ID 435 бар ғимарат қызықтырады делік. Сұранысты қарастырыңыз:

WORKER_ID ТАҢДАУ

BLDG_ID ЕМЕС 435

Өкінішке орай, бұл шешімнің дұрыс емес тұжырымы. Сұраныс бізге басқа ғимараттарда жұмыс істейтін жұмысшылардың жеке куәліктерін береді. Олардың кейбіреулерін 435-ші ғимаратқа да жатқызуға болатыны анық.

Дұрыс тұжырымдалған шешім NOT EXISTS операторын пайдаланады:

WORKER_ID ТАҢДАУ

ЖОҚ ЖЕРДЕ

WHERE ASSIGNMENT.WORKER_ID = WORKER.WORKER_ID ЖӘНЕ

Нәтиже:

WORKER_ID

EXISTS және NOT EXISTS операторлары әрқашан ішкі сұраудың алдында орналасады. Ішкі сұрау арқылы жасалған жиын бос болмаса, EXISTS "шын" деп бағалайды. Ішкі сұрау арқылы жасалған жиын бос болса, EXISTS «жалған» мәнін қабылдайды. NOT EXISTS операторы, әрине, керісінше жұмыс істейді. Ішкі сұраудың нәтижесі бос болса ақиқат, әйтпесе жалған болады.

EXISTS операторы. Нәтижелер жинағы бос болмаса, шын мәнін қайтарады.

ЕМЕС оператор. Нәтижелер жинағы бос болса, шын мәнін қайтарады.

Бұл мысалда біз NOT EXISTS операторын қолдандық. Ішкі сұрау WORKER_ID негізгі сұрау қарастыратын жолмен бірдей мәнге ие және BLDG_ID 435-ке тең болатын ASIGNMENT кестесінің барлық жолдарын таңдайды. Егер бұл жиын бос болса, онда негізгі сұрау қарастыратын жұмысшы жолы болып табылады. таңдалған, себебі бұл қызметкер 435 ғимаратта жұмыс істемейді дегенді білдіреді.

Біз ұсынған шешімде біз корреляциялық ішкі сұрауды қолдандық. Егер біз NOT EXISTS орнына IN операторын қолдансақ, біз өзара байланысы жоқ ішкі сұрауды пайдалана аламыз:

WORKER_ID ТАҢДАУ

ЖҰМЫСШЫ_ЖҰМЫСШЫСЫ КІРМЕГЕН ЖЕРДЕ

(Жұмысшы_идентификаторын ТАҢДАҢЫЗ

BLDG_ID = 435)

Бұл шешім NOT EXISTS операторы бар шешімге қарағанда оңайырақ. Табиғи сұрақ туындайды: неліктен бізге БАРЛЫҚТАР керек және мүлде ЖОҚ? Жауап мынада: EM EXISTS — шартта «әрбір» сөзі бар сұрауларды шешудің жалғыз жолы. Мұндай сұраныстар реляциялық алгебрада бөлу операциясы арқылы, ал реляциялық есепте әмбебап кванфикатордың көмегімен шешіледі. Мұнда «әрбір» сөзі бар сұраудың мысалы келтірілген:

Сұраныс:Әр ғимаратқа тағайындалған қызметкерлердің тізімін жасаңыз.

Бұл сұрақты SQL-де қосарлы терістеулерді қолдану арқылы іске асыруға болады. Қос теріс мәнді қосу үшін сұрауды қайта өңдейміз:

Сұраныс:Кімге арналған осындай қызметкерлерді көрсетіңіз Жоқолар тағайындалмаған ғимарат бар.

Біз қосарланған теріс жағын атап өттік. Бұл өтініш логикалық тұрғыдан алдыңғысына тең екені анық.

Енді біз шешімді SQL тілінде құрастырғымыз келеді. Түпкілікті шешімді түсінуді жеңілдету үшін алдымен алдын ала мәселенің шешімін береміз: болжамды жұмысшы «1234» барлық ғимараттарды анықтау мәселесі. Жоқтағайындалды.

(I) BLDG_ID ТАҢДАУ

ЖОҚ ЖЕРДЕ

ТАПСЫРМА.ЖҰМЫСШЫ_ID = 1234)

Біз бұл сұрауды (I) белгіледік, өйткені біз оған кейінірек сілтеме жасаймыз. Егер бұл сұранысты қанағаттандыратын ғимарат болмаса, онда әрбір ғимаратқа 1234 қызметкері тағайындалады, сондықтан бастапқы сұраныстың шарттарын қанағаттандырады. Түпнұсқа сұраудың шешімін алу үшін нақты жұмысшы 1234 сұрауын (I) WORKER_ID айнымалысына жалпылауымыз керек және бұл өзгертілген сұрауды үлкенірек сұраудың ішкі сұрауына айналдыруымыз керек. Міне, шешім:

(II) WORKER_ID ТАҢДАУ

ЖОҚ ЖЕРДЕ

ЖОҚ ЖЕРДЕ

WHERE ASSIGNMENT.BLDG_ID = BUILDING.BLDG_ID ЖӘНЕ

ASSIGNMENT.WORKER_ID = WORKER.WORKER_ID)

Нәтиже:

ЖҰМЫСШЫ идентификаторы

(II) сұраудың төртінші жолында басталатын ішкі сұрау "1234" WORKER.WORKER_ID орнына ауыстырылған сұраумен (I) бірдей екенін ескеріңіз. (II) сұрауды келесідей оқуға болады:

WORKER_ID тағайындалмаған ғимарат болмаса, WORKER_ID дегенді WORKER ішінен таңдаңыз.

Бұл бастапқы сұраудың шарттарына сәйкес келеді.

Біз NOT EXISTS операторын реляциялық алгебрадағы бөлу операциясын және реляциялық есепте әмбебап кванфикаторды қажет ететін сұрауларды құрастыру үшін пайдалануға болатынын көреміз. Пайдаланудың қарапайымдылығы тұрғысынан NOT EXISTS операторы ерекше артықшылық ұсынбайды, яғни екі рет EXISTS EXISTS пайдаланатын SQL сұраулары бөлумен реляциялық алгебра шешімдеріне немесе әмбебап кванторлары бар реляциялық есептеу шешімдеріне қарағанда түсіну оңай емес. Мұндай сұрауларды табиғи түрде шешуге мүмкіндік беретін тілдік құрылымдарды жасау үшін қосымша зерттеулер қажет болады.

Кірістірілген функциялар

Осы түрдегі сұрақтарды қарастырайық:

Ең жоғары және ең төменгі сағаттық тарифтер қандай? 435 ғимаратта жұмыс істейтін қызметкерлердің орташа жұмыс күні қанша? 312 ғимараттың сылақ жұмыстарына жалпы қанша күн бөлінген? Неше түрлі мамандықтар бар?

Бұл сұрақтарға жауап беру үшін кестедегі көптеген жолдарды қарайтын және бір мәнді қайтаратын статистикалық функциялар қажет. SQL тілінде кірістірілген функциялар немесе жиынтық функциялар деп аталатын осындай бес функция бар. Бұл функциялар: SUM (қосынды), AVG (орташа), COUNT (сан), MAX (максималды) және MIN (ең аз).

Кірістірілген функция (орнатылған функция). Бірнеше жолда жұмыс істейтін статистикалық функция: SUM (қосынды), AVG (орташа), COUNT (сан), MAX (максималды), MIN (ең аз).

Сұраныс:Ең жоғары және ең төменгі сағаттық тарифтер қандай?

MAX (HRLY_RATE), MIN (HRLY_RATE) ТАҢДАУ

Нәтиже: 17.40, 8.20

MAX функцияларыжәне MIN бір кесте бағанында жұмыс істейді. Олар осы бағаннан сәйкесінше ең үлкен немесе ең төменгі мәнді таңдайды. Біздің сұрау тұжырымымызда WHERE сөйлемі жоқ. Біздің келесі мысалда көрсетілгендей, көптеген сұраулар үшін бұлай болмауы мүмкін.

Сұраныс: 435 ғимаратта жұмыс істейтін қызметкерлердің орташа жұмыс күні қанша?

AVG ТАҢДАУ(NUM_DAYS)

ҚАЙДА BLDG_ID =435

Нәтиже: 12.33

Сұраныс: 312 ғимараттың сылақ жұмыстарына жалпы қанша күн бөлінген?

СОМДАНЫ ТАҢДАУ(NUM_DAYS)

ТАПСЫРМАДАН, ЖҰМЫСШЫ

WHERE WORKER.WORKER_ID = ASSIGNMENT.WORKER_ID ЖӘНЕ

SKILL_TYPE = "Сылақшы" ЖӘНЕ

Нәтиже: 27

Шешім ASIGNMENT және WORKER кестелері арасындағы біріктіруді пайдаланады. Бұл қажет, себебі SKILL_TYPE WORKER кестесінде және BLDG_ID ТАПСЫРМА кестесінде орналасқан.

Сұраныс:Неше түрлі мамандықтар бар?

COUNT ТАҢДАУ (ДИСТИНКТ SKILL_TYPE)

Нәтиже: 4

Бір мамандық бірнеше түрлі жолдарда көрінуі мүмкін болғандықтан, жүйенің бір мамандық түрін бірнеше рет санауын болдырмау үшін осы сұрауда DISTINCT кілт сөзін пайдалану керек. DISTINCT операторын кірістірілген функциялардың кез келгенімен пайдалануға болады, бірақ ол әрине MAX және MIN функцияларымен артық.

АЙРЫМДЫ. Қайталанатын жолдарды жоятын оператор.

SUM және AVG функцияларын тек сандық бағандармен пайдалану керек. Басқа функцияларды сандық және таңба деректерімен бірге пайдалануға болады. COUNT-тан басқа барлық функцияларды есептелген өрнектермен пайдалануға болады. Мысалы:

Сұраныс:Орташа апталық жалақы қанша?

AVG ТАҢДАУ (40 * HRLY_RATE)

Нәтиже: 509.14

COUNT жеке бағанға емес, бүкіл жолға сілтеме жасай алады :

Сұраныс: Сапа 3-деңгейі бар қанша ғимарат бар?

САНДЫ ТАҢДАУ (*)

ҚАЙДА Ғимараттан

Нәтиже: 3

Барлық осы мысалдар көрсеткендей, ТАҢДАУ пәрменінде кірістірілген функция болса, сол ТАҢДАУ пәрменінде басқа ештеңе көрінбейді. Бұл ереженің жалғыз ерекшелігі GROUP BY тармағын қамтиды, біз оны қазір қарастырамыз.

GROUP BY және HAVING сөйлемдері

Басқаруда көптеген топтардағы әрбір топ туралы статистикалық ақпарат жиі талап етіледі. Мысалы, келесі сұрауды қарастырыңыз:

Сұраныс:Әрбір басшы үшін оның қарамағындағылар арасындағы ең жоғары сағаттық тарифті анықтаңыз.

Бұл мәселені шешу үшін біз жұмысшыларды басшыларына қарай топтарға бөлуіміз керек. Содан кейін біз әр топтағы максималды бағаны анықтаймыз. SQL-де бұл келесі жолмен жасалады:

SUPV_ID БОЙЫНША ТОПТАУ

Нәтиже:

SUPV_IDMAX(САҚТЫҚ БАҒАМ)

Бұл сұрауды өңдеу кезінде жүйе алдымен келесі ережені пайдаланып ЖҰМЫСШЫ кестесінің жолдарын топтарға бөледі. Жолдар бірдей SUPV_ID болған жағдайда ғана бір топқа орналастырылады. Әр топқа ТАҢДАУ сөйлемі қолданылады. Бұл топта тек бір SUPV_ID мәні болғандықтан, топта SUPV_ID белгісіздігі жоқ. Әрбір топ үшін SELECT сөйлемі SUPV_ID мәнін шығарады, сонымен қатар MAX(HRLY_RATE) мәнін есептеп шығарады. Нәтиже жоғарыда көрсетілген.

Кірістірілген функциялары бар ТАҢДАУ пәрменінде GROUP BY сөйлеміне енгізілген бағандар ғана пайда болуы мүмкін. SUPV_ID параметрін ТАҢДАУ пәрменінде пайдалануға болатынын ескеріңіз, себебі ол GROUP BY тармағында қамтылған.

GROUP BY сөйлемі. Жолдарды көрсетілген бағандардың ортақ мәндері бар топтарға бөлу керектігін көрсетеді.

GROUP BY сөйлемі белгілі бір күрделі есептеулерді орындауға мүмкіндік береді. Мысалы, біз осы максималды ұсыныстардың орташа мәнін білгіміз келуі мүмкін. Дегенмен, кірістірілген функциялары бар есептеулер басқа кірістірілген функциялардың ішінде кірістірілген функцияларды пайдалануға мүмкіндік бермейтін мағынада шектелген. Осылайша өрнек сияқты

AVG(MAX(HRLY_RATE))

тыйым салынған. Мұндай сұранысты жүзеге асыру екі кезеңнен тұрады. Алдымен біз максималды баға ұсыныстарын жаңа кестеге қоюымыз керек, ал екінші қадамда олардың орташа мәнін есептеуіміз керек.

GROUP BY пәрменімен WHERE сөйлемін пайдалануға болады:

Сұраныс:Ғимараттың әр түрін анықтаңыз орташа деңгей 1 мәртебедегі ғимараттардың сапасы.

ТҮРІН ТАҢДАУ, AVG(QLTY_LEVEL)

МӘРТЕБЕСІ = 1

Нәтиже:

TYPEAVG(QLTY_LEVEL)

Дүкен 1

Тұрғын үй 3

WHERE сөйлемі GROUP BY операторының алдында орындалады. Осылайша, ешбір топ 1-ден басқа күйі бар жолды қамти алмайды. Күй 1 жолдары TYPE мәні бойынша топтастырылады, содан кейін әрбір топқа ТАҢДАУ сөйлемі қолданылады.

HAVING сөз тіркесі. Топтарға шарт қояды.

Шарттарды GROUP BY тармағы арқылы жасалған топтарға да қолдана аламыз. Бұл HAVING тіркесі арқылы жасалады. Мысалы, біз алдыңғы сұраулардың бірін нақтырақ етуді шештік делік:

Сұраныс: Бірден көп бағыныштысы бар әрбір басшы үшін оның қарамағындағылар арасындағы ең жоғары сағаттық тарифті анықтаңыз.

Біз бұл шартты сәйкес HAVING пәрменімен көрсете аламыз:

SUPV_ID ТАҢДАУ, MAX (HRLY_RATE)

ЖҰМЫС ТОБЫНАН SUPV_ID

САН (*) > 1

Нәтиже:

SUPV_ID MAX (HRLY_RATE)

WHERE және HAVING сөйлемдерінің арасындағы айырмашылық WHERE жолдарға, ал HAVING топтарға қолданылады.

Сұрау WHERE және HAVING сөйлемін де қамтуы мүмкін. Бұл жағдайда WHERE сөйлемі бірінші орындалады, себебі ол топтастырудан бұрын орындалады. Мысалы, алдыңғы сұраудың келесі модификациясын қарастырыңыз:

Сұраныс: Ғимараттың әрбір түрі үшін 1 мәртебедегі ғимараттардың орташа сапа деңгейін анықтаңыз. Ең жоғары сапа деңгейі 3-тен аспайтын ғимараттардың түрлерін ғана қарастырыңыз.

ТҮРІН ТАҢДАУ, AVG (QLTY_JLEVEL)

МӘРТЕБЕСІ = 1

MAX (QLTY_LEVEL) БАР<= 3

Нәтиже:

TYPE AVG(QLTY_LEVEL)

Дүкен 1

Тұрғын үй 3

FROM сөйлемінен бастап сөйлемдердің ретімен орындалатынын, содан кейін SELECT сөйлемінің қолданылатынын ескеріңіз. Осылайша, WHERE сөйлемі Building кестесіне қолданылады және STATUS 1-ден басқа барлық жолдар жойылады. Қалған жолдар TYPE бойынша топтастырылған; бірдей TYPE мәні бар барлық жолдар бір топқа аяқталады. Осылайша, әрбір TYPE мәні үшін біреуден бірнеше топ құрылады. Әр топқа HAVING сөйлемі қолданылады және ең жоғары сапа деңгейі мәні 3-тен асатын топтар жойылады. Соңында, SELECT сөйлемі қалған топтарға қолданылады.

7. Кірістірілген функциялар мен ішкі сұраулар

Кірістірілген функцияларды тек SELECT сөйлемінде немесе HAVING пәрменінде пайдалануға болады. Дегенмен, кірістірілген функцияны қамтитын SELECT сөйлемі ішкі сұраудың бөлігі болуы мүмкін. Осындай ішкі сұраудың мысалын қарастырайық:

Сұраныс:Қандай қызметкерлер орташа сағаттық тарифтен жоғары?

ЖҰМЫСШЫ_NAME ТАҢДАУ

ҚАЙДА HRLY_RATE >

(ORTA ТАҢДАУ(HRLY_RATE)

Нәтиже:

Х.Колумб

Ішкі сұрау негізгі сұраумен корреляцияланбағанын ескеріңіз. Ішкі сұрау дәл бір мәнді қайтарады - орташа сағаттық мөлшерлеме. Негізгі сұрау жұмысшыны оның мөлшерлемесі есептелген орташа мәннен жоғары болған жағдайда ғана таңдайды.

Корреляциялық сұраулар кірістірілген функцияларды да пайдалана алады:

Сұрау: Қай қызметкердің сағаттық ставкасы бір басшының қарамағындағылар арасындағы орташа сағаттық ставкадан жоғары?

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

ТАҢДАУ A. ЖҰМЫСШЫ_NAME

SQL сұрауларды бір-біріне орналастыруға мүмкіндік береді. Әдетте ішкі сұрау предикаттың ақиқат екенін тексеру үшін тексерілетін жалғыз мәнді қайтарады.

Іздеу терминдерінің түрлері:
. Ішкі сұрау нәтижесімен салыстыру (=, >=)
. Ішкі сұрау нәтижелеріне тиесілігін тексеру (IN)
. Бар-жоғын тексеру (EXISTS)
. Бірнеше (сандық) салыстыру (КЕЗ КЕЛГЕН, БАРЛЫҚ)

Кірістірілген сұраулар туралы ескертпелер:
. Ішкі сұрау тек бір бағанды ​​таңдауы керек (EXISTS предикаты бар ішкі сұраудан басқа) және оның нәтиже деректер түрі предикатта көрсетілген мәннің деректер түріне сәйкес келуі керек.
. Кейбір жағдайларда, бір мәннің қайтарылуын қамтамасыз ету үшін DISTINCT кілт сөзін пайдалануға болады.
. Ішкі сұрауға ORDER BY немесе UNION сөйлемін қоса алмайсыз.
. Ішкі сұрау іздеу шартының сол жағында немесе оң жағында орналасуы мүмкін.
. Ішкі сұраулар GROUP BY сөйлемінсіз біріктіру функцияларын пайдалана алады, олар жолдардың кез келген саны, арнайы IN предикаты және бағанға негізделген өрнектер үшін арнайы мәнді автоматты түрде қайтарады.
. Мүмкіндігінше ішкі сұраулардың орнына JOIN кесте біріктірулерін пайдалану керек.

Кірістірілген сұрауларға мысалдар:

SNum=(SNum FROM SalesPeople WHERE SNum='Motika' ТАҢДАУ)
SNum IN КЕЛГЕН Тапсырыстардан * ТАҢДАҢЫЗ (ТАҢДАУ SNum FROM SalesPeople WHERE City=‘London’)
SNum=(ТАҢДАУ DISTINCT SNum FROM CNum=2001)
* ТАҢДАУ Тапсырыстар ҚАЙДА Amt>(Odate=10/04/1990 тапсырыстардан AVG(Amt) ТАҢДАҢЫЗ)
CNum=(SName=‘Serres' WHERE SalesPeople FROM FROM SNum+1000 ТАҢДАУ) * Клиенттен ТАҢДАҢЫЗ.

2) Қатысты ішкі сұраулар

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

Қатысты ішкі сұрауларға мысалдар:

SELECT * FROM SalesPeople Main WHERE 1(ТАҢДАУ AVG(Amt) FROM тапсырыстар O2 WHERE O2.CNum=O1.CNum) //мәні берілген тұтынушы үшін орташа тапсырыс мәнінен асатын барлық тапсырыстарды қайтарады

3) EXISTS предикаты

Синтаксистік формасы: БАР ()

Предикат ішкі сұрауды аргумент ретінде қабылдайды және егер ішкі сұрауда шығыс болса, ақиқат деп бағалайды, ал әйтпесе жалған. Ішкі сұрау бір рет орындалады және бірнеше бағандарды қамтуы мүмкін, өйткені олардың мәндері тексерілмейді, бірақ жолдардың болуының нәтижесі жай ғана жазылады.

EXISTS предикаты туралы ескертпелер:
. EXISTS — TRUE немесе FALSE қайтаратын предикат және оны жеке немесе басқа логикалық өрнектермен бірге пайдалануға болады.
. EXISTS ішкі сұрауында жинақтау функцияларын пайдалана алмайды.
. Корреляциялық ішкі сұрауларда EXISTS предикаты сыртқы кестенің әрбір жолы үшін орындалады.
. EXISTS предикатын кесте біріктірулерімен біріктіруге болады.

EXISTS предикатының мысалдары:

ТАҢДАУ * Клиенттен WHERE EXISST(SELECT * FROM Customer WHERE City=’San Jose’) – егер олардың кез келгені Сан-Хоседе тұратын болса, барлық тұтынушыларды қайтарады.
ЖОҚ ЖЕРДЕ ТАҢДАУ (ТАҢДАУ * FROM Customer Send WHERE Send.SNum=First.SNum ЖӘНЕ Send.CNumFirst.CNum) – тек бір тұтынушыға қызмет көрсеткен сатушылар санын қайтарады.
ТАҢДАУ DISTINCT F.SNum, SName, F.City FROM SalesPeople F, Клиент S WHERE EXISDS (ТАҢДАУ * Клиент T WHERE S.SNum=T.SNum ЖӘНЕ S.CNumT.CNum ЖӘНЕ F.SNum=S.SNum) – қайтарады бірнеше тұтынушыларға қызмет көрсеткен барлық сатушылардың нөмірлері, аты-жөні және тұратын қалалары.
БАР ҚАЙДА бар SalesPeople Frst FROM (ТАҢДАУ * FROM Customer Send WHERE Frst.SNum=Send.SNum ЖӘНЕ 1)

4) Сандық салыстырудың предикаттары

Синтаксистік формасы: (=|>|=|) КЕЗ КЕЛГЕН|БАРЛЫҚ ()

Бұл предикаттар аргумент ретінде ішкі сұрауды пайдаланады, алайда EXISTS предикатымен салыстырғанда олар реляциялық предикаттармен (=,>=) бірге қолданылады. Бұл мағынада олар IN предикатына ұқсас, бірақ тек ішкі сұраулармен қолданылады. Стандарт ANY орнына SOME кілт сөзін пайдалануға мүмкіндік береді, бірақ барлық ДҚБЖ оны қолдамайды.

Салыстыру предикаттары туралы ескертпелер:
. Ішкі сұрауды орындау кезінде таңдалған әрбір мән сыртқы сұрау предикатында көрсетілген шартты қанағаттандыратын болса, БАРЛЫҚ предикаты ШЫН деп бағалайды. Ол көбінесе теңсіздіктермен қолданылады.
. Ішкі сұрауды орындау кезінде таңдалған кем дегенде бір мән сыртқы сұрау предикатында көрсетілген шартты қанағаттандыратын болса, КЕЗ КЕЛГЕН предикат ШЫН деп бағалайды. Ол көбінесе теңсіздіктермен қолданылады.
. Егер ішкі сұрау ешбір жолды қайтармаса, онда БАРЛЫҒЫ автоматты түрде TRUE мәнін қабылдайды (салыстыру шарты орындалған деп есептеледі), ал КЕЗ КЕЛГЕН үшін FALSE мәнін қабылдайды.
. Егер салыстыру ешқандай жолдар үшін ШЫН болса және NULL мәні бар бір немесе бірнеше жолдар болса, ANY БІЛМІЗ мәнін қайтарады.
. Егер салыстыру ешқандай жолдар үшін ЖАЛҒАН болса және NULL мәні бар бір немесе бірнеше жолдар болса, БАРЛЫҒЫ БІЛМІЗ мәнін қайтарады.

Сандық салыстыру предикатына мысалдар:

*ҚАЛА=КЕЗ КЕЛГЕН САТЫЛЫМДАРДАН ТАҢДАУ (Тұтынушыдан қаланы ТАҢДАУ)
ТАҢДАУ * Тапсырыстарды ҚАЙДА Amt БАРЛЫҚ (Рейтингті ТАҢДАУ РЕЙТІН КЕРЕК ҚАЛАСЫ = «Рим» тұтынушысынан)

5) Бірегейлік предикаты

ЕРЕКШЕ|ерекше ()

Предикат ішкі сұраудың шығыс деректеріндегі бірегейлікті (көшірмелердің жоқтығын) тексеру үшін қолданылады. Сонымен қатар, UNIQUT предикатында NULL мәндері бар жолдар бірегей болып саналады, ал DISTINCT предикатта екі анықталмаған мән бір-біріне тең деп есептеледі.

6) Предикатты сәйкестендіріңіз

МАТЧ ()

MATCH предикаты сұрау жолының мәні ішкі сұраудан алынған кез келген жолдың мәніне сәйкес келетінін тексереді. Бұл ішкі сұрау IN ЖӘНЕ КЕЗ КЕЛГЕН предикаттардан ерекшеленеді, ол кейбір NULL мәндері бар жолдар арасында орын алуы мүмкін «жартылай» (PARTIAL) сәйкестіктерді өңдеуге мүмкіндік береді.

7) FROM бөліміндегі сұраулар

Шын мәнінде, кесте сілтемесіне рұқсат етілген жерде ішкі сұрауды пайдалану заңды.

ТАҢДАУ CName, Tot_Amt FROM CNum, (CNum, SUM(Amt) AS Tot_Amt FROM CROUP BY CNum) WHERE City=‘London’ ЖӘНЕ Customer.CNum=Orders.CNum
//қосалқы сұрау Лондоннан әрбір тұтынушы берген тапсырыстардың жалпы сомасын қайтарады.

8) Рекурсивті сұраулар

РЕКУРСИВТІ
1-тоқсан ТАҢДАУ РЕТІНДЕ … ҚАЙДАН … ҚАЙДА …
2-тоқсан ТАҢДАУ РЕТІНДЕ … ҚАЙДАН … ҚАЙДА …




Жоғарғы