Гэр / Нийгмийн сүлжээ / INTERSECT мэдээллийн багцын оператор. SQL-д нийлмэл SQL асуулгын мөр функцүүдийг гүйцэтгэх

INTERSECT мэдээллийн багцын оператор. SQL-д нийлмэл SQL асуулгын мөр функцүүдийг гүйцэтгэх

INTERSECT мэдэгдэл нь нэг буюу хэд хэдэн асуулгын үр дүнгийн багцаас ижил мөрүүдийг татаж авдаг. Зарим талаараа INTERSECT оператор нь INNER JOIN-той тун төстэй.

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

Синтакс SQL2003

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

УУЛЗАХ

] УУЛЗАХ

Түлхүүр үгс

Бүх үр дүнгийн багцаас давхардсан мөрүүдийг оруулсан болно.

ОНЦЛОХ

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

ХАРИЛЦАХ

Хоёр асуулгад орлуулагч тэмдэгт (*) ашигласан ч гэсэн хоёр асуулгад ижил нэртэй багануудыг л буцаана гэдгийг заана.

Асуулгад тохирох нэртэй бусад баганыг олсон байсан ч зөвхөн нэрлэсэн багануудыг буцаана гэдгийг заана. Энэ заалтыг CORRESPONDING түлхүүр үгтэй хамт ашиглах ёстой.

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

INTERSECT оператортой ажиллахдаа нэг л чухал дүрмийг санах хэрэгтэй.

Бүх асуулга дахь баганын дараалал, тоо ижил байх ёстой. Харгалзах баганын өгөгдлийн төрлүүд бас нийцтэй байх ёстой.

Жишээлбэл, CHAR болон VARCHAR төрлүүд нийцдэг. Өгөгдмөл байдлаар, багана тус бүрт тогтоосон үр дүн нь тухайн байрлал бүрийн хамгийн том төрөлд тохирох хэмжээг ашиглана.

Аль ч платформ нь ХАРИЛЦАХ заалтыг дэмждэггүй.

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

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

INTERSECT операторыг дэмждэггүй платформ дээр та үүнийг FULL JOIN дэд асуулгаар сольж болно.

a.au_lname-г "овог нэр"-ээр, a.au_fname-ийг зохиогчдоос "овог нэр"-ээр СОНГОХ БОЛОМЖТОЙ СОНГОХ e.emp_lname-ийг "овог нэр"-ээр сонгох, e.emp_fname-ийг ажилчдаас "овог, нэр"-ээр ЗАХИАЛАХ;

Янз бүрийн INTERSECT мэдэгдлүүд дэх баганын өгөгдлийн төрлүүд нийцтэй байж болох тул өөр өөр RDBMS платформууд тулгарч болно. янз бүрийн хувилбаруудянз бүрийн урттай баганатай ажиллах. Жишээлбэл, өмнөх жишээний эхний асуулгын aujname багана нь хоёр дахь асуулгын empjname баганаас хамаагүй урт байвал өөр өөр платформууд эцсийн үр дүнгийн уртыг тодорхойлох өөр өөр дүрмүүдтэй байж болно. Гэхдээ ерөнхийдөө платформууд үр дүндээ илүү урт (ба бага хязгаарлагдмал) хэмжээг сонгох болно.

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

DB2

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

(заавар._SELECT_7 | VALUES (илэрхийлэл7 [, ...])) INTERSECT

] (заавар_SCJ_2 | VALUES (илэрхийлэл2 [, ...])) INTERSECT

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

Түүнчлэн LONG VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK өгөгдлийн төрлүүд, бүтцийн төрлүүд нь INTERSECT өгүүлбэрт ашиглагддаггүй, харин INTERSECT ALL өгүүлбэрт ашиглагдаж болно.

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

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

Ажилтнаас empno-г СОНГОХ ХААНА "E%" УУЛЗАХ ШИГ (SENG empno FROM emp_act WHERE projno IN ("IF1000", "IF2000", "AD3110") UNION VALUES ("AA0001"), ("AB0002"), ("AC000) "))

