SlideShare a Scribd company logo
1 of 4
Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев SQL Server Съединения на две или повече таблици 1 от 4
Тема 19. Използване на съединения за извличане на данни от две или повече таблици
инж. Красимир Дойчев kdoychev@gmail.com
В предните уроци усвоихте най-същественото при конструкция SELECT и се
запознахте с операторите и функциите на Transact-SQL. Вече имате готовност да научите
някои по-сложни методи за създаване на заявки. Един от тези методи е да комбинирате
съдържанието на две или повече таблици, за да получите набор от резултати, който съчетава
редове и колони от всяка от таблиците.
Целта на настоящия урок е да разширите знанията си за работа с SQL Server, като се
запознаете със съединенията на две или повече таблици.
Задачи
1. Запознаване с видовете съединения и техния синтаксис в Transact-SQL
2. Създаване и изпълняване конструкции на Transact-SQL, които включват
съединения.
1. Същност и особености на съединенията
С помощта на съединения (joins) можете да извличате данни от две или повече
таблици, като се базирате на логическите отношения (релации) между таблиците.
Съединенията показват как SQL Server трябва да използва данните от една таблица, за да
избира редове от друга таблица.
Съединенията могат да бъдат задавани или в клауза FROM, или в клауза WHERE.
Условията за съединение се комбинират с условията за търсене в WHERE и HAVING, за да
контролират редовете, които са избрани от основните таблици, посочени в клауза FROM.
Препоръчва се задаването на условията за съединение в клауза FROM, тъй като дава
възможност съединенията да бъдат отделени от всяко друго условие за търсене, което може
да бъде зададено в клауза WHERE.
Когато в една заявка са посочени много таблици, всички обръщения към колони
трябва да бъдат еднозначни. Името на таблицата трябва да се използва за уточняване на
всяко име на колона, което се дублира в две или повече таблици, посочени в една заявка.
Това се записва във вида: ИмеТаблица . ИмеКолона, например Titles. pub_id –
идентификационния номер на издателството pub_id от таблицата заглавия на книги – Titles.
Списъкът за избор на едно съединение може да посочва всички колони в съединените
таблици или каквото и да е подмножество от тях.
Въпреки че в условията за съединение обикновено се използва знакът за равенство (=)
като оператор за сравнение, може да се задават и други оператори за сравнение или
отношение (както и други логически изрази - предикати).
Въпреки че при физическото изпълнение на различни съединения се използват много
различни оптимизации, логическата последователност на изпълнение е следната:
1. Прилагат се условията за съединение в клауза FROM.
2. Прилагат се условията за съединение и условията за търсене от клауза
WHERE.
3. Прилагат се условията за търсене от клауза HAVING.
Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев SQL Server Съединения на две или повече таблици 2 от 4
Тази последователност може понякога да повлияе на резултата от заявката, ако
условията се преместват между клаузите FROM и WHERE.
Не е задължително колоните, използвани в условие за съединение да имат същото
име или същия тип данни. Ако обаче типовете данни не са идентични, те трябва да бъдат
съвместими или да могат да бъдат неявно преобразувани от SQL Server. Ако типовете данни
не могат да бъдат неявно преобразувани, условието за съединение трябва явно да
преобразува типа данни чрез използване на функция CAST.
2. Видове съединения
Повечето съединения могат да се категоризират като:
 вътрешни (inner joins);
 външни (outer joins).
Вътрешните съединения връщат редове само когато има поне един ред от двете
таблици, който отговаря на условието за съединение, като елиминират редовете, които не
съответстват на ред от другата таблица.
Външните съединения връщат всички редове от поне една от таблиците или
изгледите, посочени в клауза FROM, при условие, че тези редове отговарят на някое от
условията за търсене в WHERE или HAVING.
Можете също да създавате:
 кръстосани съединения (cross-joins)
 съединения на таблица със самата нея (self-joins).
