Многотабличные запросы SQL. Соединения таблиц. Самосоединения. Псевдонимы

 

Запросы могут выбирать данные изнескольких таблиц. Эти таблицы должны быть перечислены после слова FROM. Если таблицы не связаны между собой, то результатом запроса будут всевозможные комбинации (декартово произведение) записей отдельных таблиц, что не имеет практического смысла.

Снова рассмотрим отношения по поставщикам S (S# , Sn, Scity), изделиям P (P#, Pn, Pcity, W) и поставкам SP (S#, P#, Q). Здесь S# - номер поставщика, Sn – его имя, Scity – место проживания, P# - номер изделия, Pn – его наименование, Pcity – место хранения, W – вес, Q – объем поставки.

Пусть требуется получить список поставок поставщиков из Москвы с указанием имени поставщика. Запрос

SELECT S.S#, Sn, P#, Q FROM S, SP WHERE Scity =’Москва’

присоединит к каждому поставщику из Москвы все поставки из таблицы SP независимо от места проживания поставщика, что, очевидно, не соответствует заданию. Правильным решением является запрос

SELECT S.S#, Sn, P#, Q FROM S, SP WHERE Scity =’Москва’ AND S.S#=SP.S#

Условие S.S#=SP.S# обеспечивает связь таблиц S и SP, что соответствует операции соединения реляционной алгебры. Если атрибут присутстствует более чем в одной таблице, сначала указывается имя таблицы, а затем после точки имя атрибута.

Как и в реляционной алгебре, возможно и θ-соединение таблиц, где θ задает знак операции сравнения (‘<’, ’>’ и т. п.), но такой вариант соединения редко применяется на практике. Для соединений таблиц имеются и другие синтаксические конструкции, которые будут описаны ниже. Рассмотрим еще два примера.

1. Найти список поставщиков из Казани, поставляющих изделие с номером P2

SELECT Sname FROM S, SP WHERE

S.S#=SP.S# AND

Scity =’Казань’ AND

P# = P1

Здесь выбирается поле Sname из таблицы S, но в качестве источника данных указывается и таблица SP, поскольку условия выборки и связи используют поля этой таблицы.

2. Получить список поставок объема более 100 единиц с указанием имен поставщиков и наименований деталей

SELECT Sname, Pname, Q FROM S, P, SP WHERE

S.S#=SP.S# AND

P.P#=SP.P# AND

Q > 100

Соединение таблиц может быть и по нескольким атрибутам. Например, деталь в разных таблицах может идентифицироваться двумя атрибутами совместно: номером изделия и номером детали в изделии.

Таблица может соединяться и сама с собой. Рассмотрим для примера таблицу сотрудников и их непосредственных руководителей S (S#, Sname, Shef#), где S# - номер сотрудника, Sname – его имя, Shef# - номер руководителя. Пусть требуется дать полный список имен сотрудников и их руководителей.

Если бы существовали две копии этой таблицы S1 и S2, то решением был бы запрос

SELECT S1.Sname, S2.Sname FROM S1, S2 WHERE S1.Shef# = S2.S#

А как обойтись без копирования содержимого таблицы S?

Для подобных случаев в SQL введены локальные псевдонимы или алиасы таблиц. Псевдоним действует в пределах запроса и позволяет обращаться к одной и той же таблице, как к двум разным таблицам. При использовании псевдонимов S1 и S2 в нашем случае вид запроса почти не изменится

SELECT S1.Sname, S2.Sname FROM S S1, S S2 WHERE S1.Shef# = S2.S#