- •Базы данных
- •Введение
- •Введение
- •Введение
- •Введение
- •Оператор SELECT
- •Оператор SELECT
- •Оператор SELECT
- •Оператор SELECT
- •Оператор SELECT
- •Соединения
- •Соединения
- •Соединения
- •Соединения
- •Соединения
- •Соединения
- •Агрегатные функции
- •Агрегатные функции
- •Группировка результатов
- •Группировка результатов
- •Группировка результатов
- •Группировка результатов
- •Вложенные запросы
- •Вложенные запросы
- •Вложенные запросы
- •Вложенные запросы
- •Вложенные запросы
- •Операторы манипулирования данными
- •Операторы манипулирования данными
- •Операторы манипулирования данными
- •Создание базы данных и таблиц
Соединения
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 |