7.4. СоÑеÑание запÑоÑов
РезÑлÑÑаÑÑ Ð´Ð²ÑÑ Ð·Ð°Ð¿ÑоÑов можно обÑабоÑаÑÑ, иÑполÑзÑÑ Ð¾Ð¿ÐµÑаÑии над множеÑÑвами: обÑединение, пеÑеÑеÑение и вÑÑиÑание. ÐÑи опеÑаÑии запиÑÑваÑÑÑÑ ÑооÑвеÑÑÑвенно Ñак:
запÑоÑ1UNION [ALL]запÑоÑ2запÑоÑ1INTERSECT [ALL]запÑоÑ2запÑоÑ1EXCEPT [ALL]запÑоÑ2
ÐдеÑÑ Ð·Ð°Ð¿ÑоÑ1 и запÑоÑ2 â ÑÑо запÑоÑÑ, в коÑоÑÑÑ
могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð²Ñе возможноÑÑи, ÑаÑÑмоÑÑеннÑе до ÑÑого.
UNION по ÑÑÑи добавлÑÐµÑ ÑезÑлÑÑаÑÑ Ð²ÑоÑого запÑоÑа к ÑезÑлÑÑаÑам пеÑвого (Ñ
оÑÑ Ð½Ð¸ÐºÐ°ÐºÐ¾Ð¹ поÑÑдок возвÑаÑаемÑÑ
ÑÑÑок пÑи ÑÑом не гаÑанÑиÑÑеÑÑÑ). Ðолее Ñого, ÑÑа опеÑаÑÐ¸Ñ ÑбиÑÐ°ÐµÑ Ð´ÑблиÑÑÑÑиеÑÑ ÑÑÑоки из ÑезÑлÑÑаÑа Ñак же, как ÑÑо Ð´ÐµÐ»Ð°ÐµÑ DISTINCT, еÑли ÑолÑко не Ñказано UNION ALL.
INTERSECT возвÑаÑÐ°ÐµÑ Ð²Ñе ÑÑÑоки, ÑодеÑжаÑиеÑÑ Ð² ÑезÑлÑÑаÑе и пеÑвого, и вÑоÑого запÑоÑа. ÐÑблиÑÑÑÑиеÑÑ ÑÑÑоки оÑÑилÑÑÑовÑваÑÑÑÑ, еÑли не Ñказано ALL.
EXCEPT возвÑаÑÐ°ÐµÑ Ð²Ñе ÑÑÑоки, коÑоÑÑе еÑÑÑ Ð² ÑезÑлÑÑаÑе пеÑвого запÑоÑа, но оÑÑÑÑÑÑвÑÑÑ Ð² ÑезÑлÑÑаÑе вÑоÑого. (Ðногда ÑÑо назÑваÑÑ ÑазниÑей двÑÑ
запÑоÑов.) РздеÑÑ Ð´ÑблиÑÑÑÑиеÑÑ ÑÑÑоки оÑÑилÑÑÑовÑваÑÑÑÑ, еÑли не Ñказано ALL.
ЧÑÐ¾Ð±Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло вÑÑиÑлиÑÑ Ð¾Ð±Ñединение, пеÑеÑеÑение или ÑазниÑÑ ÑезÑлÑÑаÑов двÑÑ Ð·Ð°Ð¿ÑоÑов, ÑÑи запÑоÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Â«ÑовмеÑÑимÑми Ð´Ð»Ñ Ð¾Ð±ÑединениÑ», ÑÑо ознаÑаеÑ, ÑÑо они Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ð¾Ðµ ÑиÑло ÑÑолбÑов и ÑооÑвеÑÑÑвÑÑÑие ÑÑолбÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑовмеÑÑимÑÑ Ñипов, как опиÑÑваеÑÑÑ Ð² Разделе 10.5.
ÐпеÑаÑии над множеÑÑвами можно обÑединÑÑÑ, напÑимеÑ
запÑоÑ1UNIONзапÑоÑ2EXCEPTзапÑоÑ3
ÑÑо ÑавнознаÑно
(запÑоÑ1UNIONзапÑоÑ2) EXCEPTзапÑоÑ3
Ðак показано вÑÑе, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ ÐºÑÑглÑе Ñкобки, ÑÑÐ¾Ð±Ñ ÑпÑавлÑÑÑ Ð¾ÑеÑедÑÑ Ð¾Ð±ÑабоÑки. Ðез кÑÑглÑÑ
Ñкобок UNION и EXCEPT обÑединÑÑÑÑÑ Ñлева напÑаво, но опеÑаÑÐ¾Ñ INTERSECT Ð¸Ð¼ÐµÐµÑ Ð±Ð¾Ð»ÑÑий пÑиоÑиÑеÑ, Ñем пеÑвÑе два. Таким обÑазом,
запÑоÑ1UNIONзапÑоÑ2INTERSECTзапÑоÑ3
ознаÑаеÑ
запÑоÑ1UNION (запÑоÑ2INTERSECTзапÑоÑ3)
ÐÑ Ñакже можеÑе заклÑÑиÑÑ Ð¾ÑделÑнÑй запÑÐ¾Ñ Ð² кÑÑглÑе Ñкобки. ÐÑо важно, еÑли в запÑоÑе необÑ
одимо иÑполÑзоваÑÑ Ð»Ñбое из пÑедложений, обÑÑждаемÑÑ
в ÑледÑÑÑиÑ
ÑазделаÑ
, напÑÐ¸Ð¼ÐµÑ LIMIT. Ðез кÑÑглÑÑ
Ñкобок Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ ÑинÑакÑиÑеÑÐºÐ°Ñ Ð¾Ñибка или пÑедложение бÑÐ´ÐµÑ Ð²Ð¾ÑпÑинимаÑÑÑÑ ÐºÐ°Ðº оÑноÑÑÑееÑÑ Ðº ÑезÑлÑÑаÑÑ Ð¾Ð¿ÐµÑаÑии над множеÑÑвами, а не к ÐµÑ Ð°ÑгÑменÑам. ÐапÑимеÑ,
SELECT a FROM b UNION SELECT x FROM y LIMIT 10
не вÑÐ·Ð¾Ð²ÐµÑ Ð¾ÑибкÑ, но бÑÐ´ÐµÑ Ð¾Ð·Ð½Ð°ÑаÑÑ
(SELECT a FROM b UNION SELECT x FROM y) LIMIT 10
а не
SELECT a FROM b UNION (SELECT x FROM y LIMIT 10)