Гэр / Хандалт / Асуулгын үр дүнг нэгтгэхийн тулд SQL UNION операторыг хэрхэн ашиглах талаар. Олонлогтой ажиллах оператор UNION Холбоотой асуулга зохион байгуулах

Асуулгын үр дүнг нэгтгэхийн тулд SQL UNION операторыг хэрхэн ашиглах талаар. Олонлогтой ажиллах оператор UNION Холбоотой асуулга зохион байгуулах

Ихэнх SQL асуулгаНэг буюу хэд хэдэн хүснэгтээс өгөгдлийг буцаахад нэг мэдэгдлийг ашигладаг. SQLМөн нэгэн зэрэг олон тусдаа асуулга ажиллуулж, үр дүнг нэг өгөгдлийн багц хэлбэрээр харуулах боломжийг олгоно. Ийм хосолсон асуулгыг ихэвчлэн дууддаг хослолуудэсвэл нарийн төвөгтэй хүсэлтүүд.

1. UNION операторыг ашиглах

Хэл дээрх хүсэлтүүд SQLоператортой хослуулсан НЭГДСЭН. Үүнийг хийхийн тулд та хүсэлт бүрийг зааж өгөх ёстой СОНГОХмөн тэдгээрийн хооронд түлхүүр үг оруулна уу НЭГДСЭН. Ашигласан операторуудын тооны хязгаарлалт НЭГДСЭНнэг ерөнхий хүсэлт биш юм. Өмнөх хэсэгт бид үүнийг тэмдэглэсэн Хандалтүүсгэх боломжгүй бүрэн гадна холболт, одоо бид оператороор дамжуулан үүнд хэрхэн хүрэхийг харах болно НЭГДСЭН.

СОНГОХ *
Sumproduct-аас ЗҮҮН ГАРАХ Худалдагчдыг нийлүүл. Хот = Борлуулагчид.Хот
НЭГДСЭН
СОНГОХ *

Sumproduct-с баруун тийш Sumproduct.City = Sellers.City ДЭЭР худалдагчдыг НЭГДҮҮЛ.

Асуулга нь өөр хүснэгтэд таарч байгаа эсэхээс үл хамааран эхний болон нөгөө хүснэгтийн бүх баганыг хоёуланг нь харуулсан болохыг бид харж байна.

Түүнчлэн олон тохиолдолд оронд нь гэдгийг тэмдэглэх нь зүйтэй НЭГДСЭНБид саналыг ашиглах боломжтой ХААНАолон нөхцөлтэй бөгөөд ижил төстэй үр дүнд хүрнэ. Гэсэн хэдий ч улмаас НЭГДСЭНбичлэгүүд илүү товч бөгөөд ойлгомжтой харагдаж байна. Та хосолсон асуулга бичихдээ тодорхой дүрмийг баримтлах хэрэгтэй.

  • хүсэлт НЭГДСЭНхоёр ба түүнээс дээш мэдэгдлийг агуулсан байх ёстой СОНГОХтүлхүүр үгээр тусгаарлагдсан НЭГДСЭН(жишээ нь хэрэв асуулгад дөрвөн SELECT мэдэгдлийг ашигладаг бол гурван UNION түлхүүр үг байх ёстой)
  • оператор дахь хүсэлт бүр НЭГДСЭНижил багана, илэрхийлэл эсвэл нэгтгэсэн байх ёстой бөгөөд мөн ижил дарааллаар жагсаагдсан байх ёстой
  • баганын өгөгдлийн төрлүүд нийцтэй байх ёстой. Тэд ижил төрлийн байх албагүй, гэхдээ ижил төрлийн байх ёстой DBMSтэдгээрийг хоёрдмол утгагүйгээр хөрвүүлэх боломжтой (жишээлбэл, тэдгээр нь өөр өөр тоон өгөгдлийн төрөл эсвэл өөр өөр огнооны төрлүүд байж болно).

2. Давтагдсан мөрүүдийг идэвхжүүлэх эсвэл идэвхгүй болгох

-аас хүсэлт НЭГДСЭНасуулгын үр дүнгийн багцаас бүх давхардсан мөрүүдийг автоматаар устгадаг (өөрөөр хэлбэл ХААНАнэг мэдэгдэлд олон нөхцөлтэй СОНГОХ). Энэ операторын зан байдал НЭГДСЭНанхдагчаар, гэхдээ бид хүсвэл үүнийг өөрчилж болно. Үүнийг хийхийн тулд бид операторыг ашиглах ёстой НЭГДЭЛоронд нь НЭГДСЭН.

3. Хосолсон асуулгын үр дүнг эрэмбэлэх

Мэдэгдэлийн гүйцэтгэлийн үр дүн СОНГОХөгүүлбэрээр эрэмбэлсэн ЗАХИАЛАХ. -тай асуулга нэгтгэх үед НЭГДСЭНганцхан санал ЗАХИАЛАХашиглаж болох бөгөөд сүүлчийн мэдэгдэлд заавал оруулах ёстой СОНГОХ. Бодит байдал дээр үр дүнгийн нэг хэсгийг нэг дарааллаар, нөгөө хэсгийг нь өөр дарааллаар эрэмбэлэх нь утгагүй юм. Тиймээс хэдэн санал ЗАХИАЛАХөргөдөл гаргах эрхгүй.

