Аппараттық және бағдарламалық қамтамасыз етуді орнату

Күрделі SQL сұраныстарын орындау. Деректер жиынына арналған оператор INTERSECT Intersect sql мысалдары

SQL кестелерді біріктірудің екі әдісін ұсынады:
  • SELECT операторының FROM тармағында қосылатын кестелерді (ішкі сұрауларды қоса) көрсету арқылы. Алдымен кестелер біріктіріледі, содан кейін ғана алынған жиынға WHERE тармағымен көрсетілген шарттар, GROUP BY тармағымен анықталатын біріктіру, мәліметтерді ретке келтіру және т.б. қолданылады;
  • SELECT операторын өңдеу арқылы жасалған нәтижелер жиындарының бірігуін анықтау. Бұл жағдайда екі SELECT операторы сөз тіркесі арқылы біріктіріледі ОДА, ҚИылысу, ОСЫнемесе СӘЙКЕСТІК.

ОДА

Сөз тіркесі ОДАкелесі ережелерге сәйкес екі сұраудың нәтижелерін біріктіреді:

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

Қажетті сұрыптау ретін нақты көрсету үшін ORDER BY сөйлемін пайдаланыңыз. Бұл жағдайда бағанның атын да, оның нөмірін де пайдалануға болады (4.3-сурет).


Күріш. 4.3.

Сөз тіркесі ОДА ALL келесі ерекшеліктерді қоспағанда, UNION тармағы сияқты екі ішкі сұрауды біріктіруді орындайды:

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

Екіден көп сұраныстарды біріктіру кезінде біріктіру операциясының орындалу ретін өзгерту үшін жақшаларды пайдалануға болады (4.4-сурет).


Күріш. 4.4.

INTERSECT қосылу

Сөз тіркесі ҚИылысубіріктірілетін әрбір нәтиже жиынында бар жолдарды ғана таңдауға мүмкіндік береді. Суретте. 4.5 сұрауларды қиылысатын жиындар ретінде біріктіру мысалын көрсетеді.


Күріш. 4.5.

Одағынан басқа

Сөз тіркесі ОСЫбіріктірілетін бірінші нәтижелер жинағында бар, бірақ екінші нәтижелер жинағында жоқ жолдарды ғана таңдауға мүмкіндік береді.

Сөз тіркестері ҚИылысуЖәне ОСЫтек толық SQL-92 сәйкестік деңгейінде қолдау көрсету керек. Сонымен, фразаның орнына кейбір ДҚБЖ

Бұл SQL оқулығы SQL тілін қалай пайдалану керектігін түсіндіреді INTERSECT операторысинтаксиспен және мысалдармен.

Сипаттама

SQL INTERSECT операторы 2 немесе одан да көп SELECT операторларының нәтижелерін қайтару үшін қолданылады. Дегенмен, ол барлық сұраулар немесе деректер жиындары арқылы таңдалған жолдарды ғана қайтарады. Жазба бір сұрауда болса, екіншісінде болмаса, ол INTERSECT нәтижелерінен алынып тасталады.

Қиылысу сұрауы

Түсініктеме: INTERSECT сұрауы жазбаларды көк түсті аймақта қайтарады. Бұл Dataset1 және Dataset2 екеуінде де бар жазбалар.

SQL INTERSECT ішіндегі әрбір SQL мәлімдемесінде деректер түрлері ұқсас нәтижелер жиындарында бірдей өрістер саны болуы керек.

Синтаксис

SQL тіліндегі INTERSECT операторының синтаксисі:

1 өрнек1, өрнек2, ... өрнек_n кестелерден ТАҢДАҢЫЗ INTERSECT ТАҢДАУ өрнек1, өрнек2, ... өрнек_n кестелерден ;

Параметрлер немесе аргументтер

өрнек1, өрнек2, өрнек_n кестелер Жазбаларды шығарып алғыңыз келетін кестелер. FROM тармағында тізімделген кем дегенде бір кесте болуы керек. WHERE шарттары Қосымша. Бұл жазбаларды таңдау үшін орындалуы керек шарттар.

Мысал - Жалғыз өрнекпен

Төменде бірдей деректер түрі бар бір өрісі бар SQL INTERSECT операторының мысалы берілген:

Жабдықтаушылардан жеткізуші_идентификаторын ТАҢДАУ INTERSECT SELECT provider_id FROM тапсырыстар;

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