Повече информация за cross-joins и self-joins ще намерите в SQL Server Books Online.
3. Вътрешни съединения
Вътрешното съединение (inner join) е съединение, при което стойностите в колоните,
които се съединяват, се сравняват с помощта на оператор за сравнение. В стандарта SQL-92
вътрешните съединения могат да бъдат задавани или в клауза FROM, или в клауза WHERE.
Пример 1. Следващата конструкция SELECT използва вътрешно съединение за
извличане на данни от таблица Publishers и таблица Titles в база данни Pubs:
Use Pubs
SELECT t.Title, p.Pub_name
FROM Publishers AS p INNER JOIN Titles AS t
ON p.Pub_id = t.Pub_id
ORDER BY Title ASC
Тази конструкция SELECT извлича данни от колона Title в таблица Titles (псевдоним
t) и от колона Pub_name в таблица Publishers (псевдоним р). Поради това, че конструкцията
използва вътрешно съединение, тя връща само тези редове, които имат еднаква стойност в
общите колони (колона p.Pub_id и колона t.Pub_id). Какво ще направи клаузата ORDER BY
Title ASC?
4. Външни съединения
SQL Server поддържа три вида външни съединения: ляво съединение (left join), дясно
съединение (right join) и пълно съединение (full join). Всички редове, извлечени от лявата
таблица, се указват чрез ляво външно (left outer) съединение, а всички редове от дясната
Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев SQL Server Съединения на две или повече таблици 3 от 4
таблица се указват в дясно външно (right outer) съединение. Всички редове от двете таблици
се връщат при пълно външно (full outer) съединение.
4.1. Използване на леви външни съединения
В набора от резултати, генериран от една конструкция SELECT, в която има
съединение left outer, се включват всички редове от таблицата, указана вляво на LEFT
OUTER JOIN. Единствените редове, които се извличат от таблицата вдясно, са тези, които
отговарят на условието за съединение.
Пример 2. В следващата конструкция SELECT е използвано съединение left outer, за
да се извлекат имената Au_fname (author first name) и фамилиите Au_lname (last name) на
авторите, и (там, където е приложимо) имената на всички издатели Pub_name (publisher
name), които се намират в същите градове, където са и авторите:
USE Pubs
SELECT a.Au_fname, a.Au_lname, p.Pub_name
FROM Authors a LEFT OUTER JOIN Publishers p
ON a.City = p.City
ORDER BY p.Pub_name ASC, a.Au_lname ASC, a.Au_fname ASCНаборът от резултати
на тази заявка ще съдържа имената на всички автори от таблица Authors. Той ще включва
обаче само тези издатели, които се намират в същите градове от които са авторите. Ако
местоположението на даден издател е различно от града на автора в колона Pub_name на
набора от резултати се връща стойност Null.
4.2. Използване на десни външни съединения
В набора от резултати, генериран от една конструкция SELECT, в която има дясно
външно съединение, се включват всички редове от таблицата, указана вдясно на RIGHT
OUTER JOIN. Единствените редове, които се извличат от таблицата вляво, са тези, които
отговарят на условието за съединение.
Пример 3. В следващата конструкция SELECT е използвано дясно външно
съединение, за да се извлече списъкът на издателите и имената на авторите, ако тези автори
живеят в същите градове като издателите
USE Pubs
SELECT a.Au_fname, a.Au_lname, p.Pub_name
FROM Authors a RIGHT OUTER JOIN Publishers p
ON a.City = p.City ORDER BY p.Pub_name ASC, a.Au_lname ASC, a.Au_fname ASC
Наборът от резултати на тази заявка ще съдържа името на всеки издател от таблица
Publishers. Той ще включва обаче само тези автори, които се намират в същите градове като
издателите. Ако някой автор не се намира в града на издателя, в колони Au_fname и Aulname
на набора от резултати се връщат стойности null.
4.3. Използване на пълни външни съединения
В набора от резултати, генериран от една конструкция SELECT, в която има пълно
външно съединение, се включват всички редове от двете таблици, независимо от това дали
таблиците имат съвпадащи стойности (както е дефинирано в условието за съединение).
Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич
www.pglomonosov.org
Красимир Дойчев SQL Server Съединения на две или повече таблици 4 от 4
Пример 4. В следващата конструкция SELECT е използвано пълно външно
съединение, за да се извлече списък с издателите и имената на авторите:
USE Pubs
SELECT a.Au_fname, a.Au_lname, p.Pub_name
FROM Authors a FULL OUTER JOIN Publishers p
ON a.City = p.City ORDER BY p.Pub_name ASC, a.Au_lname ASC, a.Au_fname ASC
Наборът от резултати на тази заявка ще съдържа името на всеки издател от таблица
Publishers и на всеки автор от таблица Authors. Ако някой автор не се намира в града на
издателя, в колони Au_fname и Au_lname на набора от резултати се връщат стойности null.
Ако някой издател не се намира в града на автора, в колона Pub_name на набора от резултати
се връща стойност null. Когато условието за съединение е изпълнено, всички колони в
набора от резултати ще съдържат стойност.
ЛИТЕРАТУРА
1. Microsoft. MSCE Microsoft SQL Server 2000 Проектиране и реализация на бази данни
Training kit. С., Софтпрес, 2001.
2. SQL Server Books Online

