Соединение таблиц в SQL и реализация теоретико-множественных операций.



 

Соединения

 

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

 

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

 

<источник данных> ::=
<имя таблицы> [[AS] <псевдоним>] |
<подзапрос> [AS] <псевдоним>|
<соединение> | …

 

<соединение> ::=
<источник данных><тип соединения><источник данных>
ON<предикат соединения> |
<источник данных>CROSSJOIN<источник данных>

 

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

[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 aINNER 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.[Группа]

 

Эквивалентная реализация соединения

 

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

SELECT [ФИО], [Дисц] FROM G,P WHERE G.[Группа] = P.”Группа”

SELECT [ФИО], [Дисц] FROM G CROSS JOIN P WHERE G.[Группа] = P.”Группа”

SELECT [ФИО], [Дисц] FROM G JOIN P ON G.[Группа] = P.”Группа”

 

Операция соединения выполняется быстрее декартова произведения.

 

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

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

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

SELECT Readers.name, Exemplars.inv
FROM Readers FULL JOIN Exemplars
ON Readers.reader_id = exemplars.reader_id

 

 

Агрегатные функции и группировка данных в SQL.

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

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

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

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

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

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

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

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

FROM E

GROUPBY [Дисц]

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

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

FROM E

WHERE [Оц] > 2

GROUP BY [Дисц]

Имя Дисц Оц
Иванов БД 4
Петров БД 2
Иванов ОС 5
Сидоров ОС 3

 

 

12. Вложенные запросы в SQL.

С вложенными запросами используются предикаты:

EXISTS (<подзапрос>) – равен true, если результат подзапроса не пуст

<выражение><оператор сравнения> ALL (<подзапрос>) – равен true, если оператор сравнения возвращает true для всех возвращаемых подзапросом значений

<выражение><оператор сравнения> ANY (<подзапрос>) – равен true, если оператор возвращает true хотя бы для одного значения, возвращаемого подзапросом (эквивалент SOME)

<выражение> [NOT] IN (<подзапрос>) – возвращает true, если результат подзапроса содержит результат выражения

 

Получить список тех, кто должен был сдавать экзамен по БД, но пока еще не сдавал его

SELECT [ФИО]

FROM G a JOIN P

ONG.[Группа] = P.[Группа]

WHERE [Дисц] = ‘БД’ AND

       NOT EXISTS (SELECT [ФИО]

                              FROM E

                              WHERE [ФИО] = a.[ФИО] AND

                              [Дисц] = ‘БД’)

Здесь подзапрос возвращает либо одно значение (a.[ФИО] того, кто сдал экзамен), либо ни одного

 

Модель сущность-связь.

Сущность – класс однотипных объектов. Он имеет набор атрибутов

Атрибут – характеристика, определяющая свойство экземпляра сущности

Ключевой набор атрибутов – набор атрибутов, однозначно идентифицирующий экземпляр сущности

Связь – указывает как экземпляры сущностей соотносятся или взаимодействуют друг с другом

Тип связи (ассоциация) – обобщение связей между экземплярами сущностей

Дочерняя сущность (слабая сущность) – это сущность, которая зависит от другой сущности (не может существовать без другой сущности)

Родительская сущность (сильная сущность) – это сущность, которая не зависит от другой сущности

 

Дефект«разветвление»: имеет место тогда, когда модель отображает связь между сущностями, но путь между отдельными сущностями определен не однозначно (две и более ассоциации 1:N исходят из одной сущности)

Дефект«разрыв»: имеет место тогда, когда предполагается связь между сущностями, но нет пути между экземплярами этих сущностей.

Дефект возникает, если существует одна или несколько связей с минимальной кратностью, равной нулю (которая обозначает необязательное участие), и эти связи составляют часть пути между взаимосвязанными сущностями. Дефект устраняется введением недостающей ассоциации


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

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






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