Дээрх жишээнд нэр нь "Е" үсгээр эхэлсэн хэлтсийн бүх ажилтны ажилтны үнэмлэхийг ажилчдын хүснэгтээс авч байна. Гэсэн хэдий ч тодорхойлогчийг зөвхөн emp_act нэртэй ажилтны дансны хүснэгтэд байгаа бөгөөд IF1000, IF200" болон AD3110 төслүүдэд оролцсон тохиолдолд л олж авна.

Тэр нь сургалтын гарын авлагахэрхэн ашиглах талаар сурах болно SQL Сервер дэх мэдэгдлээс БУСАД(Transact-SQL) синтакс болон жишээнүүдийн хамт.

Тодорхойлолт

SQL Server мэдэгдлээс бусад(Transact-SQL) нь эхний SELECT мэдэгдлийн хоёр дахь SELECT мэдэгдлээр буцаж ирээгүй бүх мөрийг буцаахад хэрэглэгддэг. SELECT мэдэгдэл бүр өгөгдлийн багцыг тодорхойлно. EXCEPT мэдэгдэл нь эхний өгөгдлийн багцаас бүх бүртгэлийг задалж, дараа нь үр дүнгээс хоёр дахь өгөгдлийн багцаас бүх бүртгэлийг устгана.

Хүсэлтээс бусад

Тайлбар: EXCEPT асуулга нь саарал өнгийн сүүдэрт байгаа оруулгуудыг буцаана. Эдгээр нь SELECT 2-т биш SELECT 1-д байгаа бичлэгүүд юм.
EXCEPT асуулгын SELECT мэдэгдэл бүр ижил төрлийн өгөгдлийн төрлүүдтэй үр дүнгийн багц дахь ижил тооны талбартай байх ёстой.

Синтакс

SQL Server (Transact-SQL) дээрх EXCEPT мэдэгдлийн синтакс нь:

Сонголтууд эсвэл аргументууд

илэрхийлэл нь хоёр SELECT мэдэгдлийн хооронд харьцуулахыг хүссэн багана эсвэл тооцоолол юм. Тэдгээр нь SELECT мэдэгдэл бүрийн ижил талбар байх албагүй, харин харгалзах баганууд нь ижил төрлийн өгөгдлийн төрөлтэй байх ёстой.
хүснэгтүүд - бүртгэл авахыг хүссэн хүснэгтүүд. FROM заалтад дор хаяж нэг хүснэгт байх ёстой.
WHERE нөхцөл - сонголттой. Сонгосон бичлэгийн хувьд заавал биелүүлэх ёстой нөхцөлүүд.

Анхаарна уу

  • SELECT мэдэгдэл хоёулаа ижил тооны илэрхийлэлтэй байх ёстой.
  • SELECT мэдэгдэл бүрийн харгалзах баганууд ижил төрлийн өгөгдлийн төрлүүдтэй байх ёстой.
  • EXCEPT мэдэгдэл нь эхнийхээс бүх бичлэгийг буцаана SELECT мэдэгдэл, энэ нь хоёр дахь SELECT мэдэгдэлд ороогүй болно.
  • SQL Server дээрх EXCEPT мэдэгдэл нь Oracle дээрх MINUS мэдэгдэлтэй тэнцүү байна.

Ганц илэрхийллийн жишээ

SQL Server (Transact-SQL) дээрх ижил төрлийн өгөгдлийн нэг талбарыг буцаадаг EXCEPT мэдэгдлийн жишээг харцгаая.
Жишээлбэл:

Transact SQL

Бараа материалаас SELECT product_id-с бусад бүтээгдэхүүнээс бүтээгдэхүүний_id-г СОНГОХ;

Бүтээгдэхүүний ID-г сонго

Бүтээгдэхүүнээс

Бүтээгдэхүүний ID-г сонго

Бараа материалаас;