SQL UNION оператор нь SELECT үгийг ашиглан олж авсан мэдээллийн сангийн хүснэгтүүдийг нэгтгэх зориулалттай. Үүссэн хүснэгтүүдийг нэгтгэх нөхцөл нь баганын тоо, дараалал, өгөгдлийн төрлүүдийн давхцал юм. ORDER BY нь холболтын үр дүнд ашиглагдах бөгөөд зөвхөн олон хэсэгтэй асуулгын төгсгөлд байрлана. UNION оператор дараах синтакстай байна:

ХҮСНЭГТ_НЭРИЙН НЭГДСЭН БАГАНЫ НЭРИЙГ (1..N) СОНГОХ НОМЫН БАГАНА НЭРИЙГ (1..N) TABLE_NAME-аас СОНГОХ

Энэ бүтцэд нэгтгэж буй асуулгад WHERE заалтын нөхцөл байж болно, үгүй ​​ч байж болно. UNION операторыг ашигласнаар та асуулгыг нэгтгэж, нэг хүснэгтээс болон өөр өөр хүснэгтээс мэдээлэл авах боломжтой.

UNION операторыг ALL гэсэн үггүйгээр ашиглах үед үр дүн нь давхардаагүй, харин ALL гэсэн үгтэй бол давхардсан байна.

SQL UNION мэдэгдлийг ашиглан нэг хүснэгтэд нийт болон хувь хүний ​​утгууд

Нэг асуулгын тусламжтайгаар та хүснэгтээс тус тусад нь баганын утгыг харуулах боломжтой, жишээлбэл, компанийн ажилчдын ажилласан жил, тэдний цалин болон бусад зүйлс. Өөр нэг хүсэлт - ашиглах нэгтгэсэн функцууд- та жишээ нь, хэлтсийн ажилтнууд эсвэл тодорхой албан тушаал хашдаг ажилчдын цалингийн хэмжээ, эсвэл ажлын жилийн дундаж туршлагаа авч болно (ийм асуулгад GROUP BY операторыг ашиглан бүлэглэлтийг ашигладаг).

Гэхдээ бид нэг хүснэгтэд бүх хувийн утгууд болон нийт утгуудын хураангуйг авах шаардлагатай бол яах вэ? Энд SQL UNION оператор аврах ажилд ирдэг бөгөөд түүний тусламжтайгаар хоёр асуулга нэгтгэгддэг. ORDER BY заалтыг ашиглан нэгдлийн үр дүнд захиалга хийх ёстой. Энэ нь яагаад хэрэгтэй вэ гэдгийг жишээнүүдээс илүү сайн ойлгох болно.

Жишээ 1Пүүсийн мэдээллийн сан нь пүүсийн ажилчдын талаарх мэдээллийг агуулсан Ажилтны хүснэгтийг агуулдаг. Энэ нь Цалин (цалин), Ажлын байр (албан тушаал), Жил (үйлчилгээний хугацаа) гэсэн баганатай. Эхний асуулга нь албан тушаалаар эрэмбэлсэн хувь хүний ​​цалинг буцаана:

Нэр, ажлын байр, цалин хөлсийг АЖЛЫН ЗАХИАЛГААС АЖЛЫН БАЙРАНДАА СОНГОХ

НэражилЦалин
Сандерсмгр18357.5
Маренгимгр17506.8
ХувийнБорлуулалт18171.2
эмчБорлуулалт12322.4
хүчин зүйлБорлуулалт16228.7

Хоёр дахь асуулга нь нийт цалинг албан тушаалаар нь буцаана. Бид энэ хүсэлтийг эхнийхтэй нь нэгдэхийн тулд аль хэдийн бэлтгэж байгаа тул нэгдэх нөхцөл нь тэнцүү тооны багана, тэдгээрийн нэр, дараалал, өгөгдлийн төрлүүдийн давхцал гэдгийг санах болно. Тиймээс бид "Z-TOTAL" дурын утгатай нэр баганыг нийт дүнгийн хамт хүснэгтэд оруулна.

"Z-TOTAL"-ийг Нэр, ажил, нийлбэр (цалин)-аар АЖЛЫН БҮЛГЭЭС АЖЛЫН ЦАЛИНГ СОНГОХ

Асуулгын үр дүн дараах хүснэгт болно.

НэражилЦалин
Z-НИЙТмгр35864.3
Z-НИЙТБорлуулалт46722.3

Одоо UNION оператор ашиглан асуулга нэгтгэж, ORDER BY операторыг нэгдлийн үр дүнд хэрэглэнэ. Та ажил (Ажил) ба нэр (Нэр) гэсэн хоёр баганаар бүлэглэх хэрэгтэй бөгөөд ингэснээр нэрний утга нь "Z-TOTAL" гэсэн нийт (нийт) утгатай мөрүүд нь тус тусын утгатай мөрүүдийн доор байрлана. Асуулгын үр дүнг нэгтгэх нь дараах байдалтай байна.

(АЖИЛТНУАС НЭР, АЖИЛ, ЦАЛИН СОНГОХ) ҮЭ-ийн ҮЭ ("Z-НИЙТ"-ийг Нэр, Ажлын байр, НИЙТ (Цалин)-аар АЖИЛТНЫ БҮЛГЭЭС цалинг ажлаар нь сонгон авна уу) Ажлын байр, Нэр

UNION оператортой хийсэн асуулгыг гүйцэтгэсний үр дүн нь дараах хүснэгт байх бөгөөд албан тушаалын бүлэг бүрийн эхний эгнээ тус бүрд энэ албан тушаалд ажиллаж буй ажилчдын нийт цалинг агуулсан болно.

НэражилЦалин
Маренгимгр17506.8
Сандерсмгр18357.5
Z-НИЙТмгр35864.3
эмчБорлуулалт12322.4
хүчин зүйлБорлуулалт16228.7
ХувийнБорлуулалт18171.2
Z-НИЙТБорлуулалт46722.3

