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