Энэхүү EXCEPT мэдэгдлийн жишээ нь бараа материалын хүснэгтэд бус бүтээгдэхүүний хүснэгтэд байгаа бүх product_id утгыг буцаана. Энэ нь хэрэв бүтээгдэхүүний_id утга нь бүтээгдэхүүний хүснэгтэд байгаа бөгөөд бараа материалын хүснэгтэд мөн байгаа бол бүтээгдэхүүний_id утга нь EXCEPT асуулгын үр дүнд харагдахгүй гэсэн үг юм.

Олон илэрхийлэлтэй жишээ

Дараа нь SQL Server (Transact-SQL) дээрх нэгээс олон багана буцаадаг EXCEPT асуулгын жишээг харцгаая.
Жишээлбэл:

Transact SQL

Энэ жишээн дэх EXCEPT асуулга нь харилцагчдын хүснэгт дэх contact_id , овог_нэр , овог_нэр гэсэн нэртэй бүртгэлүүдийг буцаадаг бөгөөд энэ нь ажилчдын хүснэгт дэх ажилтны_id , овог_нэр , нэрний утгатай таарахгүй байна.

SQL нь хүснэгтүүдийг нэгтгэх хоёр аргыг өгдөг:
  • SELECT мэдэгдлийн FROM зүйлд нэгдэх хүснэгтүүдийг (дэд асуулга оруулаад) зааж өгснөөр. Эхлээд хүснэгтүүдийг нэгтгэж, зөвхөн дараа нь үүссэн багцад GROUP BY заалтаар тодорхойлсон WHERE заалт, нэгтгэх, өгөгдөл эрэмбэлэх гэх мэт нөхцөлүүдийг хэрэглэнэ;
  • SELECT мэдэгдлийг боловсруулснаар бий болсон үр дүнгийн багцуудын нэгдлийг тодорхойлох. Энэ тохиолдолд хоёр SELECT мэдэгдлийг хэллэгээр холбоно НЭГДСЭН, УУЛЗАХ, БУСАДэсвэл ХАРИЛЦАХ .

НЭГДСЭН

Үг хэллэг НЭГДСЭНДараах дүрмийн дагуу хоёр асуулгын үр дүнг нэгтгэнэ.

Стандарт нь үр дүнгийн багц дахь мөрүүдийг эрэмбэлэхэд ямар нэгэн хязгаарлалт тавьдаггүй. Тиймээс зарим DBMS нь эхлээд эхний асуулгын үр дүнг, дараа нь хоёр дахь асуулгын үр дүнг харуулдаг. Oracle DBMS нь индекс үүсгээгүй байсан ч гэсэн эхний заасан баганаар бүртгэлийг автоматаар эрэмбэлдэг.

Шаардлагатай эрэмбэлэх дарааллыг тодорхой зааж өгөхийн тулд ORDER BY заалтыг ашиглана уу. Энэ тохиолдолд та баганын нэр болон түүний дугаарыг хоёуланг нь ашиглаж болно (Зураг 4.3).


Цагаан будаа. 4.3.

Үг хэллэг НЭГДСЭН ALL нь дараах тохиолдлуудыг эс тооцвол UNION заалттай ижил аргаар хоёр дэд асуулгын нэгдлийг гүйцэтгэдэг.

  • үүсгэсэн үр дүнгийн багцаас тохирох мөрүүдийг хасаагүй;
  • нэгтгэсэн асуулга нь дараалалгүйгээр үр дүнгийн багцад гарч ирнэ.

Хоёроос дээш асуултыг нэгтгэх үед хаалт ашиглан нэгдэх үйлдлийг гүйцэтгэх дарааллыг өөрчилж болно (Зураг 4.4).


Цагаан будаа. 4.4.

INTERSECT нэгдэх

Үг хэллэг УУЛЗАХнь нэгтгэж буй үр дүнгийн багц бүрт байгаа мөрүүдийг л сонгох боломжийг танд олгоно. Зураг дээр. 4.5 асуулгад огтлолцсон олонлогуудыг нэгтгэх жишээг үзүүлэв.


