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

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

Определить для каждой академической группы и дисциплины количество успешно сдавших экзамен и средний бал по дисциплине

SELECT G.[Группа], E.[Дисц], COUNT(*) AS counter, AVG([Оценка]) AS average

FROM G JOIN E

ON E.[ФИО] = G.[ФИО] WHERE E.[Оценка] > 2 GROUP BY G.[Группа], E.[Дисц]

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

Иванов

ВТ-100

Иванов

БД

5

Петров

ВТ-100

Петров

БД

3

Иванов

ВТ-100

Иванов

ОС

5

Кузнецов

ВТ-200

Кузнецов

БД

3

Результат

Группы самого

ВТ-100

БД

2

4

ВТ-100

ОС

1

5

низкого уровня

ВТ-200

БД

1

3

 

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

Для отбора групп используется HAVING. Агрегатная функция в HAVING вычисляется для каждой группы

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

SELECT DISTINCT G.[Группа] FROM E JOIN G

ON E.[ФИО] = G.[ФИО] WHERE E.[Оценка] = 2 GROUP BY G.[Группа], E.[Дисц]

HAVING COUNT(*) > 1

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

Внутренний запрос генерирует таблицу, используемую в предикате внешнего запроса в предложении WHERE или HAVING

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

SELECT [ФИО] FROM E a

WHERE [Оценка] > 2 GROUP BY [ФИО]

HAVING COUNT(*) = (SELECT COUNT(*) FROM G JOIN P

ON G.[Группа] = P.[Группа] WHERE G.[ФИО] = a.[ФИО])

Здесь вложенный запрос определяет количество экзаменов, которые должен сдавать студент a.[ФИО]

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

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

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

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

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

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

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

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

SELECT [ФИО] FROM G a JOIN P

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

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

NOT EXISTS (SELECT [ФИО] FROM E

WHERE [ФИО] = a.[ФИО] AND [Дисц] = ‘БД’)

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

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

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

SELECT DISTINCT a.[ФИО] FROM E a

WHERE 4 <=ALL (SELECT E.[Оценка] FROM E

WHERE E.[ФИО] = a.[ФИО])

Получить список дисциплин, которые были сданы студентами из группы ВТ-100

SELECT DISTINCT E.[Дисц] FROM E

WHERE [ФИО] IN (SELECT [ФИО] FROM G

WHERE [Группа] = ‘ВТ-100’)

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

Получить список студентов группы, в которой учится Иванов И.И.

SELECT G.[ФИО] FROM G

WHERE G.[Группа] = (SELECT G.[Группа] FROM G

WHERE G.[ФИО] = ‘Иванов И.И.’)

Здесь подзапрос всегда возвращает единственное значение – название группы, в которой числится ‘Иванов И.И.’

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

SELECT [ФИО], [Дисц], [Оценка] – (SELECT AVG(Оценка) FROM E) AS [Разность]

FROM E

WHERE [Оценка] > (SELECT AVG(Оценка) FROM E)

Операторы манипулирования данными

Добавление строк

INSERT INTO <имя таблицы> [(<список столбцов>)] VALUES (<список значений>)

INSERT INTO Exemplars (inv, isbn, reader_id, date_out) VALUES (202, ‘5-132’, 533, GetDate())

Если значения в порядке объявления столбцов

INSERT INTO Exemplars

VALUES (202, ‘5-132’, 533, GetDate())

Вставка из другой таблицы

INSERT INTO Readers (name) SELECT student_name FROM Students

Операторы манипулирования данными

Удаление

DELETE FROM <имя таблицы> [WHERE <предикат>]

Удалить одну запись

DELETE FROM G

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

Удалить студентов, имеющих две или более двоек

DELETE FROM G WHERE G.[ФИО] IN

(SELECT E.[ФИО] FROM E WHERE [Оценка]=2 GROUP BY E.[ФИО] HAVING COUNT(*) >=2)

Операторы манипулирования данными

Изменение значений в строке

UPDATE <имя таблицы>

SET <имя столбца> = <выражение>, … n [WHERE <предикат>]

Изменение в одной строке

UPDATE E

SET [Оценка] = 5, [Дисц] = ‘ОС’

WHERE [ФИО] = ‘Петров’ AND [Дисц] = ‘БД’

UPDATE E SET [Оценка] = [Оценка] + 1 WHERE [Дисц] = ‘БД’ AND [Оценка] < 5

Использование подзапроса

UPDATE E SET E.[Оценка] = [Оценка] + 1 WHERE E.[ФИО] IN

(SELECT G.[ФИО] FROM G

WHERE G.[Группа] IN (‘ВТ-100’, ‘ВТ-200’, ‘ВТ-300’))