More Related Content

More from Ivan Peev

18 operatori i funkcii
18 operatori i funkcii18 operatori i funkcii
18 operatori i funkciiIvan Peev
 
08 pravila za dostap
08 pravila za dostap08 pravila za dostap
08 pravila za dostapIvan Peev
 
06 pregled na sigurnostta v sql server
06 pregled na sigurnostta v sql server06 pregled na sigurnostta v sql server
06 pregled na sigurnostta v sql serverIvan Peev
 
01 vavedenie v sql server 2000
01 vavedenie v sql server 200001 vavedenie v sql server 2000
01 vavedenie v sql server 2000Ivan Peev
 
24 sazdavane na potrebiteli i zadavane na razreshenia
24 sazdavane na potrebiteli i zadavane na razreshenia24 sazdavane na potrebiteli i zadavane na razreshenia
24 sazdavane na potrebiteli i zadavane na razresheniaIvan Peev
 
22a sazdavane na bd i tablici v sql server upraznenie
22a sazdavane na bd i tablici v sql server   upraznenie22a sazdavane na bd i tablici v sql server   upraznenie
22a sazdavane na bd i tablici v sql server upraznenieIvan Peev
 
22 sazdavane na bd i tablici v sql server
22 sazdavane na bd i tablici v sql server22 sazdavane na bd i tablici v sql server
22 sazdavane na bd i tablici v sql serverIvan Peev
 
21a manipulirane na danni v sql server upraznenie
21a manipulirane na danni v sql server   upraznenie21a manipulirane na danni v sql server   upraznenie
21a manipulirane na danni v sql server upraznenieIvan Peev
 
Konspekt prilojen mrejovi-software-12kl
Konspekt prilojen mrejovi-software-12klKonspekt prilojen mrejovi-software-12kl
Konspekt prilojen mrejovi-software-12klIvan Peev
 
Block diagrame 1
Block diagrame 1Block diagrame 1
Block diagrame 1Ivan Peev
 

More from Ivan Peev (10)

18 operatori i funkcii
18 operatori i funkcii18 operatori i funkcii
18 operatori i funkcii
 
08 pravila za dostap
08 pravila za dostap08 pravila za dostap
08 pravila za dostap
 
06 pregled na sigurnostta v sql server
06 pregled na sigurnostta v sql server06 pregled na sigurnostta v sql server
06 pregled na sigurnostta v sql server
 
01 vavedenie v sql server 2000
01 vavedenie v sql server 200001 vavedenie v sql server 2000
01 vavedenie v sql server 2000
 
24 sazdavane na potrebiteli i zadavane na razreshenia
24 sazdavane na potrebiteli i zadavane na razreshenia24 sazdavane na potrebiteli i zadavane na razreshenia
24 sazdavane na potrebiteli i zadavane na razreshenia
 
22a sazdavane na bd i tablici v sql server upraznenie
22a sazdavane na bd i tablici v sql server   upraznenie22a sazdavane na bd i tablici v sql server   upraznenie
22a sazdavane na bd i tablici v sql server upraznenie
 
22 sazdavane na bd i tablici v sql server
22 sazdavane na bd i tablici v sql server22 sazdavane na bd i tablici v sql server
22 sazdavane na bd i tablici v sql server
 
21a manipulirane na danni v sql server upraznenie
21a manipulirane na danni v sql server   upraznenie21a manipulirane na danni v sql server   upraznenie
21a manipulirane na danni v sql server upraznenie
 
Konspekt prilojen mrejovi-software-12kl
Konspekt prilojen mrejovi-software-12klKonspekt prilojen mrejovi-software-12kl
Konspekt prilojen mrejovi-software-12kl
 
Block diagrame 1
Block diagrame 1Block diagrame 1
Block diagrame 1
 