Цагаан будаа. 4.5.

Холбооноос бусад

Үг хэллэг БУСАДнь зөвхөн нэгтгэх эхний үр дүнгийн багцад байгаа мөрүүдийг сонгох боломжийг олгодог боловч хоёр дахь үр дүнгийн багцад байхгүй мөрүүдийг сонгох боломжийг танд олгоно.

Үг хэллэг УУЛЗАХболон БУСАДзөвхөн SQL-92 нийцлийн бүрэн түвшинд дэмжигдэх ёстой. Тиймээс, хэллэгийн оронд зарим DBMS

Аливаа технологи, програмчлалын хэл, стандарттай байнга тааралдвал тэдгээрийн чадавхийн тодорхой дүр зураг, тэдгээрийн ашиглалтын хил хязгаар үүсдэг. Мэдлэгийн хатуурсан хүрээг тэлэх жишээнүүд гарч ирэх хүртэл энэ нь удаан үргэлжлэх болно. Өнөөдөр би ийм жишээнүүдийн талаар ярьж, SQL хэл дээр үзүүлэхийг хүсч байна. Сонирхолтой, ховор загвар, мартагдсан илэрхийлэл, хачирхалтай заль мэх энэ нийтлэлд таныг хүлээж байна. Сонирхсон хүмүүс муурны доор тавтай морилно уу.

Нянгууд

Энэ нийтлэл хэнд зориулагдсан бэ гэж надаас байнга асуудаг. Гэхдээ надад итгээрэй, хариулт өгөх нь тийм ч амар байдаггүй: нэг талаас юу ч гайхшруулахад хэцүү нинжа хөгжүүлэгчид, нөгөө талаас залуу Падаванчууд байдаг. Гэхдээ би нэг зүйлийг баттай хэлж чадна - SQL-ийг сонирхдог уншигчдад зориулж өөрийн баялаг зургийг жижиг, гэхдээ маш сонирхолтой нарийн ширийн зүйлсээр нөхөж чаддаг. Энэ нийтлэлд sql query-ийн километр хуудас агуулагдахгүй, дээд тал нь 1, 2 мөр байх бөгөөд зөвхөн миний бодлоор ховор зүйлийг л агуулна. Гэхдээ би илэн далангүй хэлэхийг хүсч байгаа тул хэрэв та sql-тэй бол энэ нийтлэл уйтгартай санагдах болно. Эхний болон дөрөв дэхийг эс тооцвол нийтлэл дэх бүх жишээг SQL-92 стандарттай холбож болно.

Өгөгдөл

Бидний амьдралыг хөнгөвчлөхийн тулд би тодорхой цэгүүдийг туршиж үзэх энгийн мэдээллийн самбар шидсэн бөгөөд товчхондоо би туршилтын үр дүнг тэдэнд өгөх болно. Би PostgreSql дээрх бүх хүсэлтийг шалгадаг.

Скрипт ба өгөгдлийн хүснэгт

CREATE TABLE бараа(id bigint NULL NOT NULL, нэрийн тэмдэгтийн хэлбэлзэл(127) NULL БУС, тайлбар тэмдэгтийн хэлбэлзэл(255) NULL БУС, үнэ тоон(16,2) NULL БУС, өгүүллийн тэмдэгтийн хэлбэлзэл(20) NULL, үйлдэл_цаг хугацааны тэмдэг NULL БУС , availability boolean NOT NULL, COSTRAINT pk_goods PRIMARY KEY (id)); INSERT INTO бараа (id, нэр, тайлбар, үнэ, нийтлэл, үйл ажиллагааны_цаг, олдоц) ҮНЭ ЦЭНЭ (1, "Шаахай", "Зөөлөн", 100.00, "TR-75", (ts "2017-01-01 01:01: 01.01"), ҮНЭН); Бараа INSERT INTO (id, нэр, тайлбар, үнэ, нийтлэл, үйлдэл_хугацаа, бэлэн байдал) ҮНЭ ЦЭНЭ (2, "Дэр", "Цагаан", 200.00, "PR-75", (ts "2017-01-02 02:02: 02.02"), ҮНЭН); Барааны INSERT INTO (id, нэр, тайлбар, үнэ, нийтлэл, үйлдэл_хугацаа, бэлэн байдал) ҮНЭ ЗҮЙ (3, "Хөнжил", "Доош", 300.00, "ZR-75", (ts "2017-01-03 03:03: 03.03"), ҮНЭН); INSERT INTO бараа (id, нэр, тайлбар, үнэ, нийтлэл, үйл ажиллагааны_цаг, бэлэн байдал) ҮНЭ ЦЭНЭ (4, "Дэрний уут", "Саарал", 400.00, "AR-75", (ts "2017-01-04 04:04: 04.04"), ХУДАЛ); Бараа INSERT INTO (id, нэр, тайлбар, үнэ, нийтлэл, үйлдэл_хугацаа, бэлэн байдал) ҮНЭ ЦЭНЭ (5, "Sheet", "Silk", 500.00, "BR-75", (ts "2017-01-05 05:05: 05.05"), ХУДАЛ);

Хүсэлтүүд

1. Давхар ишлэл

Надад байгаа хамгийн эхний зүйл бол энгийн асуулт юм: Та sql query ашиглаж байгаа жишээг өгөөч давхаришлэл?Тийм ээ, ганц бие, хостой биш үү?

Давхар хашилттай жишээ

Бараанаас "Бүтээгдэхүүний нэр"-ийг сонго


Би үүнийг анх хараад маш их гайхсан. Хэрэв та давхар хашилтыг нэг хашилт болгон өөрчлөхийг оролдвол үр дүн нь бүрэн байх болно өөр!

Энэ нь бодит хөгжилд тийм ч хэрэгтэй жишээ биш юм шиг санагдаж магадгүй. Миний хувьд тийм биш. Одоо би үүнийг бүх sql хоосон зайндаа идэвхтэй ашиглаж байна. Хамгийн гол нь та хагас жилийн дараа 40 баганаас бүрдсэн sql-query руу буцаж очиход тэдний "манай" нэр хэрхэн хадгалагддаг вэ. Би SQL-92-ийн талаар заагаагүй байсан ч хамгийн сүүлийн хэвлэлд давхар хашилтыг дурдсан байдаг.

2. Псевдо хүснэгт. SQL-92

Нэр томъёоны хувьд бага зэрэг тийм биш боловч мөн чанар нь энгийн байдаг - FROM хэсгийн дэд асуулгын үр дүнд бий болсон хүснэгт. Магадгүй хамгийн их мэдэгдэж байгаа баримтэнэ нийтлэлд

Псевдо хүснэгт

"Хоч" гэсэн хуурамч нэр СОНГОХ, (ХЭЗЭЭ mock.huff ТЭГЭЭД "Тийм" ӨСГӨ "Үгүй" ТӨГСГӨЛ БАЙДАГ ТЭГВЭЛ) "Үгүй юу? FROM (СОНГОХ нэр AS хоч, бэлэн байдал AS huff FROM бараа) элэглэх

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

3. Өгөгдлийн блок үүсгэгч. SQL-92

Сайн орчуулга, тайлбар олсонгүй болохоор л аймшигтай санагдаж байна. Мөн урьдын адил жишээгээр тайлбарлахад хялбар байдаг:

Өгөгдлийн блок үүсгэгчийн жишээ

Нэр "Бүтээгдэхүүний нэр", үнэ "Үнэ" (ҮНЭ ЦЭВЭР ("Шаахай", 100.00), ("Дэр", 200.00)) АС барааны (нэр, үнэ)

Бүтээгдэхүүний нэр Үнэ
Шаахай 100.00
Дэр 200.00