UNION ашиглан өөрөө асуулга бичээд дараа нь шийдлийг харна уу

Жишээ 2Өгөгдөл нь жишээ 1-тэй адил боловч даалгавар нь арай илүү төвөгтэй юм. Нэг хүснэгтэд зөвхөн албан тушаалаар нь ангилсан цалин хөлс, нийт цалинг албан тушаалаар нь эрэмбэлээд зогсохгүй бүх ажилчдын нийт цалинг харуулах шаардлагатай.

Жишээ 3Пүүсийн мэдээллийн сан нь пүүсийн ажилчдын талаарх мэдээллийг агуулсан Ажилтны хүснэгтийг агуулдаг. Энэ нь Нэр (овог нэр), Деп (тэнхимийн дугаар), Жил (үйлчилгээний хугацаа) гэсэн баганатай.

Нэрхэлтэсжил
Сандерс20 7
Хувийн20 8
Маренги38 5
эмч20 5
хүчин зүйл38 8

Нэг хүснэгтэд хэлтсийн тоогоор бүлэглэсэн албан хаагчдын ажилласан хугацааны дундаж хугацаа, албан хаагчдын ажилласан хугацааны хувийн утгыг харуул.

SQL UNION оператор ашиглан нэг хүснэгтэд асуулгад нэгдэх бусад тохиолдлууд

Жишээ 4Пүүсийн мэдээллийн сан нь пүүсийн ажилчдын талаарх мэдээллийг агуулсан Ажилтны хүснэгтийг агуулдаг. Энэ нь Цалин (цалин), Ажлын байр (албан тушаал), Жил (үйлчилгээний хугацаа) гэсэн баганатай. 21000-аас дээш цалинтай ажилчдын талаарх мэдээллийг авахын тулд эхний асуулга шаардлагатай.

Асуулгын үр дүн дараах хүснэгт болно.

Одоо бидэнд хоёр асуулгад ашигласан сонголтын шалгуурыг нэгтгэсэн өгөгдөл хэрэгтэй байна. Бид UNION оператор ашиглан асуултуудыг нэгтгэдэг:

UNION оператортой асуулга явуулсны үр дүнд дараах хүснэгт гарч ирнэ.

IDНэр
10 Сандерс
30 Маренги
100 Плотц
140 Фрей
160 Молинаре
240 Даниэлс
260 Жонс

UNION оператортой хийсэн асуулга нь илүү олон багана буцаах боломжтой бөгөөд энэ нь хосолсон асуулгад баганын тоо, тэдгээрийн дараалал, өгөгдлийн төрлүүд таарч байх нь чухал юм.

Эхлээд долоо хоногт 100-аас дээш зар сурталчилгааны ангилал, ангиллын хэсгүүдийн талаарх мэдээллийг авцгаая. Бид дараах асуултыг бичнэ.

Асуулгын үр дүн дараах хүснэгт болно.

Асуулгын үр дүн дараах хүснэгт болно.

Одоо бид эхний болон хоёр дахь асуулгын шалгуурт тохирсон өгөгдлийг олж авахыг хүсч байна. Бид UNION оператор ашиглан асуултуудыг нэгтгэдэг:

Асуулгын үр дүн дараах хүснэгт болно.

SQL UNION операторыг ашиглан хоёр хүснэгт дээрх асуулгын үр дүнг нэгтгэх

Одоогийн байдлаар бид нэг хүснэгтийн үр дүнг нэгтгэсэн UNION асуулгын талаар харлаа. Одоо бид хоёр хүснэгтийн үр дүнг нэгтгэх болно.

Жишээ 6Барилгын материалын агуулахын мэдээллийн сан бий. Энэ нь ханын цаасны өгөгдлийг агуулсан хүснэгттэй. Винил хүснэгтэд винил ханын цаасны тухай, Цаасан хүснэгтэд цаасан ханын цаасны тухай мэдээлэл багтсан болно. Нэг болон нөгөө хүснэгтээс ханын цаасны үнийн талаархи мэдээллийг олж мэдэх шаардлагатай.

Давтагдахгүй винил ханын цаасны үнийн мэдээллийг авахын тулд бид DISTINCT гэсэн үгтэй асуулга үүсгэнэ:

ВИНИЛЭЭС ӨӨРӨӨ ҮНЭ СОНГОХ

Асуулгын үр дүн дараах хүснэгт болно.

Одоо UNION оператортой хосолсон асуулга хийцгээе:

VINIL UNION-аас ялгах үнийг Цааснаас сонгох

Бид БҮГД гэдэг үгийг ашиглаагүй тул 400, 500, 530-д давхардсан утга байхгүй болно. Асуулгын үр дүн дараах хүснэгт болно.

Үнэ
300
320
360
400
430
500
530
610
720
800
850

Жишээ 7Өгөгдлийн сан болон хүснэгтүүд нь өмнөх жишээн дээрхтэй ижил байна.

Та бүх үнийн мэдээлэл, түүний дотор давтагдах мэдээллийг авахыг хүсч байна. UNION оператор ашиглан үр дүнг нэгтгэх асуулга нь өмнөх жишээн дээрх асуулгатай төстэй байх боловч зөвхөн UNION-ын оронд UNION ALL гэж бичнэ:

VINIL UNION-аас ҮНЭ СОНГОХ БҮХНИЙГ ЦААСНЫ ҮНЭ СОНГОХ

Асуулгын үр дүн дараах хүснэгт болно.

Үнэ
300
320
360
400
400
430
500
500
530
530
610
720
800
850

SQL UNION операторыг ашигласнаар та энгийн асуулга болон дэд асуулга агуулсан асуулга (үүрсэн асуулга). Холбогдох жишээг авч үзье.

Жишээ 8"Театр" мэдээллийн сан бий. Түүний "Тоглуулах" хүснэгтэд бүтээлийн тухай мэдээлэл (гарчиг - Нэр баганад), Захиралын хүснэгтэд - захирлуудын тухай мэдээлэл (Fname баганад - нэр, Lname баганад - овог нэр) орно. Захирлын хүснэгтийн үндсэн түлхүүр нь dir_id - захирлын таних дугаар юм. Dir_id нь мөн Play хүснэгтийн гадаад түлхүүр бөгөөд энэ нь Director хүснэгтийн үндсэн түлхүүрийг хэлнэ. Жон Бартон, Тревор Нанн нарын найруулсан тоглолтуудыг үзүүлэх шаардлагатай.

Шийдэл. Хоёр асуултын үр дүнг нэгтгэж үзье - нэг нь найруулагч Жон Бартон, нөгөө нь найруулагч Тревор Нанн нарын үзүүлбэрүүдийг буцаадаг. Мөн Play хүснэгтийн эдгээр хосолсон асуулга бүрийг захирал хүснэгтийн дэд асуулгаар хийсэн бөгөөд энэ нь захирлын нэр, овог нэрээр dir_id-г буцаана. Гаднах асуулга бүр нь дэд асуулгаас dir_id түлхүүрийн утгыг авч, үйлдвэрлэлийн нэрийг буцаана (Нэр):

Харилцааны мэдээллийн сан ба SQL хэл

UNION датасет оператор нь хоёр ба түүнээс дээш асуулгын үр дүнгийн багцыг нэгтгэж, бүх асуулгын бүх мөрийг нэг үр дүнгийн багц болгон харуулдаг.

UNION нь өгөгдлийн багцтай ажиллах операторуудын ангилалд багтдаг (сет оператор). Бусад ийм операторуудад INTERSECT ба EXCEPT (EXCERT ба ХАСАХ нь функциональ эквивалентууд боловч ANSI стандартад EXCEPT нь байдаг) Бүх өгөгдлийн олонлогийн операторууд нь хоёр ба түүнээс дээш асуулгын үр дүнгийн багцыг нэгэн зэрэг удирдахад ашиглагддаг тул нэр нь болсон.

Синтакс S0L2003

UNION операторын асуулгын тоонд техникийн хязгаарлалт байхгүй. Ерөнхий синтакс нь дараах байдалтай байна.

НЭГДСЭН

НЭГДСЭН

Түлхүүр үгс

НЭГДСЭН

Үр дүнгийн багцыг нэг үр дүнгийн багц болгон нэгтгэхийг заана. Давхардсан мөрүүдийг анхдагчаар арилгадаг.

БҮГД

Бүх үр дүнгийн багцаас давхардсан мөрүүдийг мөн нэгтгэнэ.

ОНЦЛОХ

Үр дүнгийн багцаас давхардсан мөрүүдийг устгасан. NULL утгыг агуулсан баганыг давхардсан гэж үзнэ. (Хэрэв ALL болон DISTINCT түлхүүр үгсийг ашиглаагүй бол анхдагч нь DISTINCT байна.)

Ерөнхий дүрмүүд

UNION операторыг ашиглахдаа анхаарах ёстой цорын ганц чухал дүрэм байдаг: баганын дараалал, тоо, өгөгдлийн төрөл нь бүх асуулгад ижил байх ёстой.

Өгөгдлийн төрлүүд нь ижил байх албагүй, гэхдээ тэдгээр нь нийцтэй байх ёстой. Жишээлбэл, CHAR болон VARCHAR төрлүүд нийцдэг. Анхдагч байдлаар, үүссэн zabor нь тохирох төрлүүдийн хамгийн том хэмжээг ашигладаг бөгөөд CHAR(5), CHAR(IO) болон CHAR(12) гэсэн гурван CHAR баганыг нэгтгэсэн асуулгад үр дүн нь CHAR() дотор байх болно. 12) форматтай байх ба баганад жижиг хэмжээтэй байвал нэмэлт зай нэмэгдэнэ.

Хэдийгээр ANSI стандарт нь INTERSECT операторыг бусад багц операторуудаас давуу эрх олгодог боловч олон платформууд эдгээр операторуудыг ижил давуу эрхтэй гэж үздэг. Та хаалт ашиглан операторын давуу байдлыг тодорхой хянах боломжтой. Үгүй бол DBMS нь тэдгээрийг зүүнээс баруун тийш дарааллаар гүйцэтгэх магадлалтай.

DISTINCT заалт нь (платформоос хамааран) гүйцэтгэлийн зардал ихтэй байж болно, учир нь энэ нь ихэвчлэн үр дүнгийн багцаар давхардсан бүртгэлийг арилгахын тулд нэмэлт дамжуулалт шаарддаг. ALL гэсэн заалтыг давхардаагүй (эсвэл давхардуулахыг зөвшөөрсөн тохиолдолд) бүх тохиолдолд гүйцэтгэлийг сайжруулахад ашиглаж болно.

