Кампутары, Праграмаванне
Left join (SQL) - прыклад, падрабязнае апісанне, памылкі выкарыстання
У любой рэальнай рэляцыйнай базе даных уся інфармацыя размяркоўваецца па асобных табліцах. Многія з табліц маюць зафіксаваныя ў схеме устаноўленыя сувязі адзін з адным. Аднак з дапамогай запытаў Sql цалкам рэальна пракласці сувязь паміж дадзенымі, ня закладзеную ў схеме. Гэта ажыццяўляецца шляхам выканання аперацыі злучэння join, якая дазваляе выбудаваць адносіны паміж любой колькасцю табліц і злучыць нават, здавалася б, разрозненыя дадзеныя.
У дадзеным артыкуле пойдзе гаворка канкрэтна пра левым знешнім злучэнні. Перш чым прыступіць да апісання дадзенага тыпу злучэння, дадамо ў базу дадзеных некаторыя табліцы.
Падрыхтоўка неабходных табліц
Дапусцім, у нашай базе дадзеных маецца інфармацыя пра людзей і іх нерухомую маёмасць. Асноўная інфармацыя грунтуецца на трох табліцах: Peoples (людзі), Realty (нерухомасць), Realty_peoples (табліца з адносінамі, каму з людзей какая нерухомасць належыць). Выкажам здагадку, у табліцах захоўваюцца наступныя дадзеныя па людзях:
Peoples | ||||
id | L_name | F_name | Middle_name | Birthday |
1 | Іванова | Дар'я |
Барысаўна | 2000/07/16 |
2 | Пугин | Уладзіслаў | Мікалаевіч | 1986/01/29 |
3 | Евгеньин | Аляксандр | Федерович | 1964/04/30 |
4 | Аннина | каханне | Паўлаўна | 1989/12/31 |
5 | Герасимовская | надзея | Паўлаўна | 1992/03/14 |
6 | Герасимовский | Алег | Альбертавіч | 1985/01/29 |
7 | Сухановский | Юрый | Андрэевіч | 1976/09/25 |
8 | Сухановская | Юлія | Юр'еўна | 2001/10/01 |
Па нерухомасці:
Realty | |
id | address |
1 | г. Архангельск, вул. Вароніна, д. 7, кв.6 |
2 | г. Архангельск, вул. Северадзвінска, в. 84, кв. 9, пакой. 5 |
3 | Архангельская вобласць, г. Северадзвінск, вул. Леніна, д. 134, кв. 85 |
4 | Архангельская вобласць, г. Навадзвінск, вул. Пралетарская, д. 16, кв. 137 |
5 | г. Архангельск, пл. Цярохін, в. 89, кв. 13 |
Па адносінах людзі - нерухомасць:
Realty_peoples | ||
id_peoples | id_realty | type |
7 | 3 | Агульная сумесная ўласнасць |
8 | 3 | Агульная сумесная ўласнасць |
3 | 5 | ўласнасць |
7 | 1 | ўласнасць |
5 | 4 | Агульная долевая ўласнасць |
6 | 4 | Агульная долевая ўласнасць |
Left join (Sql) - апісанне
Левае злучэнне мае наступны сінтаксіс:
Table_A LEFT JOIN table_B [{ON прэдыкатаў} | {USING список_ з толбцов}] |
І схематычна выглядае так:
І перакладаецца дадзены выраз як «Выбраць усе без выключэння радкі з табліцы А, а з табліцы У вывесці толькі супадаюць па прэдыкаты радка. Калі ў табліцы У не знайшлося пары для радкоў табліцы А, то запоўніць выніковыя слупкі Null - значэннямі ».
Часцей за ўсё пры выкананні левага злучэння паказваецца ON, USING выкарыстоўваюць, толькі калі назвы слупкоў, па якіх плануецца выканаць злучэнне, супадаюць.
Left join - прыклады выкарыстання
З дапамогай левага злучэння мы можам паглядзець, ва ўсіх Ці людзей са спісу Peoples маецца нерухомасць. Для гэтага выканаем наступны ў left join sql прыклад запыту:
SELECT Peoples. *, Realty_peoples.id_realty, Realty_peoples.type FROM Peoples LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples; |
І атрымаем наступны вынік:
Запрос1 | ||||||
id | L_name | F_name | Middle_name | Birthday | id_realty | type |
1 | Іванова | Дар'я | Барысаўна | 2000/07/16 | ||
2 | Пугин | Уладзіслаў | Мікалаевіч | 1986/01/29 | ||
3 | Евгеньин | Аляксандр | Федерович | 1964/04/30 | 5 | ўласнасць |
4 | Аннина | каханне | Паўлаўна | 1989/12/31 | ||
5 | Герасимовская | надзея | Паўлаўна | 1992/03/14 | 4 | Агульная долевая ўласнасць |
6 | Герасимовский | Алег | Альбертавіч | 1985/01/29 | 4 | Агульная долевая ўласнасць |
7 | Сухановский | Юрый | Андрэевіч | 1976/09/25 | 1 | ўласнасць |
7 | Сухановский | Юрый | Андрэевіч | 1976/09/25 | 3 | Агульная сумесная ўласнасць |
8 | Сухановская | Юлія | Юр'еўна | 2001/10/01 | 3 | Агульная сумесная ўласнасць |
Як бачым, у Івановай Дар'і, Пугина Уладзіслава і Анниной Любові няма зарэгістраваных правоў на нерухомасць.
А што б мы атрымалі, выкарыстоўваючы ўнутранае злучэнне Inner join? Як вядома, яно выключае несупадаючыя радкі, таму тры чалавекі з нашай выніковай выбаркі проста б выпалі:
Запрос1 | ||||||
id | L_name | F_name | Middle_name | Birthday | id_realty | type |
3 | Евгеньин | Аляксандр | Федерович | 1964/04/30 | 5 | ўласнасць |
5 | Герасимовская | надзея | Паўлаўна | 1992/03/14 | 4 | Агульная долевая ўласнасць |
6 | Герасимовский | Алег | Альбертавіч | 1985/01/29 | 4 | Агульная долевая ўласнасць |
7 | Сухановский | Юрый | Андрэевіч | 1976/09/25 | 1 | ўласнасць |
7 | Сухановский | Юрый | Андрэевіч | 1976/09/25 | 3 | Агульная сумесная ўласнасць |
8 | Сухановская | Юлія | Юр'еўна | 2001/10/01 | 3 | Агульная сумесная ўласнасць |
Здавалася б, другі варыянт гэтак жа адказвае умовам нашай задачы. Аднак, калі мы далей пачнем далучаць яшчэ і яшчэ табліцы, тры чалавекі з выніку ўжо незваротна знікнуць. Таму на практыцы пры аб'яднанні мноства табліц нашмат часцей выкарыстоўваюцца злучэння Left і Right, чым Inner join.
Працягнем разглядаць з left join sql прыклады. Далучым табліцу з адрасамі нашых аб'ектаў нерухомасці:
SELECT Peoples. *, Realty_peoples.id_realty, Realty_peoples.type, Realty.address FROM Peoples LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples LEFT JOIN Realty ON Realty.id = Realty_peoples.id_realty |
Цяпер мы атрымаем не толькі выгляд правы, але і адрасы аб'ектаў нерухомасці:
Запрос1 | |||||||
id | L_name | F_name | Middle_name | Birthday | id_realty | type | address |
1 | Іванова | Дар'я | Барысаўна | 2000/07/16 | |||
2 | Пугин | Уладзіслаў | Мікалаевіч | 1986/01/29 | |||
3 | Евгеньин | Аляксандр | Федерович | 1964/04/30 | 5 | ўласнасць | г. Архангельск, пл. Цярохін, в. 89, кв. 13 |
4 | Аннина | каханне | Паўлаўна | 1989/12/31 | |||
5 | Герасимовская | надзея | Паўлаўна | 1992/03/14 | 4 | Агульная долевая ўласнасць | Архангельская вобласць, г. Навадзвінск, вул. Пралетарская, д. 16, кв. 137 |
6 | Герасимовский | Алег | Альбертавіч | 1985/01/29 | 4 | Агульная долевая ўласнасць | Архангельская вобласць, г. Навадзвінск, вул. Пралетарская, д. 16, кв. 137 |
7 | Сухановский | Юрый | Андрэевіч | 1976/09/25 | 3 | Агульная сумесная ўласнасць | Архангельская вобласць, г. Северадзвінск, вул. Леніна, д. 134, кв. 85 |
7 | Сухановский | Юрый | Андрэевіч | 1976/09/25 | 1 | ўласнасць | г. Архангельск, вул. Вароніна, д. 7, кв.6 |
8 | Сухановская | Юлія | Юр'еўна | 2001/10/01 | 3 | Агульная сумесная ўласнасць |
Архангельская вобласць, г. Северадзвінск, вул. Леніна, д. 134, кв. 85 |
Left join - тыповыя памылкі выкарыстання: няправільны парадак табліц
Асноўных памылак, якія дапускаюцца пры левым знешнім злучэнні табліц, дзве:
- Няслушна абраны парадак табліц, з-за якога былі страчаныя дадзеныя.
- Памылкі пры выкарыстанні Where ў запыце з аб'яднанымі табліцамі.
Разгледзім памылку першую. Перад рашэннем любой задачы варта дакладна разумець, што менавіта мы хочам атрымаць у выніку. У разгляданым вышэй прыкладзе мы вывелі ўсіх да адзінага людзей, але абсалютна страцілі звесткі аб аб'екце пад нумарам 2, у якога ўласніка не знайшлося.
Калі б мы пераставілі табліцы ў запыце месцамі, і пачалі б з «... From Realty left join Peoples ...» там ні адну нерухомасць мы б не страцілі, чаго не скажаш пра людзей.
Аднак не варта, спалохаўшыся левага злучэння, пераходзіць на поўнае вонкавае, якое ўключыць у выніку і супадальныя, і якія не супадаюць радка.
Бо аб'ём выбарак часцяком вельмі вялікі, і лішнія дадзеныя рэальна ні да чаго. Галоўнае - разабрацца, што вы хочаце ў выніку атрымаць: ўсіх людзей са спісам наяўных у іх нерухомасці, альбо спіс усёй нерухомасці з іх ўласнікамі (калі ёсць).
Left join - тыповыя памылкі выкарыстання: правільнасць запыту пры заданні умоў у Where
Другая памылка таксама звязана з стратай дадзеных, прычым не заўсёды адразу відавочнай.
Вернемся да запыту, калі мы з дапамогай левага злучэння атрымалі дадзеныя па ўсім людзям і наяўнай у іх нерухомасці. Ўспомніце наступны з ужываннем left join sql прыклад:
FROM Peoples LEFT JOIN Realty_peoples ON Peoples.id = Realty_peoples.id_peoples; |
Дапусцім, мы хочам удакладніць запыт і ня выводзіць дадзеныя, дзе тып правы - «Уласнасць». Калі мы проста дапішам, ужываючы left join sql, прыклад наступным умовай:
...
Where type <> "Уласнасць" |
то страцім дадзеныя па людзях, у якіх няма ніякай нерухомасці, бо пустое значэнне Null ня параўноўваецца такім чынам:
Запрос1 | ||||||
id | L_name | F_name | Middle_name | Birthday | id_realty | type |
5 | Герасимовская | надзея | Паўлаўна | 1992/03/14 | 4 | Агульная долевая ўласнасць |
6 | Герасимовский | Алег | Альбертавіч | 1985/01/29 | 4 | Агульная долевая ўласнасць |
7 | Сухановский | Юрый | Андрэевіч | 1976/09/25 | 3 | Агульная сумесная ўласнасць |
8 | Сухановская | Юлія | Юр'еўна | 2001/10/01 | 3 | Агульная сумесная ўласнасць |
Каб папярэдзіць з'яўленне памылак па гэтай прычыне, лепш за ўсё задаць ўмова адбору адразу пры злучэнні. Прапануем разгледзець наступны з left join sql прыклад.
SELECT Peoples. *, Realty_peoples.id_realty, Realty_peoples.type FROM Peoples LEFT JOIN Realty_peoples ON (Peoples.id = Realty_peoples.id_peoples AND type <> "Уласнасць") |
Вынік будзе наступным:
Запрос1 | ||||||
id | L_name | F_name | Middle_name | Birthday | id_realty | type |
1 | Іванова | Дар'я | Барысаўна | 2000/07/16 | ||
2 | Пугин | Уладзіслаў | Мікалаевіч | 1986/01/29 | ||
3 | Евгеньин | Аляксандр | Федерович | 1964/04/30 | ||
4 | Аннина | каханне | Паўлаўна | 1989/12/31 | ||
5 | Герасимовская | надзея | Паўлаўна | 1992/03/14 | 4 | Агульная долевая ўласнасць |
6 | Герасимовский | Алег | Альбертавіч | 1985/01/29 | 4 | Агульная долевая ўласнасць |
7 | Сухановский | Юрый | Андрэевіч | 1976/09/25 | 3 | Агульная сумесная ўласнасць |
8 | Сухановская | Юлія | Юр'еўна | 2001/10/01 | 3 | Агульная сумесная ўласнасць |
Такім чынам, выканаўшы просты з left join sql прыклад, мы атрымалі спіс з усіх людзей, вывеўшы дадаткова, у каго з іх нерухомасць у долевай / сумеснай уласнасці.
У якасці высновы хацелася б яшчэ раз падкрэсліць, што да выбарцы любой інфармацыі з базы дадзеных трэба паставіцца адказна. Многія нюансы адкрыў перад намі з ужываннем left join sql просты прыклад, тлумачэнне якім адно - перад тым як прыступіць да складання нават элементарнага запыту, неабходна старанна разабрацца, што менавіта мы хочам атрымаць у выніку. Ўдачы!
Similar articles
Trending Now