хэсэгт FROMашигласан түлхүүр үг ҮНЭ ЦЭНЭ, дараа нь хаалтанд өгөгдөл, мөр мөрөөр бичнэ. Хамгийн гол нь бид ямар ч хүснэгтээс өгөгдөл сонгохгүй, зүгээр л шууд үүсгэж, хүснэгт болгон "нэрлэж", багануудыг нэрлээд дараа нь өөрийн үзэмжээр ашигладаг. Энэ зүйл нь sql асуулгын янз бүрийн тохиолдлыг туршиж үзэхэд, зарим хүснэгтэд өгөгдөл байхгүй (таны локал мэдээллийн санд), мөн хүснэгтүүд болон хүснэгтүүдийн холболтоос шалтгаалан оруулга бичих нь хэтэрхий залхуу эсвэл заримдаа маш хэцүү байх үед маш хэрэгтэй байсан. хязгаарлалт.

4. Цаг, огноо, цаг, огноо

Магадгүй хүн бүр цаг, огноо, огноо, цагийг зааж өгөх шаардлагатай асуултуудтай тулгарсан байх. Олон DBMS-ууд эдгээр төрлүүдтэй ажиллахын тулд 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. ANY, SOME эсвэл ALL өөрчлөгчтэй харьцуулах операторууд. SQL-92

Энд тайлбар хэрэгтэй байна. Гэхдээ урьдын адил эхлээд жишээ нь энэ нь юу гэсэн үг вэ БҮГДэнэ тохиолдолд? Сонголтын нөхцөл нь зөвхөн тодорхойлогч нь (манай тохиолдолд эдгээр нь 4 ба 5) -аас их байгаа мөрүүдэд л хангагдана гэсэн үг юм. ямар чдэд асуулгад олдсон утгуудаас (1, 2, 3). 4 нь 1-ээс их, 2-оос, 3-аас их. 5 нь төстэй. Хэрэв бид солих юм бол яах вэ БҮГДдээр АЛЬ Ч?
Юу хийж байна АЛЬ Чэнэ тохиолдолд? Сонголтын нөхцөл нь зөвхөн тодорхойлогч нь (бидний тохиолдолд эдгээр нь 2, 3, 4, 5) -аас их байгаа мөрүүдэд л хангагдана гэсэн үг юм. ядаж нэгдэд асуулгад олдсон утгуудаас (1, 2, 3). Би өөрийнхөө хувьд холбогдсон БҮГД-тай БА, a АЛЬ Ч-тай ЭСВЭЛ. ЗАРИМболон АЛЬ Чбие биенийхээ аналогууд.

8. Хүсэлттэй ажиллах операторууд / хүсэлтийн дагуу. SQL-92

Операторуудыг ашиглан 2 асуултыг бие биетэйгээ нэгтгэх боломжтой гэдгийг хангалттай мэддэг НЭГДСЭНэсвэл НЭГДЭЛ. Үүнийг ихэвчлэн ашигладаг. Гэхдээ дахиад 2 оператор байна БУСАДболон УУЛЗАХ.

EXCEPT-тэй жишээ

Үнэндээ хоёр дахь багцын өгөгдөл нь эхний багц утгуудаас хасагдсан болно.
Үнэндээ эхний багц ба хоёр дахь багцын огтлолцол байдаг.
Ингээд л болоо, анхаарал тавьсанд баярлалаа.

Редакци

N1. Бүтээлч шүүмжилсэн streetflush-д баярлалаа. Хэлний стандарт гэж юу вэ, юу нь болохгүй вэ гэсэн мэдээлэл бүхий нийтлэл оруулсан.
N2. 4-р зүйлд ts/d/t нь SQL хэлний нэг хэсэг биш гэдгийг тодотгож зассан. Анхаарал тавьсанд баярлалаа Мелкиж.

EXCEPT хэллэгийг ашиглахад нэг л чухал дүрмийг санах хэрэгтэй.

Бүх асуулгад баганын дараалал, тоо, өгөгдлийн төрөл ижил байх ёстой.