ANSI стандартын дагуу асуулгад зөвхөн нэг ORDER BY заалтыг ашиглаж болно. Үүнийг сүүлчийн SELECT мэдэгдлийн төгсгөлд тавь. Багана, хүснэгтийг зааж өгөхдөө тодорхой бус байдлаас зайлсхийхийн тулд бүх хүснэгтийн бүх баганад тохирох нэр өгөхөө мартуузай. Гэсэн хэдий ч SELECT ... UNION асуулгад баганын нэрийг зааж өгөхдөө зөвхөн эхний асуулгын алиа нэрийг ашиглана. Жишээлбэл:

au_lname AS овог нэр, au_fname AS овог нэр ЗОХИОГЧДЫН НЭГДСЭН НЭРИЙГ СОНГОХ emp_lname AS овог нэр, emp_fname AS овог нэр, ажилчдын овог нэрээр ЗАХИАЛАХ;

Түүнчлэн, UNION операторын асуулгад тохирох өгөгдлийн төрлүүдтэй багануудыг агуулж болох тул кодын үйлдэл нь платформд, ялангуяа баганын өгөгдлийн төрлийн уртаас хамаарч өөр өөр байж болно. Жишээлбэл, хэрэв эхний асуулгын au_fname багана нь хоёр дахь асуулгын emplname баганаас мэдэгдэхүйц урт байвал өөр өөр платформууд аль уртыг ашиглахыг тодорхойлох өөр өөр дүрэмтэй байж болно. Гэсэн хэдий ч ерөнхийдөө платформууд үр дүнгийн багцад илүү урт (ба хязгаарлагдмал) өгөгдлийн төрлийг сонгодог.

Хэрэв өөр өөр хүснэгтийн баганууд өөр өөр нэртэй бол RDBMS бүр баганын нэрийг тодорхойлох өөрийн дүрмийг хэрэглэж болно. Дүрмээр бол эхний асуулгын нэрсийг ашигладаг.

DB2

DB2 платформ нь ANSI UNION болон UNION ALL түлхүүр үгс болон VALUES заалтыг дэмждэг.

[, (илэрхийлэл-!, илэрхийлэл2, …)] […] […]

Хосолсон үр дүнгийн багц дахь бүртгэлд гараар тодорхойлсон утгуудын нэг буюу хэд хэдэн багцыг зааж өгөх боломжийг танд олгоно. Эдгээр утга бүр нь UNION операторын асуулгатай яг ижил тооны багана агуулсан байх ёстой. Үр дүнгийн багц дахь утгын мөрүүдийг таслалаар тусгаарлана.

Хэдийгээр UNION DISTINCT заалтыг дэмждэггүй ч функциональ дүйцэхүйц нь UNION заалт юм. CORRESPONDING заалтыг дэмждэггүй.

VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK гэх мэт өгөгдлийн төрлүүд болон бүтцийн төрлүүдийг UNION түлхүүр үгээр ашиглах боломжгүй (гэхдээ тэдгээрийг UNION ALL заалттай хамт ашиглаж болно).

Хэрэв бүх хүснэгт ижил баганын нэрийг ашигладаг бол үр дүнгийн багц энэ нэрийг ашиглана. Хэрэв баганын нэр өөр байвал DB2 нь шинэ баганын нэрийг үүсгэдэг. Үүний дараа энэ баганыг ORDER BY заалт эсвэл FOR UPDATE заалтад ашиглах боломжгүй.

Хэрэв нэг асуулгад олон өгөгдлийн олонлогийн оператор ашиглагдаж байгаа бол эхлээд хаалтанд орсон операторуудыг гүйцэтгэнэ. Үүний дараа мэдэгдлүүдийг зүүнээс баруун тийш дарааллаар гүйцэтгэнэ. Гэхдээ бүх INTERSECT үйлдлүүд UNION эсвэл EXCERT үйлдлүүдийн өмнө хийгддэг. Жишээлбэл:

"E%" ШИГ ажилтнаас empno СОНГОХ НИЙТЛЭГИЙН ҮНЭ ТӨЛБӨРИЙГ "E%" ШИГ БАЙНА.

Энэ жишээнд бид "E"-ээс эхэлсэн нэр бүхий аль ч хэлтэст байгаа ажилтны хүснэгтээс бүх ажилтны ID-г, мөн IF1000, "IF2000" төслүүдэд ажилладаг emp_act нягтлан бодох бүртгэлийн хүснэгтээс бүх ажилчдын ID-г авдаг. , болон " AD3110". Үүнээс гадна ажилтны ID "AA000T, "AB0002", "AC00031.

MySQL

Дэмжихгүй байна.

Oracle

Oracle платформ нь ANSI SQL стандартын UNION болон UNION ALL түлхүүр үгсийг дэмждэг. Синтакс нь дараах байдалтай байна.

Oracle нь CORRESPONDING заалтыг дэмждэггүй. UNION DISTINCT заалт нь тийм биш. дэмжигдсэн боловч функциональ дүйцэхүйц нь UNION заалт юм. Oracle платформ нь дараах тохиолдолд UNION ALL болон UNION заалтуудыг ашиглахыг дэмждэггүй.

Хэрэв мэдэгдлийн эхний асуулгад зүйлийн жагсаалтад ямар нэг илэрхийлэл байгаа бол AS заалтыг ашиглан тухайн баганыг нэрлэнэ үү. Мөн мэдэгдлийн зөвхөн сүүлчийн асуулгад ORDER BY заалт агуулагдаж болно. Жишээлбэл, та дараах асуулга ашиглан дэлгүүрийн бүх өвөрмөц ID-г (store_id) давхардалгүйгээр авах боломжтой.

SELECT stor_id FROM дэлгүүрүүд UNION SELECT stor_id FROM борлуулалт;

PostgreSQL