19 saedinenia na tablici

  • 1. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич www.pglomonosov.org Красимир Дойчев SQL Server Съединения на две или повече таблици 1 от 4 Тема 19. Използване на съединения за извличане на данни от две или повече таблици инж. Красимир Дойчев kdoychev@gmail.com В предните уроци усвоихте най-същественото при конструкция SELECT и се запознахте с операторите и функциите на Transact-SQL. Вече имате готовност да научите някои по-сложни методи за създаване на заявки. Един от тези методи е да комбинирате съдържанието на две или повече таблици, за да получите набор от резултати, който съчетава редове и колони от всяка от таблиците. Целта на настоящия урок е да разширите знанията си за работа с SQL Server, като се запознаете със съединенията на две или повече таблици. Задачи 1. Запознаване с видовете съединения и техния синтаксис в Transact-SQL 2. Създаване и изпълняване конструкции на Transact-SQL, които включват съединения. 1. Същност и особености на съединенията С помощта на съединения (joins) можете да извличате данни от две или повече таблици, като се базирате на логическите отношения (релации) между таблиците. Съединенията показват как SQL Server трябва да използва данните от една таблица, за да избира редове от друга таблица. Съединенията могат да бъдат задавани или в клауза FROM, или в клауза WHERE. Условията за съединение се комбинират с условията за търсене в WHERE и HAVING, за да контролират редовете, които са избрани от основните таблици, посочени в клауза FROM. Препоръчва се задаването на условията за съединение в клауза FROM, тъй като дава възможност съединенията да бъдат отделени от всяко друго условие за търсене, което може да бъде зададено в клауза WHERE. Когато в една заявка са посочени много таблици, всички обръщения към колони трябва да бъдат еднозначни. Името на таблицата трябва да се използва за уточняване на всяко име на колона, което се дублира в две или повече таблици, посочени в една заявка. Това се записва във вида: ИмеТаблица . ИмеКолона, например Titles. pub_id – идентификационния номер на издателството pub_id от таблицата заглавия на книги – Titles. Списъкът за избор на едно съединение може да посочва всички колони в съединените таблици или каквото и да е подмножество от тях. Въпреки че в условията за съединение обикновено се използва знакът за равенство (=) като оператор за сравнение, може да се задават и други оператори за сравнение или отношение (както и други логически изрази - предикати). Въпреки че при физическото изпълнение на различни съединения се използват много различни оптимизации, логическата последователност на изпълнение е следната: 1. Прилагат се условията за съединение в клауза FROM. 2. Прилагат се условията за съединение и условията за търсене от клауза WHERE. 3. Прилагат се условията за търсене от клауза HAVING.
  • 2. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич www.pglomonosov.org Красимир Дойчев SQL Server Съединения на две или повече таблици 2 от 4 Тази последователност може понякога да повлияе на резултата от заявката, ако условията се преместват между клаузите FROM и WHERE. Не е задължително колоните, използвани в условие за съединение да имат същото име или същия тип данни. Ако обаче типовете данни не са идентични, те трябва да бъдат съвместими или да могат да бъдат неявно преобразувани от SQL Server. Ако типовете данни не могат да бъдат неявно преобразувани, условието за съединение трябва явно да преобразува типа данни чрез използване на функция CAST. 2. Видове съединения Повечето съединения могат да се категоризират като:  вътрешни (inner joins);  външни (outer joins). Вътрешните съединения връщат редове само когато има поне един ред от двете таблици, който отговаря на условието за съединение, като елиминират редовете, които не съответстват на ред от другата таблица. Външните съединения връщат всички редове от поне една от таблиците или изгледите, посочени в клауза FROM, при условие, че тези редове отговарят на някое от условията за търсене в WHERE или HAVING. Можете също да създавате:  кръстосани съединения (cross-joins)  съединения на таблица със самата нея (self-joins). Повече информация за cross-joins и self-joins ще намерите в SQL Server Books Online. 3. Вътрешни съединения Вътрешното съединение (inner join) е съединение, при което стойностите в колоните, които се съединяват, се сравняват с помощта на оператор за сравнение. В стандарта SQL-92 вътрешните съединения могат да бъдат задавани или в клауза FROM, или в клауза WHERE. Пример 1. Следващата конструкция SELECT използва вътрешно съединение за извличане на данни от таблица Publishers и таблица Titles в база данни Pubs: Use Pubs SELECT t.Title, p.Pub_name FROM Publishers AS p INNER JOIN Titles AS t ON p.Pub_id = t.Pub_id ORDER BY Title ASC Тази конструкция SELECT извлича данни от колона Title в таблица Titles (псевдоним t) и от колона Pub_name в таблица Publishers (псевдоним р). Поради това, че конструкцията използва вътрешно съединение, тя връща само тези редове, които имат еднаква стойност в общите колони (колона p.Pub_id и колона t.Pub_id). Какво ще направи клаузата ORDER BY Title ASC? 4. Външни съединения SQL Server поддържа три вида външни съединения: ляво съединение (left join), дясно съединение (right join) и пълно съединение (full join). Всички редове, извлечени от лявата таблица, се указват чрез ляво външно (left outer) съединение, а всички редове от дясната
  • 3. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич www.pglomonosov.org Красимир Дойчев SQL Server Съединения на две или повече таблици 3 от 4 таблица се указват в дясно външно (right outer) съединение. Всички редове от двете таблици се връщат при пълно външно (full outer) съединение. 4.1. Използване на леви външни съединения В набора от резултати, генериран от една конструкция SELECT, в която има съединение left outer, се включват всички редове от таблицата, указана вляво на LEFT OUTER JOIN. Единствените редове, които се извличат от таблицата вдясно, са тези, които отговарят на условието за съединение. Пример 2. В следващата конструкция SELECT е използвано съединение left outer, за да се извлекат имената Au_fname (author first name) и фамилиите Au_lname (last name) на авторите, и (там, където е приложимо) имената на всички издатели Pub_name (publisher name), които се намират в същите градове, където са и авторите: USE Pubs SELECT a.Au_fname, a.Au_lname, p.Pub_name FROM Authors a LEFT OUTER JOIN Publishers p ON a.City = p.City ORDER BY p.Pub_name ASC, a.Au_lname ASC, a.Au_fname ASCНаборът от резултати на тази заявка ще съдържа имената на всички автори от таблица Authors. Той ще включва обаче само тези издатели, които се намират в същите градове от които са авторите. Ако местоположението на даден издател е различно от града на автора в колона Pub_name на набора от резултати се връща стойност Null. 4.2. Използване на десни външни съединения В набора от резултати, генериран от една конструкция SELECT, в която има дясно външно съединение, се включват всички редове от таблицата, указана вдясно на RIGHT OUTER JOIN. Единствените редове, които се извличат от таблицата вляво, са тези, които отговарят на условието за съединение. Пример 3. В следващата конструкция SELECT е използвано дясно външно съединение, за да се извлече списъкът на издателите и имената на авторите, ако тези автори живеят в същите градове като издателите USE Pubs SELECT a.Au_fname, a.Au_lname, p.Pub_name FROM Authors a RIGHT OUTER JOIN Publishers p ON a.City = p.City ORDER BY p.Pub_name ASC, a.Au_lname ASC, a.Au_fname ASC Наборът от резултати на тази заявка ще съдържа името на всеки издател от таблица Publishers. Той ще включва обаче само тези автори, които се намират в същите градове като издателите. Ако някой автор не се намира в града на издателя, в колони Au_fname и Aulname на набора от резултати се връщат стойности null. 4.3. Използване на пълни външни съединения В набора от резултати, генериран от една конструкция SELECT, в която има пълно външно съединение, се включват всички редове от двете таблици, независимо от това дали таблиците имат съвпадащи стойности (както е дефинирано в условието за съединение).
  • 4. Професионална гимназия по механотехника и електротехника "М. В. Ломоносов" - гр. Добрич www.pglomonosov.org Красимир Дойчев SQL Server Съединения на две или повече таблици 4 от 4 Пример 4. В следващата конструкция SELECT е използвано пълно външно съединение, за да се извлече списък с издателите и имената на авторите: USE Pubs SELECT a.Au_fname, a.Au_lname, p.Pub_name FROM Authors a FULL OUTER JOIN Publishers p ON a.City = p.City ORDER BY p.Pub_name ASC, a.Au_lname ASC, a.Au_fname ASC Наборът от резултати на тази заявка ще съдържа името на всеки издател от таблица Publishers и на всеки автор от таблица Authors. Ако някой автор не се намира в града на издателя, в колони Au_fname и Au_lname на набора от резултати се връщат стойности null. Ако някой издател не се намира в града на автора, в колона Pub_name на набора от резултати се връща стойност null. Когато условието за съединение е изпълнено, всички колони в набора от резултати ще съдържат стойност. ЛИТЕРАТУРА 1. Microsoft. MSCE Microsoft SQL Server 2000 Проектиране и реализация на бази данни Training kit. С., Софтпрес, 2001. 2. SQL Server Books Online