Енді INTERSECT сұрауына қосу арқылы мысалды әрі қарай салыстырайық.

ЖЕТКІЗУШІЛЕРДЕН ТАҢДАУ жеткізуші_идентификаторы ҚАЙДА жеткізуші_идентификаторы > 78 ҚИЫЛЫС ЖЕТКІЗУШІЛЕРДІ ТАҢДАУ Тапсырыстардан ҚАЙДА саны<> 0;

Бұл мысалда WHERE сөйлемдері деректер жиынының әрқайсысына қосылған. Бірінші деректер жинағы тек жазбалар үшін сүзілді жеткізушілеркесте, онда жеткізуші_идентификаторы 78-ден жоғары болса қайтарылады. Екінші деректер жинағы тек жазбалар үшін сүзілді тапсырыстар саны 0-ге тең емес.

Мысал - Бірнеше өрнектермен

Әрі қарай, бірнеше бағандарды қайтару үшін SQL тіліндегі INTERSECT операторын пайдаланудың мысалын қарастырайық.

контакт_идентификаторын, тегі_атын, атын ТАҢДАУ контактілерден Тегі_аты ҚАЙДА<>"Андерсон" INTERSECT ТАҢДАУ тұтынушы_идентификаторы, тегі, аты_жөні. Клиенттердің идентификаторы ҚАЙДА< 50;

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

Нәтижелерді одан әрі сүзгілеу үшін әрбір деректер жиынында WHERE шарттары бар, осылайша тек жазбалар контактілерқайда қайтарылады текемес Андерсон. бастап жазбалар тұтынушыларкесте қай жерде қайтарылады тұтынушы_идентификаторы 50-ден аз.

Мысал - ORDER BY пайдалану

жеткізуші_идентификаторы, жеткізуші_атын ТАҢДАҢЫЗ ЖЕТКІЗУШІЛЕРДЕН ҚАЙДА жеткізуші_идентификаторы > 2000 ҚЫСЫЛҒАН компания_идентификаторын, компанияның_атын ТАҢДАҢЫЗ компаниялардан ҚАЙДА компания_идентификаторы > 1000 ТАПСЫРЫС 2;

Баған атаулары екі ТАҢДАУ нұсқауының арасында әртүрлі болғандықтан, ORDER BY сөйлеміндегі бағандарға нәтиже жиынындағы орны бойынша сілтеме жасау тиімдірек. Бұл мысалда біз нәтижелерді сұрыптадық жеткізуші_атауы / Компанияның Аты 2 БОЙЫНША ТӘРТІПпен белгіленген өсу ретімен.

The жеткізуші_атауы / Компанияның Атыөрістер нәтижелер жиынындағы №2 позицияда.

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

Нюанстар

Маған жиі сұрақ қояды, бұл мақала кімге арналған? Бірақ, маған сеніңіз, жауап беру әрқашан оңай емес: бір жағынан, ештеңемен таң қалдыру қиын ниндзя әзірлеушілері, ал екінші жағынан жас падавандар бар. Бірақ мен бір нәрсені нақты айта аламын - SQL-ге қызығушылық танытатын, өзінің бай суретін шағын, бірақ өте қызықты мәліметтермен толықтыра алатын оқырман үшін. Бұл мақалада sql сұрауының километрлік беттері болмайды, максимум 1, 2 жол және менің ойымша сирек кездесетін нәрсе ғана. Бірақ мен ашық айтқым келетіндіктен, егер сізде SQL болса, мақала қызықсыз болып көрінеді. Бірінші және төртіншіден басқа мақаладағы барлық мысалдарды SQL-92 стандартына жатқызуға болады.

Деректер

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

Сценарийлер және деректер кестесі