PostgreSQL платформ нь стандарт ANSI синтакс дахь UNION болон UNION ALL түлхүүр үгсийг дэмждэг.

SELECT 2 UNION мэдэгдэл

PostgreSQL платформ нь FOR UPDATE заалттай асуулгад UNION болон UNION ALL заалтуудыг ашиглахыг дэмждэггүй. PostgreSQL нь CORRESPONDING заалтыг дэмждэггүй. UNION DISTINCT заалтыг дэмждэггүй, функциональ дүйцэхүйц нь UNION заалт юм.

Мэдэгдэл дэх эхний асуулга нь ORDER BY эсвэл LIMIT заалтуудыг агуулж болохгүй. UNION болон UNION ALL заалттай дараагийн асуулгад эдгээр заалтууд багтаж болох боловч ийм асуултуудыг хаалтанд оруулах ёстой. Үгүй бол баруун талд байгаа ORDER BY эсвэл LIMIT заалт бүх үйл ажиллагаанд хамаарна.

a.au_lname-г зохиогчдоос СОНГОХ a.au_lnanie "P%" ШИГ БАЙНА UNI0N e.lname-г ажилтнаас СОНГОХ ГЭДЭГ e.lname "P%" ШИГ;

SQL сервер

SQL Server платформ нь стандарт ANSI синтакс дахь UNION болон UNION ALL түлхүүр үгсийг дэмждэг.

SELECT 1 UNION мэдэгдэл

SELECT 2 UNION мэдэгдэл

SQL Server нь CORRESPONDING заалтыг дэмждэггүй. UNION DISTINCT заалтыг дэмждэггүй, гэхдээ UNION заалт нь функциональ адил юм.

UNION болон UNION ALL заалтуудын хувьд та SELECT...INTO хэллэгийг ашиглаж болох боловч INTO түлхүүр үг нь union операторын эхний асуулгад байх ёстой. SELECT TOP, GROUP BY...WITH CUBE гэх мэт тусгай түлхүүр үгсийг бүх нэгдэх асуулгад ашиглаж болно. Гэсэн хэдий ч эдгээр заалтуудыг нэгтгэх бүх хүсэлтэд оруулахаа мартуузай. Хэрэв та нэг асуулгад SELECT TOP эсвэл GROUP BY... WITH CUBE заалтуудыг ашиглавал үйлдэл амжилтгүй болно.

Нэгдэл дэх бүх асуулга ижил тооны багана агуулсан байх ёстой. Баганын өгөгдлийн төрлүүд нь ижил байх шаардлагагүй, гэхдээ тэдгээр нь бие биендээ шууд дамжуулагдах боломжтой байх ёстой. Жишээлбэл, CHAR болон VARCHAR багануудыг хоёуланг нь зөвшөөрнө. Өгөгдөл гаргахдаа SQL Server нь үр дүнгийн багц баганын өгөгдлийн төрлийн хэмжээг тодорхойлохдоо хамгийн том баганын хэмжээг ашигладаг. Иймд CHAR(5) болон CHAR(IO) баганыг хоёуланг нь SELECT... UNION мэдэгдэлд ашигласан бол CHAR(IO) баганад хоёр багана харагдана. Тоон өгөгдлийн төрлүүдийг дамжуулж, хамгийн өндөр нарийвчлалтай төрлөөр харуулдаг.

Жишээлбэл, дараах асуулга нь GROUP BY...WITH CUBE заалтыг ашигладаг бие даасан хоёр асуулгын үр дүнг нэгтгэдэг.

Би аль хэдийн тухай бичсэн. Мөн тэнд нэг хүснэгтийн гаралт нь нөгөө хүснэгтийн агуулгаас хамаарна. Гэхдээ энэ нь нэг хүснэгтийн гаралтыг нөгөө хүснэгтээс бүрэн хараат бус байх шаардлагатай үед тохиолддог. Таны хүссэн зүйл бол зүгээр л нэг асуулгад олон хүснэгтээс бичлэг авах, цаашид байхгүй. Мөн үүний төлөө SQL UNION түлхүүр үгэнд ашиглагддаг.

Үүнийг чамтай хамт олъё UNION ашиглан SQL асуулга:

`нэвтрэх`, `хэмжээ`-г `ажил олгогчдын` ҮЭ-ИЙН НЭГДСЭН СОНГОХ `нэвтрэх`, `хэмжээ`-г `ажилтнуудаас` СОНГОХ;

Энэ асуулга нь тодорхой сайтын бүх ажил олгогч, ажилчдын дансанд нэвтрэх нэр, дүнг буцаана. Өөрөөр хэлбэл, өгөгдөл нь өөр өөр хүснэгтэд байсан боловч тэдгээрийн ижил төстэй байдал нь тэдгээрийг шууд харуулах боломжийг олгодог. Эндээс, дашрамд хэлэхэд, ашиглах дүрэм гарч ирдэг UNION хүсэлт: Асуулгын бүх хэсэгт талбаруудын тоо, дараалал таарч байх ёстой.

Ийм UNION-хэсэгмаш их байж болох ч хамгийн чухал нь Сүүлийн UNION-ын дараа та цэг таслал тавих ёстой.

Өөр нэг сайн шинж чанар НЭГДСЭНдавтагдахгүй байх явдал юм. Жишээлбэл, хэрэв ижил хүн ажилчдын болон ажил олгогчдын дунд байгаа бол мэдээжийн хэрэг дансанд ижил хэмжээний мөнгө байгаа бол түүвэрт тэр байх болно. 2 удаа биш зөвхөн 1ихэвчлэн шаардлагатай байдаг. Хэрэв танд дахин давтах шаардлагатай хэвээр байгаа бол тэнд байна НЭГДЭЛ:

`нэвтрэх`, `хэмжээ`-г `ажил олгогчдын` НЭВЛЭГЭЭС БҮХ СОНГОХ `нэвтрэх`, `хэмжээ`-г `ажилтан`-аас сонгох;

Үүн шиг нэлээд энгийн UNION операторыг SQL асуулгад ашигладаг, энэ нь олон хүснэгтээс нэг төрлийн өгөгдлийг нэг дор харуулах процедурыг хялбарчлах бөгөөд энэ нь эргээд гүйцэтгэлд маш сайн нөлөө үзүүлэх болно.

Хичээл нь нэгдэл, огтлолцол, асуулгын зөрүүний үйлдлийг ашиглах сэдвийг авч үзэх болно. Хэрхэн ашиглах тухай жишээ SQL query Union, Exists, түүнчлэн ЗАРИМ, АЛЬ болон Бүх түлхүүр үгсийн хэрэглээ. Мөрийн функцуудыг авч үзсэн


Олонлог дээр та нэгдэл, ялгаа, декартын бүтээгдэхүүний үйлдлүүдийг хийж болно. Үүнтэй ижил үйлдлүүдийг sql асуулгад ашиглаж болно (асуулгатай үйлдэл хийх).

Функцийн үг нь олон асуултыг нэгтгэхэд хэрэглэгддэг НЭГДСЭН.
Синтакс:

< запрос 1 >НЭГДЭЛ [БҮГД]< запрос 2 >

<запрос 1>НЭГДСЭН<запрос 2>

SQL Union query нь асуулга бүрийн гаралтын мөрүүдийг нэг үр дүнгийн багц болгон нэгтгэхэд ашиглагддаг.

Ашигласан бол ALL параметр, дараа нь бүх давхардсан гаралтын мөрүүд хадгалагдана. Хэрэв параметр байхгүй бол үр дүнгийн багцад зөвхөн өвөрмөц мөрүүд үлдэнэ.

Ямар ч тооны асуулга хамтад нь нэгтгэж болно.

UNION операторыг ашиглахын тулд хэд хэдэн нөхцлийг хангасан байх шаардлагатай.

  1. асуулга бүрийн гаралтын баганын тоо ижил байх ёстой;
  2. асуулга бүрийн гаралтын багана нь өгөгдлийн төрлөөр (тэдгээрийн тэргүүлэх ач холбогдлын дарааллаар) бие биетэйгээ харьцуулах боломжтой байх ёстой;
  3. үүссэн багц нь эхний асуулгад заасан баганын нэрийг ашигладаг;
  4. ORDER BY-г зөвхөн олон хэсэгтэй асуулгын төгсгөлд ашиглах боломжтой, учир нь энэ нь холболтын үр дүнд хамаарна.

Жишээ:Компьютер, зөөврийн компьютерын үнэ, тэдгээрийн дугаарыг харуулах (жишээлбэл, нэг асуулгад хоёр өөр хүснэгтээс буулгах)


✍ Шийдэл:
1 2 3 4 5 6 Компьютерээс `Дугаар` , `Үнэ` СОНГОХ UNION `Дугаар` , `Үнэ`-г зөөврийн компьютерээс `Үнэ`-ээр ЗАХИАЛАХ

Компьютерээс `Дугаар` , `Үнэ` СОНГОХ UNION `Дугаар` , `Үнэ`-г зөөврийн компьютерээс `Үнэ`-ээр ЗАХИАЛАХ

Үр дүн:

Дотоод холболттой илүү төвөгтэй жишээг авч үзье:

Жишээ:Компьютер, зөөврийн компьютерын бүтээгдэхүүний төрөл, тоо, үнийг олох


