ЛЕКЦИЯ 10. Язык SQL (продолжение)



 

10.1 Объединения и стандарт SQL2

10.2 Итоговые запросы на чтение. Агрегатные функции

10.3 Запросы с группировкой (предложение GROUP BY)

10.4 Вложенные запросы

 

Объединения и стандарт SQL2

 

В стандарте SQL2 был определен совершенно новый метод поддержки внешних объединений, который не опирался ни на одну популярную СУБД. В спецификации стандарта SQL2 поддержка внешних объединений осуществлялась в предложении FROM с тщательно разработанным синтаксисом, позволявшим пользователю точно определить, как исходные таблицы должны быть объединены в запросе. Расширенное предложение FROM поддерживает также операцию UNION над таблицами и допускает сложные комбинации запросов на объединение операторов SELECT и объединений таблиц.

 

Внутренние объединения в стандарте SQL2

Две объединяемые таблицы соединяются явно посредством операции JOIN, а условие поиска, описывающее объединение, находится теперь в предложении ON внутри предложения FROM В условии поиска, следующем за ключевым словом ON, могут быть заданы любые критерии сравнения строк двух объединяемых таблиц.

Например: вывести список фамилий студентов, и названия групп, к которых они учаться.

SELECT StName, GrName

FROM Students INNER JOIN Groups

ON Students.GrNo = Groups.GrNo

(В этих простых двухтабличных объединениях все содержимое предложения WHERE просто перешло в предложение ON, и предложение ON не добавляет ничего нового в язык SQL.

Стандарт SQL2 допускает еще один вариант запроса на простое внутреннее объединение таблиц Students и Groups. Так как связанные столбцы этих таблиц имеют одинаковые имена и сравниваются на предмет равенства (что делается довольно часто), то можно использовать альтернативную форму предложения ON, в которой задается список имен связанных столбцов:

SELECT StName, GrName

FROM Students INNER JOIN Groups USING (GrNo)

Ниже приведен синтаксис оператора JOIN:

1. естественное соединение.

FROM спецификация_таблиц,…,

таблица1

NATURAL {INNER|FULL[OUTER]|LEFT[OUTER]|RIGHT[OUTER]}JOIN

таблица2 …

2. соединение с использованием выражения.

FROM спецификация_таблицы,…,

таблица1

{INNER|[OUTER] FULL|[OUTER]LEFT|[OUTER]RIGHT} JOIN

таблица2

ON условие | USING(список_столбцов),…

3. объединение или декартово произведение.

FROM спецификация_таблицы,…,

таблица1 {UNION | CROSS JOIN} таблица2 ,…

Объединение двух таблиц, в котором связанные столбцы имеют идентичные имена, называется естественным объединением, так как обычно это действительно самый "естественный" способ объединения двух таблиц. Запрос на выборку пар фамилия студента/название группы, в которой он учиться, можно выразить как естественное объединение следующим образом:

SELECT StName, GrName

FROM Students NATURAL INNER JOIN Groups

 

Внешние объединения в стандарте SQL2

Стандарт SQL2 обеспечивает полную поддержку внешних объединений, расширяя языковые конструкции, используемые для внутренних объединений. Например, для построения таблицы подчиненности преподавателей можно применить следующий запрос:

SELECT Chief.TName, SubOrdinate.TName

FROM Teachers AS Chief FULL OUTER JOIN Teachers AS SubOrdinate

ON Chief.TNo = SubOrdinate.TChiefNo

Результат такого запроса (данные из Приложения А) приведен на рис. 10.1.

 

Chief.TName SubOrdinate.TName
NULL Иванов
Иванов Петров
Петров Стрельцов
Петров Сидоров
Сидоров NULL
Стрельцов NULL

 

рис. 10.1 Результатом такого запроса на внешнее объединение.

 

Таблица результатов запроса будет содержать по одной строке для каждой связанной пары начальник/подчиненный, а также по одной строке для каждой несвязанной записи для начальника или подчиненного, расширенной значениями NULL в столбцах другой таблицы.

Ключевое слово OUTER, так же как и ключевое слово INNER, в стандарте SQL2 не является обязательным. Поэтому предыдущий запрос можно, было бы переписать следующим образом:

SELECT Chief.TName, SubOrdinate.TName

FROM Teachers AS Chief FULL JOIN Teachers AS SubOrdinate

ON Chief.TNo = SubOrdinate.TChiefNo

По слову FULL СУБД сама определяет, что запрашивается внешнее объединение.

Вполне естественно, что в стандарте SQL2 левое и правое внешние объединения обозначаются словами LEFT и RIGHT вместо слова FULL. Вот вариант того же запроса, определяющий левое внешнее объединение:

SELECT Chief.TName, SubOrdinate.TName

FROM Teachers AS Chief LEFT OUTER JOIN Teachers AS SubOrdinate

ON Chief.TNo = SubOrdinate.TChiefNo

В результате такого запроса (данные из Приложения А.) будет получено следующее отношение (рис. 10.2).

 

Chief.TName SubOrdinate.TName
Иванов Петров
Петров Стрельцов
Петров Сидоров
Сидоров NULL
Стрельцов NULL

 

рис. 10.2 Результатом такого запроса на внешнее объединение

 


Дата добавления: 2018-09-22; просмотров: 236; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!