Разработка базы данных. Структурированные запросы
Что проверяют по спецификации:
Суть за минуту
Разработка базы данных идёт от реального мира к таблицам: сначала изучают предметную область, рисуют ER-диаграмму (сущности, их атрибуты и связи), затем превращают её в таблицы с ключами и типами данных и только потом заполняют и обрабатывают. Работают с БД на языке структурированных запросов SQL. Команды CREATE TABLE создают структуру, INSERT, UPDATE и DELETE добавляют, изменяют и удаляют записи, а SELECT извлекает данные: WHERE фильтрует, ORDER BY сортирует, LIMIT ограничивает, DISTINCT убирает повторы, COUNT, SUM, AVG, MIN, MAX считают итоги, GROUP BY и HAVING группируют, JOIN соединяет таблицы. Для пользователей поверх запросов строят формы для ввода и отчёты для печати. Типичная задача ЕНТ — по таблице и запросу определить, сколько записей или какое значение он выведет.Объясняем просто
SQL-запрос — это вежливая просьба к библиотекарю: «ИЗ каталога учеников ВЫБЕРИ имена ТЕХ, КТО из Астаны, и РАССТАВЬ по баллам» — SELECT name FROM students WHERE city = 'Астана' ORDER BY score.
Сначала чертёж
До создания таблиц рисуют ER-диаграмму: прямоугольники — сущности (Ученик, Курс), овалы — атрибуты (имя, балл), ромбы или линии — связи (записан на).
Четыре глагола
CREATE — построить таблицу, INSERT — вписать строку, UPDATE — исправить, DELETE — стереть. SELECT ничего не меняет, только показывает.
SELECT по частям
SELECT что показать, FROM откуда, WHERE какие строки, GROUP BY как сгруппировать, HAVING какие группы оставить, ORDER BY как упорядочить, LIMIT сколько вывести.
Итоги одной строкой
COUNT считает строки, SUM складывает, AVG находит среднее, MIN и MAX — крайние значения. С GROUP BY итог считается для каждой группы отдельно.
Понятия и термины
- Запрос
- требование на получение определённой информации из базы данных (или на её изменение), записанное, например, на языке SQL.
- SQL
- Structured Query Language — язык структурированных запросов для создания, изменения и выборки данных в реляционных базах данных.
- ER-диаграмма
- схема «сущность–связь»: изображает сущности предметной области, их атрибуты и связи между ними; используется при проектировании БД.
- Сущность
- класс однотипных объектов предметной области, о которых хранится информация (Ученик, Курс, Книга); в БД становится таблицей.
- Атрибут
- свойство сущности (имя, класс, балл); в БД становится полем таблицы.
- Агрегатная функция
- функция, вычисляющая одно значение по множеству строк: COUNT, SUM, AVG, MIN, MAX.
- Форма
- объект, позволяющий организовать комфортный для пользователя интерфейс для ввода, отображения и редактирования данных таблиц и запросов.
- Отчёт
- форматированное сочетание данных из одной или нескольких таблиц, выводимое на устройство отображения (экран, принтер) либо в файл.
Разбор темы
Этапы разработки базы данных 10 класс
1) Анализ предметной области: какие объекты есть (ученики, курсы, учителя), какую информацию о них хранить, какие запросы понадобятся. 2) Инфологическое (концептуальное) проектирование: ER-диаграмма. 3) Логическое проектирование: переход к таблицам, выбор полей, первичных и внешних ключей, нормализация. 4) Физическое проектирование: выбор СУБД, типов данных, индексов. 5) Создание таблиц (CREATE TABLE) и заполнение данными. 6) Создание запросов, форм и отчётов; тестирование.
Однотабличная БД (цель 10.3.2.2) подходит для простых списков: телефонный справочник, список книг. Как только в таблице начинают повторяться одни и те же данные (название курса и фамилия учителя в каждой строке), её разбивают на несколько связанных таблиц — получается многотабличная БД (цель 10.3.2.3).
ER-диаграмма: сущности, атрибуты, связи 10 класс
Сущность изображают прямоугольником, атрибут — овалом (или списком внутри прямоугольника), ключевой атрибут подчёркивают, связь — ромбом или линией с подписью. На концах линии указывают кратность: 1 или М (N, «вороньи лапки»).
Пример «Школа»: сущности Ученик(id, имя, класс, город, балл) и Курс(id, название, учитель); связь «записан на» типа М:М с собственным атрибутом «оценка». При переходе к таблицам каждая сущность становится таблицей (students, courses), атрибуты — полями, а связь М:М — отдельной таблицей enroll(student_id, course_id, mark).
Правила перехода: связь 1:М — внешний ключ в таблицу на стороне «М»; связь 1:1 — внешний ключ в любую из таблиц (или объединение таблиц); связь М:М — новая таблица-связка с двумя внешними ключами, которые вместе образуют составной первичный ключ.
Создание и изменение данных: CREATE, INSERT, UPDATE, DELETE 10 класс
Команды SQL делятся на группы: DDL — описание структуры (CREATE TABLE, ALTER TABLE, DROP TABLE) и DML — работа с данными (SELECT, INSERT, UPDATE, DELETE). Ключевые слова принято писать заглавными буквами, команда завершается точкой с запятой, строковые значения берутся в одинарные кавычки.
CREATE TABLE students(
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
grade INTEGER,
city TEXT,
score INTEGER
);INSERT INTO students(name, grade, city, score) VALUES ('Алия', 11, 'Астана', 117); — добавляет одну запись (можно перечислить несколько наборов VALUES через запятую). UPDATE students SET score = score + 10 WHERE city = 'Шымкент'; — меняет значения в отобранных записях. DELETE FROM enroll WHERE mark < 4; — удаляет отобранные записи.
Главная опасность: UPDATE и DELETE без WHERE действуют на ВСЕ записи таблицы. DELETE FROM students; очищает таблицу целиком (структура остаётся), а DROP TABLE students; удаляет и саму таблицу. Ограничения NOT NULL, PRIMARY KEY, UNIQUE, FOREIGN KEY ... REFERENCES не дают внести некорректные данные.
SELECT: выборка, сортировка, DISTINCT, LIMIT 10 класс
Общий вид: SELECT поля FROM таблица WHERE условие GROUP BY поле HAVING условие ORDER BY поле LIMIT n; — части пишутся именно в таком порядке, обязательны только SELECT и FROM. * означает все поля. AS даёт столбцу псевдоним: SELECT name AS ученик.
ORDER BY сортирует по возрастанию (ASC, по умолчанию) или убыванию (DESC); можно по нескольким полям: ORDER BY grade, score DESC. LIMIT n оставляет первые n строк результата — вместе с ORDER BY DESC это «топ-n». DISTINCT убирает повторяющиеся строки: SELECT DISTINCT city FROM students выведет 3 строки, а без DISTINCT — 8.
Порядок, в котором СУБД логически выполняет запрос: FROM (и JOIN) → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT. Поэтому WHERE не может использовать агрегатные функции, а LIMIT срабатывает после сортировки.
Условия: сравнения, AND/OR/NOT, BETWEEN, IN, LIKE 10 класс
В WHERE используют =, <> (или !=), >, <, >=, <= и логические AND, OR, NOT (приоритет NOT → AND → OR, скобки меняют порядок).
BETWEEN a AND b — значение в диапазоне от a до b ВКЛЮЧИТЕЛЬНО: score BETWEEN 91 AND 112 отберёт Нурлана (97), Дану (112), Мадину (103) и Санжара (91) — 4 записи. IN (список) — значение совпадает с одним из перечисленных: city IN ('Астана', 'Шымкент') то же, что два условия через OR. NOT IN — не совпадает ни с одним.
LIKE — сравнение строки с шаблоном: % — любое число любых символов (в том числе ноль), _ — ровно один символ. name LIKE 'А%' — начинается на «А» (Айгерим, Аружан); name LIKE '%н' — кончается на «н» (Нурлан, Ерлан, Аружан); name LIKE '_а%' — вторая буква «а» (Дана, Мадина, Санжар). В конструкторе запросов Access вместо % и _ используются * и ?, как в масках файлов.
IS NULL / IS NOT NULL проверяют пустое значение; сравнение = NULL не работает.
Агрегатные функции, GROUP BY и HAVING 10 класс
Агрегатные функции сворачивают много строк в одно значение: COUNT(*) — число строк, COUNT(поле) — число непустых значений, SUM — сумма, AVG — среднее, MIN, MAX — наименьшее и наибольшее. Для students: COUNT(*) = 8, SUM(score) = 816, AVG(score) = 102, MAX = 135, MIN = 66.
GROUP BY разбивает строки на группы с одинаковым значением поля и считает агрегат для каждой группы; в результате столько строк, сколько групп. SELECT city, COUNT(*) FROM students GROUP BY city → 3 строки: Алматы 3, Астана 3, Шымкент 2.
HAVING фильтрует уже готовые группы по агрегату, а WHERE — отдельные строки до группировки. ... GROUP BY city HAVING AVG(score) > 100 → Алматы (≈107,7) и Шымкент (107,5); Астана (≈92,7) отсекается. Запомните: условие с COUNT/SUM/AVG/MIN/MAX — в HAVING, обычное условие — в WHERE.
Соединение таблиц: JOIN 10 класс
JOIN (INNER JOIN) соединяет строки двух таблиц, у которых совпадают значения связанных полей: FROM enroll JOIN students ON students.id = enroll.student_id. В результат попадают только пары, нашедшие «партнёра». Чтобы различать одноимённые поля, пишут таблица.поле (students.id, courses.id).
SELECT students.name, courses.title, enroll.mark
FROM enroll
JOIN students ON students.id = enroll.student_id
JOIN courses ON courses.id = enroll.course_id
WHERE enroll.mark = 5;Этот запрос выводит 7 строк: Айгерим — Математика и Информатика, Дана — Информатика, Аружан — Математика, Информатика и Физика, Санжар — История. LEFT JOIN оставляет все строки левой таблицы, даже если пары нет (недостающие поля будут NULL).
JOIN часто сочетают с GROUP BY: средняя оценка по каждому курсу — Информатика 4,5, История ≈4,33, Математика 4,25, Физика 4,0.
Формы, отчёты и связь с веб-страницей 10 класс
Форма (цель 10.3.2.4) — окно для удобного ввода и просмотра данных: поля ввода, выпадающие списки, флажки, кнопки «Сохранить», «Следующая запись». Пользователь не видит таблицу целиком и меньше ошибается; за кнопкой «Сохранить» стоит команда INSERT или UPDATE.
Отчёт (цель 10.3.2.5) — оформленный для печати или экспорта результат запроса: заголовок, группировка (например, по городам), промежуточные и общие итоги (COUNT, AVG), колонтитулы. Отчёт только показывает данные, изменить их через отчёт нельзя.
Связь веб-страницы с БД (цель 10.3.3.2): пользователь заполняет HTML-форму <form> → браузер отправляет данные на сервер → серверный скрипт (PHP, Python) формирует SQL-запрос к СУБД (MySQL, PostgreSQL) → результат превращается в HTML-страницу. Так работают интернет-магазины и электронные журналы. Данные из формы нельзя вставлять в запрос напрямую — это открывает дорогу атаке SQL-инъекция; используют параметризованные запросы.
Примеры задач с решением
SELECT DISTINCT city FROM students;?- В поле city 8 значений: Астана ×3, Алматы ×3, Шымкент ×2.
- DISTINCT оставляет по одному экземпляру каждого значения.
SELECT name FROM students ORDER BY score DESC LIMIT 3;?- Сортировка по убыванию балла: Аружан 135, Айгерим 128, Дана 112, Мадина 103, …
- LIMIT 3 оставляет первые три строки.
SELECT name FROM students WHERE score BETWEEN 91 AND 112;?- BETWEEN включает границы: нужны баллы от 91 до 112.
- Подходят: Нурлан 97, Дана 112, Мадина 103, Санжар 91.
- Не подходят: 128, 84, 135, 66.
SELECT COUNT(*) FROM enroll WHERE mark = 5;?- Перебираем оценки в enroll: (1,1,5), (1,2,5), (3,2,5), (5,1,5), (5,2,5), (5,3,5), (8,4,5).
- Строк с mark = 5 семь.
SELECT city, AVG(score) FROM students GROUP BY city HAVING AVG(score) > 100;?- Алматы: (97 + 135 + 91) / 3 = 323 / 3 ≈ 107,7.
- Астана: (128 + 84 + 66) / 3 = 278 / 3 ≈ 92,7. Шымкент: (112 + 103) / 2 = 107,5.
- HAVING оставляет группы со средним больше 100.
SELECT name FROM students WHERE name LIKE '%н';?%н— любое начало, последняя буква «н».- Нурлан, Ерлан, Аружан оканчиваются на «н»; Айгерим, Дана, Тимур (м), Мадина, Санжар (р) — нет.
Сложные задачи: шаг за шагом
UPDATE students SET score = score + 10 WHERE city = 'Шымкент'; и затем SELECT COUNT(*) FROM students WHERE score > 110;. Какое число будет выведено?Идея: Сначала аккуратно применяем изменение только к отобранным записям, потом считаем по новым данным.
- UPDATEШымкент: Дана 112 → 122, Мадина 103 → 113. Остальные записи не меняются.
- Условие score > 110Айгерим 128, Дана 122, Аружан 135, Мадина 113. Нурлан 97, Ерлан 84, Тимур 66, Санжар 91 — нет.
- ЛовушкаДо UPDATE ответ был бы 3 (Мадина не проходила). Порядок команд важен.
SELECT courses.title, AVG(enroll.mark) FROM courses JOIN enroll ON courses.id = enroll.course_id GROUP BY courses.title HAVING AVG(enroll.mark) >= 4.3; и какие это курсы?Идея: JOIN сопоставляет каждой оценке название курса, GROUP BY собирает оценки по курсам, HAVING фильтрует группы.
- Группируем оценки по course_idМатематика (1): 5, 4, 3, 5 → 17/4 = 4,25. Информатика (2): 5, 5, 5, 3 → 18/4 = 4,5.Физика (3): 3, 5, 4 → 12/3 = 4,0. История (4): 4, 4, 5 → 13/3 ≈ 4,33.
- HAVING ≥ 4.3Проходят Информатика (4,5) и История (≈4,33).
DELETE FROM enroll WHERE mark < 4;. Сколько записей осталось в enroll и сколько учеников после этого вообще не имеют записей?Идея: Удаляем строки с оценкой 3, затем проверяем, у кого не осталось ни одной строки.
- Что удаляетсяОценки 3: (2,3,3), (4,1,3), (6,2,3) — 3 строки. Было 14, осталось 11.
- Кто остался без записейУченик 2 сохранил (2,1,4), ученик 4 — (4,4,4). У ученика 6 (Тимур) была одна запись, и она удалена.
- Проверка на SQL
SELECT name FROM students WHERE id NOT IN (SELECT student_id FROM enroll);
Частые ловушки на ЕНТ
- Пишут условие с агрегатом в WHERE (
WHERE AVG(score) > 100). Условия на COUNT/SUM/AVG/MIN/MAX ставятся в HAVING после GROUP BY. - Забывают, что BETWEEN включает обе границы:
BETWEEN 91 AND 112отбирает и 91, и 112. - Выполняют UPDATE или DELETE без WHERE — изменятся или удалятся все записи таблицы.
- Путают шаблоны: в SQL
%— любое число символов,_— ровно один;*и?— это маски файлов и конструктор Access. - Считают строки после GROUP BY по числу исходных записей. Строк в результате столько, сколько групп (после HAVING — ещё меньше).
Запомнить
SELECT … FROM … WHERE … GROUP BY … HAVING … ORDER BY … LIMIT; WHERE — для строк, HAVING — для групп; % — любые символы, _ — один; BETWEEN включает границы.
Проверь себя
- UPDATE
- INSERT
- CREATE
- SELECT
Показать ответ
INSERT INSERT INTO … VALUES … добавляет строку; UPDATE изменяет существующие, CREATE создаёт таблицу.
SELECT * FROM students WHERE city IN ('Астана', 'Шымкент') AND score >= 100;?- 2
- 3
- 4
- 5
Показать ответ
3 Из Астаны и Шымкента: Айгерим 128, Ерлан 84, Тимур 66, Дана 112, Мадина 103. Балл ≥ 100 у Айгерим, Даны и Мадины — 3.
- WHERE
- ORDER BY
- HAVING
- DISTINCT
Показать ответ
HAVING HAVING фильтрует группы после GROUP BY; WHERE отбирает отдельные строки до группировки.
SELECT MAX(score) - MIN(score) FROM students;?- 69
- 51
- 135
- 102
Показать ответ
69 MAX = 135 (Аружан), MIN = 66 (Тимур); 135 − 66 = 69.
- LIKE 'а%'
- LIKE '%а'
- LIKE '_а%'
- LIKE '%а%'
Показать ответ
LIKE '_а%' _ — ровно один любой символ (первая буква), затем «а», затем % — что угодно.
- внешний ключ в таблице Курс
- внешний ключ в таблице Ученик
- отдельную таблицу-связку с двумя внешними ключами
- общий первичный ключ двух таблиц
Показать ответ
отдельную таблицу-связку с двумя внешними ключами М:М реализуется третьей таблицей (как enroll), содержащей ключи обеих сущностей.