✍ Шийдэл:
1 2 3 4 5 6 7 8 Бүтээгдэхүүнийг СОНГОХ. `Төрөл`, pc. `Дугаар` , `Үнэ` компьютер ДЭЭР НЭГДСЭН бүтээгдэхүүн. `Тоо` = бүтээгдэхүүн. `Дугаар` UNION SELECT бүтээгдэхүүн. `Төрөл`, дэвтэр. `Дугаар` , `Үнэ` FROM notebook INNER JOIN бүтээгдэхүүн ON notebook. `Тоо` = бүтээгдэхүүн. `Дугаар`` `Үнэ`-ээр ЗАХИАЛАХ

Бүтээгдэхүүнийг СОНГОХ.`Төрөл` , компьютер.`Дугаар` , `Үнэ` компьютер ДЭЭР НЭГДСЭН бүтээгдэхүүн.`Дугаар` = бүтээгдэхүүн.`Дугаар` UNION СОНГОХ бүтээгдэхүүн.`Төрөл` , дэвтэр.`Дугаар` , `Үнэ` ЗАХИАЛГАА ЗАХИАЛАХ НЭТБҮТРИЙН ДОТООД НИЙТЛЭГДЭХҮҮНИЙ НЭТБҮҮР ДЭЭР.`Дугаар` = бүтээгдэхүүн.`Дугаар` `Үнэ`-ээр ЗАХИАЛАХ

Үр дүн:

SQL холбоо 1.Бүх зөөврийн компьютер, принтерийн үйлдвэрлэгч, эд ангийн дугаар, үнийг олоорой

SQL холбоо 2.ОХУ-ын үйлдвэрлэгчийн үйлдвэрлэсэн бүх бүтээгдэхүүний тоо, үнийг олох

SQL-ийн оршихуйн таамаглал EXISTS

SQL хэл нь огтлолцол болон асуулгын зөрүүний үйлдлүүдийг гүйцэтгэх боломжуудтай - INTERSECT заалт (уулзвар) ба EXCEPT заалт (ялгаа). Эдгээр заалтууд нь UNION хэрхэн ажилладагтай адилхан ажилладаг: зөвхөн хоёр асуулгад байгаа мөрүүд - INTERSECT , эсвэл зөвхөн эхний асуулгын хоёр дахь хэсэгт байхгүй мөрүүд - БУСАД үр дүнгийн багцад орно. Гэвч асуудал нь олон DBMS эдгээр саналыг дэмжихгүй байгаа явдал юм. Гэхдээ гарах гарц бий - EXISTS предикатыг ашиглах.

Хэрэв дэд асуулга хэдэн ч мөр буцаавал EXISTS предикат ҮНЭН, эс бөгөөс EXISTS нь ХУДАЛ болно. Мөн эсрэгээр үйлчилдэг NOT EXISTS предикат байдаг.

Ихэвчлэн EXISTS нь хамааралтай дэд асуулгад (IN гэх мэт) ашиглагддаг.

EXISTS(хүснэгтийн дэд асуулга)

Жишээ:Зөөврийн компьютер үйлдвэрлэдэг компьютер үйлдвэрлэгчдийг олоорой


✍ Шийдэл:

БҮТЭЭГДЭХҮҮНИЙГ pc_product ХААНА БАЙЖ БАЙНА Төрөл = "Компьютер" болон ОРЖ БАЙНА (Үйлдвэрлэгчийг ХААНА Төрөл = "Тэмдэглэлийн дэвтэр" болон Үйлдвэрлэгч = pc_product.Manufacturer-аас сонгоно уу)

Үр дүн:

Принтер үйлдвэрлэдэггүй компьютер үйлдвэрлэгчдийг олоорой

Түлхүүр үгс SQL SOME | АЛЬ Ч, БҮХ

SOME болон ANY гэсэн түлхүүр үгс нь ижил утгатай тул аль нэгийг нь асуулгад ашиглаж болно. Ийм асуулгын үр дүн нь утгуудын нэг багана байх болно.

Синтакс:

< выражение>< оператор сравнения>ЗАРИМ | АЛЬ Ч(< подзапрос> )

<выражение><оператор сравнения>ЗАРИМ | АЛЬ Ч(<подзапрос>)

Хэрэв дэд асуулгаас авсан X-ийн аль нэг утгын хувьд " " үйлдлийн үр дүн ҮНЭНийг буцаавал ANY предикат нь ҮНЭНтэй тэнцүү байна.

Жишээ:Борлуулалтад байгаа эд ангиудын дугааргүй компьютер үйлдвэрлэгчдийг хайж олоорой (жишээ нь, компьютерийн хүснэгтэд байхгүй)


✍ Шийдэл:

Хүснэгтийн анхны өгөгдөл:

Үр дүн:

Жишээн дээр Тоо = ANY(PC FROM SELECT Number) гэсэн предикат нь ҮНЭН гэж буцаана. Хэрэв үндсэн асуулгын Тоо нь pc хүснэгтийн Тоонуудын жагсаалтаас олдвол (дэд асуулга буцаана). Мөн NOT-ийг ашигладаггүй. Үр дүнгийн багц нь нэг баганаас бүрдэнэ - Үйлдвэрлэгч. Нэг үйлдвэрлэгчийг олон удаа харуулахгүйн тулд DISTINCT түлхүүр үгийг нэвтрүүлсэн.
Одоо ALL түлхүүр үгийн хэрэглээг авч үзье:

Жишээ:Ямар ч компьютерээс илүү үнэтэй зөөврийн компьютеруудын тоо, үнийг олоорой


✍ Шийдэл:

Чухал:Ерөнхийдөө ANY-тай асуулга нь олон тооны утгыг буцаадаг гэдгийг тэмдэглэх нь зүйтэй. Тиймээс WHERE заалтын EXISTS , IN , ALL , болон ANY операторуудгүйгээр логик (логийн) утгыг өгөх дэд асуулга ашиглах нь асуулгын ажиллах үеийн алдааг үүсгэж болзошгүй.


Жишээ:Зөөврийн компьютерын доод үнээс өндөр үнэтэй компьютеруудын тоо, үнийг олоорой


✍ Шийдэл:


Үнэ скаляр илэрхийлэл нь нэг утгыг буцаадаг дэд асуулгатай харьцуулагддаг тул энэ асуулга зөв юм

SQL мөрийн функцууд

LEFT функц нь мөрийн зүүн талаас хоёр дахь аргументаар заасан тэмдэгтүүдийн тоог хасдаг.

ЗҮҮН (<строка>,<число>)

RIGHT функц нь тэмдэгт мөрийн баруун талд заасан тооны тэмдэгтийг буцаана:

ЗӨВ(<строка>,<число>)

Жишээ:Бүх үйлдвэрлэгчдийн нэрний эхний үсгийг задлах


✍ Шийдэл:

`бүтээгдэхүүн`-ээс DISTINCT LEFT(`Үйлдвэрлэгч` , 1) СОНГОХ

Үр дүн:

Жишээ:Ижил үсгээр эхэлж, төгссөн үйлдвэрлэгчийн нэрийг хэвлэ


✍ Шийдэл:

SQL Replace функц

Синтакс:

`Багш`-аас `нэр` , ОРУУЛАХ(`нэр` , "a", "aa") СОНГОХ