КампутарыПраграмаванне

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 - тыповыя памылкі выкарыстання: няправільны парадак табліц

Асноўных памылак, якія дапускаюцца пры левым знешнім злучэнні табліц, дзве:

  1. Няслушна абраны парадак табліц, з-за якога былі страчаныя дадзеныя.
  2. Памылкі пры выкарыстанні 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

 

 

 

 

Newest

Copyright © 2018 be.delachieve.com. Theme powered by WordPress.