КЕСТЕ ТАУЛАРЫН ЖАСАУ(id bigint NULL ЕМЕС, атау таңбасын өзгерту(127) NULL ЕМЕС, сипаттама таңбасын өзгерту(255) NULL ЕМЕС, баға сандық(16,2) NULL ЕМЕС, артикул таңбасын өзгерту(20) NULL ЕМЕС, әрекет_уақыты уақыт белгісі NULL ЕМЕС , қолжетімділік логикалық NO NULL, CONSTRAINT pk_goods PRIMARY KEY (id)); INSERT INTO тауарлар (id, атауы, сипаттамасы, бағасы, бап, акт_уақыты, қолжетімділігі) VALUES (1, «Тәпішке», «Soft», 100.00, «TR-75», (ts «2017-01-01 01:01: 01.01"), TRUE); INSERT INTO тауарлар (id, атауы, сипаттамасы, бағасы, бап, акт_уақыты, қолжетімділігі) VALUES (2, "Жастық", "Ақ", 200.00, "PR-75", (ts "2017-01-02 02:02: 02.02"), TRUE); INSERT INTO тауарлар (id, атауы, сипаттамасы, бағасы, бап, акт_уақыты, қолжетімділігі) VALUES (3, "Көрпе", "Төмен", 300.00, "ZR-75", (ts "2017-01-03 03:03: 03.03"), TRUE); INSERT INTO тауарлар (id, атауы, сипаттамасы, бағасы, бап, акт_уақыты, қолжетімділігі) VALUES (4, "Жастық қап", "Сұр", 400.00, "AR-75", (ts "2017-01-04 04:04: 04.04"), FALSE); INSERT INTO тауар (id, атауы, сипаттамасы, бағасы, бап, акт_уақыты, қолжетімділігі) VALUES (5, "Лист", "Silk", 500,00, "BR-75", (ts "2017-01-05 05:05: 05.05"), FALSE);

Сұраулар

1. Қос тырнақша

Ал менде бірінші қарапайым сұрақ: Sql сұрауын қолданатын мысал келтіре аласыз ба? қосдәйексөздер?Иә, жалғызбастылармен, жұптармен емес пе?

Қос тырнақшасы бар мысал

Тауарлардан "Өнім атауы" атауын ТАҢДАҢЫЗ


Мен оны бірінші рет көргенде қатты таң қалдым. Қос тырнақшаны жалғыз тырнақшаға өзгертуге тырыссаңыз, нәтиже толығымен болады әртүрлі!

Бұл нақты даму үшін өте пайдалы үлгі емес сияқты көрінуі мүмкін. Мен үшін олай емес. Қазір мен оны барлық sql-бланктерімде белсенді қолданамын. Түпнұсқа қарапайым, жарты жылдан кейін 40 бағанның sql-сұранысына оралғанда, олардың «біздің» атауы қалай сақталады. Мен SQL-92 туралы айтпағаныма қарамастан, соңғы басылымда қос тырнақшалар туралы айтылған.

2. Псевдо кесте. SQL-92

Терминология тұрғысынан біршама дәл емес, бірақ мәні қарапайым - FROM бөліміндегі ішкі сұраудан алынған кесте. Бұл мақаладағы ең танымал факт

Псевдо кесте

«Лақап ат» ТАҢДАУ, (MOck.huff СОДАН СОҢ «Иә» ӘЛСЕ «Жоқ» АЯҚТАЛҒАН ЖАҒДАЙДА) «Ұшты ма? FROM (ТАҢДАУ атауды бүркеншік ат, қолжетімділік AS huff FROM тауарлар) мазақ

Біздің мысалда мысқыл жалған кесте (кейде виртуалды кесте деп аталады). Әрине, олар шынайы мағынаны бұрмалауға арналмаған. Мысал мынау.

3. Мәліметтер блогының конструкторы. SQL-92

Жақсы аударма немесе аударма таппағаным үшін қорқынышты естіледі. Әдеттегідей, мысалмен түсіндіру оңайырақ:

Деректер блогының конструкторының мысалы

ТАҢДАУ атауы «Тауар атауы», бағасы «Бағасы» FROM (VALUES («Тәпішке», 100.00), («Жастық», 200.00)) AS тауарлар (атауы, бағасы)

Өнім атауы Бағасы
тәпішке 100.00
Жастық 200.00

Бөлімде FROMпайдаланылады кілт сөз ҚҰНДЫЛЫҚТАР, содан кейін жақшадағы деректер, жолдан жол. Қорытындысы: біз кез келген кестеден деректерді таңдамаймыз, оны жай ғана жасаймыз, оны кестеге «атаймыз», бағандарды атаймыз, содан кейін оны өз қалауымыз бойынша пайдаланамыз. Бұл sql сұрауының әртүрлі жағдайларын сынау кезінде, кейбір кестелер үшін деректер болмаған кезде (жергілікті дерекқорда) және кірістіруді жазу кестелер мен кестелердің қосылуына байланысты тым жалқау немесе кейде өте қиын болған кезде өте пайдалы болды. шектеулер.

4. Уақыт, Күн және Уақыт пен Күн

Уақытты, күнді немесе күн мен уақытты көрсету қажеттілігі бар сұрауларда кез келген адам кездескен шығар. Көптеген ДҚБЖ осы түрлермен жұмыс істеу үшін сәйкесінше t, d және ts литералдарын қолдайды. Бірақ мысалмен түсіндіру оңайырақ: d және t литералдары үшін бәрі бірдей.
Оқырманнан жаңылыстыру үшін кешірім сұраймын, бірақ 4-параграфта айтылғанның бәрі SQL тіліне қолданылмайды, бірақ JDBC жүйесіндегі сұрауды алдын ала өңдеу мүмкіндіктеріне қатысты.

5. Бас тарту. SQL-92

Оператор туралы бәріміз білеміз ЖОҚ, бірақ оны предикаттар тобына да, бір бағанға да қолдануға болатынын жиі ұмытып кетеді:

6. Мәліметтер блоктарын салыстыру. SQL-92

Терминология үшін тағы да кешірім сұраймын. Бұл менің сүйікті мысалдарымның бірі.

Деректер блогын салыстыру мысалы

ТАҢДАУ * ҚАЙДА (атауы, бағасы, қолжетімділігі) = («Жастық қап», 400,00, ЖАЛҒАН) -- немесе баламасы ТАҢДАУ * Тауарлардан ҚАЙДА атауы = «Жастық қап» ЖӘНЕ бағасы = 400,00 ЖӘНЕ қолжетімділігі = ЖАЛҒАН

Мысалдан көріп отырғаныңыздай, деректер блоктарын салыстыру элементті элемент бойынша салыстыруға ұқсас. мағынасы_ 1 _блок_1 = мән_ 1 _блок_2, мән_ 2 _блок_1 = мән_ 2 _блок_2, мән_ 3 _блок_1 = мән_ 3 _блок_2қолдану ЖӘНЕолардың арасында.

7. КЕЗ КЕЛГЕН, SOME немесе ALL модификаторларымен салыстыру операторлары. SQL-92

Бұл жерде түсініктеме қажет. Бірақ әдеттегідей, алдымен мысал Бұл нені білдіреді БАРЛЫҚБұл жағдайда? Және бұл таңдау шарты идентификаторлары (біздің жағдайда бұл 4 және 5) мәнінен үлкен болатын жолдармен ғана қанағаттандырылатынын білдіреді. кез келгенішкі сұрауда табылған мәндерден (1, 2 және 3). 4 1-ден үлкен және 2-ден және 3-тен үлкен. 5 ұқсас. ауыстырсақ не болады БАРЛЫҚүстінде КЕЗ КЕЛГЕН?
Нені білдіреді КЕЗ КЕЛГЕНБұл жағдайда? Және бұл таңдау шарты идентификаторлары (біздің жағдайда бұл 2, 3, 4 және 5) мәнінен үлкен болатын жолдармен ғана қанағаттандырылатынын білдіреді. кем дегенде біреуіішкі сұрауда табылған мәндерден (1, 2 және 3). Мен өзім үшін байланыстырдым БАРЛЫҚбастап ЖӘНЕ, бірақ КЕЗ КЕЛГЕНбастап НЕМЕСЕ. КЕЙБІРЖәне КЕЗ КЕЛГЕНбір-біріне ұқсас.

8. Сұраныстармен жұмыс істеу операторлары/сұраныс астында. SQL-92

Операторлардың көмегімен 2 сұранысты бір-бірімен біріктіруге болатыны белгілі ОДАнемесе БАРЛЫҚ ОДАҚ. Бұл жиі қолданылады. Бірақ тағы 2 оператор бар ОСЫЖәне ҚИылысу.

EXCEPT бар мысал

Шын мәнінде, екінші жиынның деректері мәндердің бірінші жинағынан шығарылады.
Іс жүзінде мәндердің бірінші жиынтығы мен екінші жиынның қиылысы бар.
Осымен бітті, назарларыңызға рахмет.

Редакциялық

N1. Сындарлы сын үшін streetflush-ке рахмет. Тіл стандарты деген не және не емес екендігі туралы ақпарат бар мақаланы енгізді.
N2. 4-тармақ түзетілді, ts/d/t SQL тілінің бөлігі емес екендігі түсіндірілді. Назарларыңызға рахмет Мелкиж.

Осыда оқу құралыпайдалануды үйренесіз EXCEPT мәлімдемесі SQL сервері (Transact-SQL) синтаксисі және мысалдары бар.

Сипаттама

SQL Server EXCEPT мәлімдемесі(Transact-SQL) бірінші SELECT операторындағы екінші SELECT операторымен қайтарылмаған барлық жолдарды қайтару үшін пайдаланылады. Әрбір SELECT мәлімдемесі деректер жиынын анықтайды. EXCEPT мәлімдемесі бірінші деректер жиынынан барлық жазбаларды шығарып алады, содан кейін нәтижелерден екінші деректер жиынынан барлық жазбаларды жояды.

Сұраныстан басқа

Түсіндіру: EXCEPT сұрауы сұр көлеңкелі аймақтағы жазбаларды қайтарады. Бұл SELECT 2-де емес, SELECT 1-де бар жазбалар.
EXCEPT сұрауындағы әрбір SELECT мәлімдемесінде деректер түрлері ұқсас нәтижелер жиынындағы өрістердің саны бірдей болуы керек.

Синтаксис

SQL серверіндегі (Transact-SQL) EXCEPT мәлімдемесінің синтаксисі:

Параметрлер немесе дәлелдер

өрнектер - екі ТАҢДАУ мәлімдемесі арасында салыстырғыңыз келетін бағандар немесе есептеулер. Олар ТАҢДАУ мәлімдемелерінің әрқайсысында бірдей өрістер болуы міндетті емес, бірақ сәйкес бағандар ұқсас деректер түрлері болуы керек.
кестелер - жазбаларды алғыңыз келетін кестелер. FROM тармағында тізімделген кем дегенде бір кесте болуы керек.
WHERE шарттары - міндетті емес. Таңдалған жазбалар үшін орындалуы керек шарттар.

Ескерту

  • SELECT операторларының екеуінде де өрнектердің саны бірдей болуы керек.
  • ТАҢДАУ мәлімдемелерінің әрқайсысында сәйкес бағандарда ұқсас деректер түрлері болуы керек.
  • EXCEPT операторы бірінші ТАҢДАУ операторындағы екінші ТАҢДАУ мәлімдемесіне қосылмаған барлық жазбаларды қайтарады.
  • SQL серверіндегі EXCEPT операторы Oracle бағдарламасындағы MINUS операторына баламалы.

Жалғыз өрнектің мысалы

Бірдей деректер түрі бар жалғыз өрісті қайтаратын SQL Server (Transact-SQL) ішіндегі EXCEPT операторының мысалын қарастырайық.
Мысалға:

Transact SQL

ТАҢДАУ өнім_идентификаторын өнімдерден ТАҢДАУ ТАҢДАУ өнім_идентификаторын түгендеу;

product_id ТАҢДАУ

өнімдерден

product_id ТАҢДАУ

ТҮЙМЕРДЕН;

Бұл EXCEPT мәлімдемесі мысалы түгендеу кестесінде емес, өнімдер кестесіндегі барлық product_id мәндерін қайтарады. Бұл өнім_идентификаторы мәні өнімдер кестесінде болса және түгендеу кестесінде де бар болса, product_id мәні EXCEPT сұрауының нәтижелерінде көрсетілмейтінін білдіреді.

Бірнеше өрнектері бар мысал

Әрі қарай, бірнеше бағанды ​​қайтаратын SQL серверіндегі (Transact-SQL) EXCEPT сұрауының мысалын қарастырайық.
Мысалға:

Transact SQL

Бұл мысалда EXCEPT сұрауы контакт_идентификаторы , тегі_аты және аты_аты бар контактілер кестесіндегі жазбаларды қайтарады, олар қызметкерлер кестесіндегі қызметкер_идентификаторы , тегі_аты және аты_жөніне сәйкес келмейді.

Мақала ұнады ма? Достарыңызбен бөлісіңіз!
Бұл мақала пайдалы болды ма?
Иә
Жоқ
Пікіріңізге рахмет!
Бірдеңе дұрыс болмады және сіздің дауысыңыз есептелмеді.
рахмет. Сіздің хабарламаңыз жіберілді
Мәтіннен қате таптыңыз ба?
Оны таңдаңыз, басыңыз Ctrl+Enterжәне біз оны түзетеміз!