ANSI стандартын дагуу ажиллахад зориулагдсан операторууд UNION багцболон EXCEPT нь ижил давуу эрхтэй боловч INTERSECT оператор нь бусад олонлогийн операторуудаас өмнө гүйцэтгэгдэнэ. Бид хаалт ашиглан операторын давуу байдлыг тодорхой хянахыг зөвлөж байна. Энэ бол ерөнхийдөө маш сайн практик юм.

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

au_lname-ийг "овог нэр" АС, au_fname-г "овог нэр"-ээр сонгон зохиогчдоос emp_lname-ийг "овгийн нэр", emp_fname-ийг "овог нэр"-ээр ЗАХИАЛАХ АЖИЛЛАГААС АВАХ;

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

RDBMS бүр баганын жагсаалт дахь нэрс ялгаатай тохиолдолд баганын нэрийг ашиглах өөрийн дүрмийг хэрэгжүүлж болно. Ерөнхийдөө эхний асуулгын баганын нэрийг ашигладаг.

Өгөгдлийн төрлүүд нь ижил байх албагүй, гэхдээ тэдгээр нь нийцтэй байх ёстой. Жишээлбэл, CHAR болон VARCHAR төрлүүд нийцдэг. Өгөгдмөл байдлаар, багана тус бүрт тогтоосон үр дүн нь тухайн байрлал бүрийн хамгийн том төрөлд тохирох хэмжээг ашиглана. Жишээлбэл, VARCHAR(IO) ба VARCHAR(15) төрлийн утгуудыг агуулсан баганаас өгөгдөл авах асуулга нь VARCHAR(15)-ын төрөл, хэмжээг ашиглана.

Платформуудын аль нь ч ХАРИЛЦАХ )) БУСАД заалтыг дэмждэггүй

(SELECT statemenr.2 | VALUES (илэрхийлэл, илэрхийлэл2 [, ...])) БУСАД

Эцсийн үр дүнгийн багцад орсон нэг буюу хэд хэдэн гараар тодорхойлсон баганыг тодорхойлох боломжийг танд олгоно. (Үүнийг мөр үүсгэгч гэж нэрлэдэг.) VALUES заалт нь EXCEPT мэдэгдлийн асуулгад заасны дагуу яг хэдэн баганыг зааж өгөх ёстой. Хэдийгээр EXCEPT DISTINCT мэдэгдлийг дэмждэггүй ч EXCEPT нь функциональ эквивалент юм. CORRESPONDING заалтыг дэмждэггүй. Мөн LONG VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK өгөгдлийн төрлүүд болон бүтцийн төрлүүдийг EXCEPT заалтад ашигладаггүй, харин EXCEPT ALL зүйлд ашиглаж болно.

Хэрэв үр дүнгийн багц нь бүх SELECT мэдэгдэлд ижил нэртэй баганатай бол энэ нэрийг мэдэгдлийн буцаасан баганын эцсийн нэр болгон ашиглана. Хэрэв өгөгдсөн баганыг өөр өөр SELECT хэллэгт өөрөөр нэрлэсэн бол та бүх асуулгад ижил AS alias заалтыг ашиглан бүх асуулгад баганын нэрийг өөрчлөх ёстой.

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

SELECT empno FROM workdept WHERE workdept WHERE "E%" LIKE SELECT empno FROM emp_act WHERE projno IN (TF1000", TF2000", -AD3110") UNION VALUES ("AA0001"), ("AB0002"), (")AC00;

Дээрх жишээ нь ажилчдын хүснэгтээс "Е" үсгээр эхэлсэн хэлтэст ажилладаг бүх ажилчдын ID-г авч, дараа нь IF1000, IF200, AD3110 төслүүдэд ажилладаг хүмүүсийн ID-г ажилтны дансны хүснэгтээс хассан (emp_act) Эцэст нь , AA0001, AB0002, AC0003 гэсэн гурван нэмэлт ID-г UNION багц оператор ашиглан нэмсэн.

MySQL

MySQL нь EXCEPT мэдэгдлийг дэмждэггүй. Эсвэл NOT IN эсвэл NOT EXISTS операторуудыг ашиглаж болно.