Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных / 04 Язык SQL.ppt
Скачиваний:
67
Добавлен:
22.03.2015
Размер:
636.42 Кб
Скачать

Соединения

FROM <источник данных>

Вобщем виде предложение FROM может содержать различные источники данных

<источник данных> ::=

<имя таблицы> [[AS] <псевдоним>] |

<подзапрос> [AS] <псевдоним>|

<соединение таблиц> | …

<соединение таблиц> ::= <источник данных> <тип соединения><источник данных>

ON <предикат соединения> |

<источник данных> CROSS JOIN <источник данных>

Соединения

<тип соединения> ::=

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

INNER – (по умолчанию) внутреннее соединение. Выбираются пары строк, для которых выполняется условие соединения, заданное предикатом (ON <предикат> )

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

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

FULL – полное открытое соединение: в результат включается внутреннее соединение таблиц, к которому добавляются строки из левой таблицы, не вошедшие во внутреннее соединение, и строки из правой таблицы, не вошедшие во внутреннее соединение, которые дополняются значениями NULL в соответствии со схемой результирующей таблицы.

Соединения

Концептуальная схема базы данных для примеров

E =<[ФИО], [Дисц], [Оценка]> - результаты сдачи экзаменов G=<[ФИО], [Группа]> - состав группы

P=<[Группа], [Дисц]> - набор дисциплин, по которым надо сдавать экзамены группам

Получить список студентов, которым надо сдавать экзамены

SELECT [ФИО], [Дисц]

FROM G INNER JOIN P ON G.[Группа] = P.[Группа]

Получить список студентов имеющих несколько двоек

SELECT DISTINCT a.[ФИО]

FROM E a INNER JOIN E b ON a.[ФИО] = b.[ФИО]

WHERE a.[Дисц] <> b.[Дисц] AND a.[Оценка] <=2 AND b.[Оценка] <=2

Получить план сдачи экзаменов для всех студентов

SELECT G.[ФИО], P.[Дисц]

FROM G LEFT JOIN P ON G.[Группа] = P.[Группа]

Результат

левого

соединения

Петров ВТ-100 ВТ-100 БД Петров ВТ-100 ВТ-100 ОС Сидров ВТ-200 NULL NULL

Соединения

Получить результаты сдачи сессии для всех студентов (включая тех, кто должен был сдавать, но не сдавал экзамены)

SELECT G.[ФИО], P.[Дисц], E.[Оценка]

FROM G INNER JOIN P ON G.[Группа] = P.[Группа] LEFT JOIN E ON G.[ФИО] = E.[ФИО] AND P.[Дисц] = E. [Дисц]

Соединения

Концептуальная схема базы данных «Библиотека»

Publications = <isbn, title, author>

(ISBN – уникальный код издания, название, автор)

Readers = <reader_id, name>

(номер читательского билета, фамилия читателя)

Exemplars = <inv, isbn, reader_id, date_out> (инвентарный номер – естественный первичный ключ, ISBN издания, номер читательского билета, дата выдачи)

Соединения

Для всех экземпляров книг и для всех читателей показать, какие книги есть у читателей и где находятся книги

SELECT Readers.name, Exemplars.inv FROM Readers FULL JOIN Exemplars

ON Readers.reader_id = exemplars.reader_id

4

Иванов

112

1-561

4

1.01.2001

4

Иванов

201

5-318

4

2.10.2002

5

Петров

NULL

NULL

NULL

NULL

NULL

NULL

414

2-456

NULL

NULL

Агрегатные функции

Агрегатные функции (обобщающие функции):

COUNT({[ALL | DISTINCT] <имя атрибута> | *}) – количество строк с непустыми значениями атрибута. Если *, то количество всех строк таблицы, не зависимо от содержания. Для числовых и символьных атрибутов

SUM([ALL | DISTINCT] <имя атрибута>) – сумма значений. Для числовых атрибутов

AVG([ALL | DISTINCT] <имя атрибута>) – среднее значение. Для числовых атрибутов

MIN(<имя атрибута>) – минимальное значение. Для числовых и символьных атрибутов. [ALL | DISTINCT] можно использовать, но не имеет смысла

MAX(<имя атрибута>) – максимальное значение. Для числовых и символьных атрибутов. [ALL | DISTINCT] можно использовать, но не имеет смысла

Применяются к результату выборки, либо к группам (если есть)

Агрегатные функции

Сколько раз студенты сдавали экзамен

SELECT COUNT(*) FROM E

SELECT COUNT(*) AS number FROM E

Получить количество дисциплин, по которым есть 2 (ошибочный вариант)

SELECT COUNT([Дисц]) as count FROM E WHERE [Оценка] = 2

Получить количество дисциплин, по которым есть 2, без повторения

SELECT COUNT(DISTINCT [Дисц]) as count FROM E

WHERE [Оценка] = 2

Общее количество баллов, набранных студентом

SELECT SUM([Оценка]) AS summa FROM E WHERE [ФИО] = ‘Петров П.П.’

Количество дисциплин и общая сумма баллов одного студента

SELECT COUNT([Дисц]) AS count, SUM([Оценка]) AS summa FROM E WHERE [ФИО] = ‘Петров П.П.’

Характеристики сдачи экзаменов

SELECT MIN([Оценка]) AS minimum, MAX([Оценка]) AS maximum, AVG([Оценка]) AS average FROM E

WHERE [ФИО] = ‘Петров П.П.’

Группировка результатов

Исходные таблицы

Порядок выполнения операций

Результат операции над таблицами

FROM

Оставшиеся

 

 

 

 

 

 

строки

 

 

 

WHERE

 

 

 

 

 

Группы

 

GROUP BY

z

2

 

 

a

2

Указываются столбцы,

 

b

5

 

u

1

по которым выполняется

 

 

m

1

 

 

группировка строк

 

HAVING

Имена столбцов, указанные в GROUP BY, или использующие их функции, в т.ч. агрегирующие

Оставшиеся

группы

z

2

 

a

2

Сортированный

b

5

результат

 

ORDER BY

z

2

 

 

a

2

Проекция

 

 

 

 

b

5

 

SELECT 25

Группировка результатов

Подсчитать по каждой дисциплине количество студентов, сдававших экзамен

SELECT [Дисц], COUNT(*) AS counter FROM E

GROUP BY [Дисц]

По каждой дисциплине посчитать количество положительных оценок

SELECT [Дисц], COUNT(*) FROM E

WHERE [Оценка] > 2 GROUP BY [Дисц]

После группировки

Иванов

БД

4

Петров

БД

2

Иванов

ОС

5

Сидоров

ОС

3