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