2.6. Ð¡Ð¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑаблиÑ
Ðо ÑÑого вÑе наÑи запÑоÑÑ Ð¾Ð±ÑаÑалиÑÑ ÑолÑко к одной ÑаблиÑе. Ðднако запÑоÑÑ Ð¼Ð¾Ð³ÑÑ Ñакже обÑаÑаÑÑÑÑ ÑÑÐ°Ð·Ñ Ðº неÑколÑким ÑаблиÑам или обÑаÑаÑÑÑÑ Ðº Ñой же ÑаблиÑе Ñак, ÑÑо одновÑеменно бÑдÑÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ ÑазнÑе набоÑÑ ÐµÑ ÑÑÑок. ÐапÑоÑ, обÑаÑаÑÑийÑÑ Ðº ÑазнÑм набоÑам ÑÑÑок одной или неÑколÑкиÑ
ÑаблиÑ, назÑваеÑÑÑ Ñоединением (JOIN). ÐапÑимеÑ, Ð¼Ñ Ð·Ð°Ñ
оÑели пеÑеÑиÑлиÑÑ Ð²Ñе погоднÑе ÑобÑÑÐ¸Ñ Ð²Ð¼ÐµÑÑе Ñ ÐºÐ¾Ð¾ÑдинаÑами ÑооÑвеÑÑÑвÑÑÑиÑ
гоÑодов. ÐÐ»Ñ ÑÑого Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑавниÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ city каждой ÑÑÑоки ÑаблиÑÑ weather Ñо ÑÑолбÑом name вÑеÑ
ÑÑÑок ÑаблиÑÑ cities и вÑбÑаÑÑ Ð¿Ð°ÑÑ ÑÑÑок, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
ÑÑи знаÑÐµÐ½Ð¸Ñ ÑовпадаÑÑ.
ÐÑимеÑание
ÐÑо не ÑовÑем ÑоÑÐ½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»Ñ. ÐбÑÑно ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð²ÑполнÑÑÑÑÑ ÑÑÑекÑивнее (ÑÑавниваÑÑÑÑ Ð½Ðµ вÑе возможнÑе паÑÑ ÑÑÑок), но ÑÑо ÑкÑÑÑо Ð¾Ñ Ð¿Ð¾Ð»ÑзоваÑелÑ.
ÐÑо можно ÑделаÑÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑледÑÑÑего запÑоÑа:
SELECT *
FROM weather, cities
WHERE 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, cities WHERE city = name;
УпÑажнение: ÐопÑобÑйÑе опÑеделиÑÑ, ÑÑо бÑÐ´ÐµÑ Ð´ÐµÐ»Ð°ÑÑ ÑÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð±ÐµÐ· пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE.
Так как вÑе ÑÑолбÑÑ Ð¸Ð¼ÐµÑÑ ÑазнÑе имена, анализаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа авÑомаÑиÑеÑки понимаеÑ, к какой ÑаблиÑе они оÑноÑÑÑÑÑ. ÐÑли Ð±Ñ Ð¸Ð¼ÐµÐ½Ð° ÑÑолбÑов в двÑÑ ÑаблиÑÐ°Ñ Ð¿Ð¾Ð²ÑоÑÑлиÑÑ, вам пÑиÑлоÑÑ Ð±Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑÑолбÑов, конкÑеÑизиÑÑÑ, ÑÑо именно Ð²Ñ Ð¸Ð¼ÐµÐ»Ð¸ в видÑ:
SELECT weather.city, weather.temp_lo, weather.temp_hi,
weather.prcp, weather.date, cities.location
FROM weather, cities
WHERE cities.name = weather.city;ÐообÑе Ñ Ð¾ÑоÑим ÑÑилем ÑÑиÑаеÑÑÑ ÑказÑваÑÑ Ð¿Ð¾Ð»Ð½Ñе имена ÑÑолбÑов в запÑоÑе ÑоединениÑ, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ðµ поломалÑÑ, еÑли позже в ÑаблиÑÑ Ð±ÑдÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ñ ÑÑолбÑÑ Ñ Ð¿Ð¾Ð²ÑоÑÑÑÑимиÑÑ Ð¸Ð¼ÐµÐ½Ð°Ð¼Ð¸.
ÐапÑоÑÑ ÑоединениÑ, коÑоÑÑе Ð²Ñ Ð²Ð¸Ð´ÐµÐ»Ð¸ до ÑÑого, можно Ñакже запиÑаÑÑ Ð² дÑÑгом виде:
SELECT *
FROM weather INNER JOIN cities ON (weather.city = cities.name);ÐÑа запиÑÑ Ð½Ðµ Ñак ÑаÑпÑоÑÑÑанена, как пеÑвÑй ваÑианÑ, но Ð¼Ñ Ð¿Ð¾ÐºÐ°Ð·Ñваем еÑ, ÑÑÐ¾Ð±Ñ Ð²Ð°Ð¼ бÑло пÑоÑе понÑÑÑ ÑледÑÑÑие ÑемÑ.
СейÑÐ°Ñ Ð¼Ñ Ð²ÑÑÑним, как веÑнÑÑÑ Ð·Ð°Ð¿Ð¸Ñи о погоде в гоÑоде ХейÑоÑд. ÐÑ Ñ
оÑим, ÑÑÐ¾Ð±Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¿ÑоÑканиÑовал ÑаблиÑÑ 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, weather W2
WHERE 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, cities c
WHERE w.city = c.name;ÐÑ Ð±ÑдеÑе вÑÑÑеÑаÑÑ ÑокÑаÑÐµÐ½Ð¸Ñ Ñакого Ñода доволÑно ÑаÑÑо.