2.6. Ð¡Ð¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑÐ°Ð±Ð»Ð¸Ñ #
Ðо ÑÑого вÑе наÑи запÑоÑÑ Ð¾Ð±ÑаÑалиÑÑ ÑолÑко к одной ÑаблиÑе. Ðднако запÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ñакже обÑаÑаÑÑÑÑ ÑÑÐ°Ð·Ñ Ðº неÑколÑким ÑаблиÑам или обÑаÑаÑÑÑÑ Ðº Ñой же ÑаблиÑе Ñак, ÑÑо одновÑеменно бÑдÑÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ ÑазнÑе набоÑÑ ÐµÑ ÑÑÑок. ÐапÑоÑÑ, обÑаÑаÑÑиеÑÑ Ðº ÑазнÑм ÑаблиÑам (или неÑколÑким ÑкземплÑÑам одной ÑаблиÑÑ), назÑваÑÑÑÑ ÑоединениÑми (JOIN). Такие запÑоÑÑ ÑодеÑÐ¶Ð°Ñ Ð²ÑÑажение, ÑказÑваÑÑее, какие ÑÑÑоки одной ÑаблиÑÑ Ð½Ñжно обÑединиÑÑ Ñо ÑÑÑоками дÑÑгой ÑаблиÑÑ. ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ Ð²ÐµÑнÑÑÑ Ð²Ñе погоднÑе ÑобÑÑÐ¸Ñ Ð²Ð¼ÐµÑÑе Ñ ÐºÐ¾Ð¾ÑдинаÑами ÑооÑвеÑÑÑвÑÑÑиÑ
гоÑодов, база даннÑÑ
должна ÑÑавниÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ city каждой ÑÑÑоки ÑаблиÑÑ weather Ñо ÑÑолбÑом name вÑеÑ
ÑÑÑок ÑаблиÑÑ cities и вÑбÑаÑÑ Ð¿Ð°ÑÑ ÑÑÑок, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
ÑÑи знаÑÐµÐ½Ð¸Ñ ÑовпадаÑÑ. [4] ÐÑо можно ÑделаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑледÑÑÑего запÑоÑа:
SELECT * FROM weather JOIN cities ON city = name;
city |temp_lo|temp_hi| prcp| date | name | location
--------------+-------+-------+-----+-----------+--------------+----------
San Francisco| 46| 50| 0.25| 1994-11-27| San Francisco| (-194,53)
San Francisco| 43| 57| 0| 1994-11-29| San Francisco| (-194,53)
(2 rows)
ÐбÑаÑиÑе внимание на две оÑобенноÑÑи полÑÑеннÑÑ Ð´Ð°Ð½Ð½ÑÑ :
Ð ÑезÑлÑÑаÑе Ð½ÐµÑ ÑÑÑоки Ñ Ð³Ð¾Ñодом ХейÑоÑд (Hayward). Так полÑÑилоÑÑ Ð¿Ð¾ÑомÑ, ÑÑо в ÑаблиÑе
citiesÐ½ÐµÑ ÑÑÑоки Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ гоÑода, а пÑи Ñоединении вÑе ÑÑÑоки ÑаблиÑÑweather, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð½Ðµ наÑлоÑÑ ÑооÑвеÑÑÑвие, опÑÑкаÑÑÑÑ. ÐÑкоÑе Ð¼Ñ Ñвидим, как ÑÑо можно иÑпÑавиÑÑ.Ðазвание гоÑода оказалоÑÑ Ð² двÑÑ ÑÑолбÑÐ°Ñ . ÐÑо пÑавилÑно и обÑÑÑнÑеÑÑÑ Ñем, ÑÑо ÑÑолбÑÑ ÑаблиÑ
weatherиcitiesбÑли обÑединенÑ. ХоÑÑ Ð½Ð° пÑакÑике ÑÑо нежелаÑелÑно, поÑÑÐ¾Ð¼Ñ Ð»ÑÑÑе пеÑеÑиÑлиÑÑ Ð½ÑжнÑе ÑÑолбÑÑ Ñвно, а не иÑполÑзоваÑÑ*:SELECT city, temp_lo, temp_hi, prcp, date, location FROM weather JOIN cities ON city = name;
Так как вÑе ÑÑолбÑÑ Ð¸Ð¼ÐµÑÑ ÑазнÑе имена, анализаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа авÑомаÑиÑеÑки понимаеÑ, к какой ÑаблиÑе они оÑноÑÑÑÑÑ. ÐÑли Ð±Ñ Ð¸Ð¼ÐµÐ½Ð° ÑÑолбÑов в двÑÑ ÑаблиÑÐ°Ñ Ð¿Ð¾Ð²ÑоÑÑлиÑÑ, вам пÑиÑлоÑÑ Ð±Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑÑолбÑов, конкÑеÑизиÑÑÑ, ÑÑо именно Ð²Ñ Ð¸Ð¼ÐµÐ»Ð¸ в видÑ:
SELECT weather.city, weather.temp_lo, weather.temp_hi,
weather.prcp, weather.date, cities.location
FROM weather JOIN cities ON weather.city = cities.name;ÐообÑе Ñ Ð¾ÑоÑим ÑÑилем ÑÑиÑаеÑÑÑ ÑказÑваÑÑ Ð¿Ð¾Ð»Ð½Ñе имена ÑÑолбÑов в запÑоÑе ÑоединениÑ, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ðµ поломалÑÑ, еÑли позже в ÑаблиÑÑ Ð±ÑдÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ ÑÑолбÑÑ Ñ Ð¿Ð¾Ð²ÑоÑÑÑÑимиÑÑ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸.
ÐапÑоÑÑ ÑоединениÑ, коÑоÑÑе Ð²Ñ Ð²Ð¸Ð´ÐµÐ»Ð¸ до ÑÑого, можно Ñакже запиÑаÑÑ Ð² дÑÑгом виде:
SELECT *
FROM weather, cities
WHERE city = name; ÐÑÐ¾Ñ ÑинÑакÑÐ¸Ñ Ð¿Ð¾ÑвилÑÑ Ð´Ð¾ ÑинÑакÑиÑа JOIN/ON, пÑинÑÑого в SQL-92. ТаблиÑÑ Ð¿ÑоÑÑо пеÑеÑиÑлÑÑÑÑÑ Ð² пÑедложении FROM, а вÑÑажение ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑеÑÑÑ Ð² пÑедложение WHERE. РезÑлÑÑаÑÑ, полÑÑаемÑе Ñ Ð¸ÑполÑзованием ÑÑаÑого неÑвного ÑинÑакÑиÑа и нового Ñвного ÑинÑакÑиÑа JOIN/ON, бÑдÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñми. Ðднако, ÑиÑÐ°Ñ Ð·Ð°Ð¿ÑоÑ, понÑÑÑ ÑвнÑй ÑинÑакÑÐ¸Ñ Ð¿ÑоÑе: ÑÑловие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð²Ð²Ð¾Ð´Ð¸ÑÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑпеÑиалÑного клÑÑевого Ñлова, а ÑанÑÑе ÑÑо ÑÑловие вклÑÑалоÑÑ Ð² пÑедложение WHERE наÑÑÐ´Ñ Ñ Ð´ÑÑгими ÑÑловиÑми.
СейÑÐ°Ñ Ð¼Ñ Ð²ÑÑÑним, как веÑнÑÑÑ Ð·Ð°Ð¿Ð¸Ñи о погоде в гоÑоде ХейÑоÑд. ÐÑ Ñ
оÑим, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¿ÑоÑканиÑовал ÑаблиÑÑ weather и Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÐµÑ ÑÑÑоки наÑÑл ÑооÑвеÑÑÑвÑÑÑÑÑ ÑÑÑÐ¾ÐºÑ Ð² ÑаблиÑе cities. ÐÑли же ÑÐ°ÐºÐ°Ñ ÑÑÑока не бÑÐ´ÐµÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ð°, Ð¼Ñ Ñ
оÑим, ÑÑÐ¾Ð±Ñ Ð²Ð¼ÐµÑÑо знаÑений ÑÑолбÑов из ÑаблиÑÑ cities бÑли подÑÑÐ°Ð²Ð»ÐµÐ½Ñ Â«Ð¿ÑÑÑÑе знаÑениÑ». ÐапÑоÑÑ Ñакого Ñипа назÑваÑÑÑÑ Ð²Ð½ÐµÑними ÑоединениÑми. (СоединениÑ, коÑоÑÑе Ð¼Ñ Ð²Ð¸Ð´ÐµÐ»Ð¸ до ÑÑого, назÑваÑÑÑÑ Ð²Ð½ÑÑÑенними.) ÐÑа команда бÑÐ´ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
SELECT *
FROM weather LEFT OUTER JOIN cities ON weather.city = cities.name;
city | temp_lo | temp_hi | prcp | date | name | location
---------------+---------+---------+------+------------+---------------+-----------
Hayward | 37 | 54 | | 1994-11-29 | |
San Francisco | 46 | 50 | 0.25 | 1994-11-27 | San Francisco | (-194,53)
San Francisco | 43 | 57 | 0 | 1994-11-29 | San Francisco | (-194,53)
(3 rows)
ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð°Ð·ÑваеÑÑÑ Ð»ÐµÐ²Ñм внеÑним Ñоединением, поÑÐ¾Ð¼Ñ ÑÑо из ÑаблиÑÑ Ð² левой ÑаÑÑи опеÑаÑоÑа бÑдÑÑ Ð²ÑбÑÐ°Ð½Ñ Ð²Ñе ÑÑÑоки, а из ÑаблиÑÑ ÑпÑава ÑолÑко Ñе, коÑоÑÑе ÑдалоÑÑ ÑопоÑÑавиÑÑ ÐºÐ°ÐºÐ¸Ð¼-нибÑÐ´Ñ ÑÑÑокам из левой. ÐÑи вÑводе ÑÑÑок левой ÑаблиÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð½Ðµ ÑдалоÑÑ Ð½Ð°Ð¹Ñи ÑооÑвеÑÑÑÐ²Ð¸Ñ Ð² пÑавой, вмеÑÑо ÑÑолбÑов пÑавой ÑаблиÑÑ Ð¿Ð¾Ð´ÑÑавлÑÑÑÑÑ Ð¿ÑÑÑÑе знаÑÐµÐ½Ð¸Ñ (NULL).
УпÑажнение: СÑÑеÑÑвÑÑÑ Ñакже пÑавÑе внеÑние ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð¸ полнÑе внеÑние ÑоединениÑ. ÐопÑобÑйÑе вÑÑÑниÑÑ, ÑÑо они Ñобой пÑедÑÑавлÑÑÑ.
Ð Ñоединении Ð¼Ñ Ñакже можем замкнÑÑÑ ÑаблиÑÑ Ð½Ð° ÑебÑ. ÐÑо назÑваеÑÑÑ Ð·Ð°Ð¼ÐºÐ½ÑÑÑм Ñоединением. ÐапÑимеÑ, пÑедÑÑавÑÑе, ÑÑо Ð¼Ñ Ñ
оÑим найÑи вÑе запиÑи погодÑ, в коÑоÑÑÑ
ÑемпеÑаÑÑÑа Ð»ÐµÐ¶Ð¸Ñ Ð² диапазоне ÑемпеÑаÑÑÑ Ð´ÑÑгиÑ
запиÑей. ÐÐ»Ñ ÑÑого Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑавниÑÑ ÑÑолбÑÑ temp_lo и temp_hi каждой ÑÑÑоки ÑаблиÑÑ weather Ñо ÑÑолбÑами temp_lo и temp_hi дÑÑгого набоÑа ÑÑÑок weather. ÐÑо можно ÑделаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑледÑÑÑего запÑоÑа:
SELECT w1.city, w1.temp_lo AS low, w1.temp_hi AS high,
w2.city, w2.temp_lo AS low, w2.temp_hi AS high
FROM weather w1 JOIN weather w2
ON w1.temp_lo < w2.temp_lo AND w1.temp_hi > w2.temp_hi;
city | low | high | city | low | high
---------------+-----+------+---------------+-----+------
San Francisco | 43 | 57 | San Francisco | 46 | 50
Hayward | 37 | 54 | San Francisco | 46 | 50
(2 rows)
ÐдеÑÑ Ð¼Ñ Ð²Ð²ÐµÐ»Ð¸ новÑе обознаÑÐµÐ½Ð¸Ñ ÑаблиÑÑ weather: W1 и W2, ÑÑÐ¾Ð±Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло ÑазлиÑиÑÑ Ð»ÐµÐ²ÑÑ Ð¸ пÑавÑÑ ÑÑоÑÐ¾Ð½Ñ ÑоединениÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñе пÑÐµÐ²Ð´Ð¾Ð½Ð¸Ð¼Ñ Ð¸ в дÑÑгиÑ
запÑоÑаÑ
Ð´Ð»Ñ ÑокÑаÑениÑ:
SELECT *
FROM weather w JOIN cities c ON w.city = c.name;ÐÑ Ð±ÑдеÑе вÑÑÑеÑаÑÑ ÑокÑаÑÐµÐ½Ð¸Ñ Ñакого Ñода доволÑно ÑаÑÑо.
[4] ÐÑо не ÑовÑем ÑоÑÐ½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»Ñ. ÐбÑÑно ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð²ÑполнÑÑÑÑÑ ÑÑÑекÑивнее (ÑÑавниваÑÑÑÑ Ð½Ðµ вÑе возможнÑе паÑÑ ÑÑÑок), но ÑÑо ÑкÑÑÑо Ð¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ.