SQL — DDL и DML
| English | Русский |
|---|---|
| SQL/ˌes kjuː ˈel/ | SQL |
| Data Definition Language/ˈdeɪtə ˌdefɪˈnɪʃn ˈlæŋɡwɪdʒ/ | Язык определения данных |
| Data Manipulation Language/ˈdeɪtə məˌnɪpjʊˈleɪʃn ˈlæŋɡwɪdʒ/ | Язык манипулирования данными |
| INNER JOIN/ˈɪnə dʒɔɪn/ | INNER JOIN |
| aggregate functions/ˈæɡrɪɡeɪt ˈfʌŋkʃnz/ | агрегатные функции |
Язык, который использовали программисты ваших бабушек и дедушек
- В 1974 году два исследователя IBM разработали язык запросов для таблиц Кодда и назвали его SEQUEL: Structured English Query Language. Название было сокращено до SQL, и этот язык никуда не исчез.
- Спустя пятьдесят лет каждый банк, авиакомпания, больница и веб-сайт, которыми вы пользуетесь, работают на нем. Студент, печатающий
SELECTсегодня, пишет то же самое выражение, которое написал программист до того, как родились ее родители. - Он состоит из двух частей, и на экзамене просят прочитать любую из них и написать обе: Язык определения данных, создающий структуру, и Язык манипулирования данными, заполняющий, изменяющий и запрашивающий данные.
- Этот урок представляет собой подмножество SQL по учебной программе, предложение за предложением, с указанием баллов за каждое из них.
DDL и DML
- СУБД осуществляет все создание и изменение структуры базы данных через свой DDL: создание базы данных, создание и изменение таблиц, добавление ключей.
- Она осуществляет все запросы и обслуживание данных через свой DML: выборку, вставку, обновление и удаление строк.
- SQL является отраслевым стандартом для обоих. Распределение выражения по нужной половине — частый вопрос на один балл:
CREATE TABLEэто DDL,SELECTэто DML.

Структура с одной стороны, данные — с другой
Что является частью языка определения данных (DDL)?
DDL изменяет структуру (CREATE, ALTER, DROP). SELECT/INSERT/UPDATE/DELETE — это DML (работа с данными).
DDL определяет структуру (например, CREATE TABLE), тогда как DML работает с данными внутри неё (SELECT, INSERT, UPDATE, DELETE).
Определение против Манипуляции: DDL формирует таблицы; DML читает и изменяет строки.
DDL: создание структуры
CREATE DATABASE Shop;
CREATE TABLE CUSTOMER (
CustomerID INTEGER,
Name VARCHAR(50),
Town VARCHAR(30),
Joined DATE,
Active BOOLEAN,
PRIMARY KEY (CustomerID)
);
ALTER TABLE CUSTOMER ADD Email VARCHAR(100);
- Типы данных по учебной программе:
CHARACTER(фиксированное количество символов),VARCHAR(n)(до n символов),BOOLEAN,INTEGER,REAL,DATE,TIME. PRIMARY KEY (field)называет ключ;ALTER TABLE … ADDдобавляет атрибут к существующей таблице.
Соотнесите каждый элемент данных с соответствующим типом данных SQL.
Два состояния, текст переменной длины, число с дробной частью, календарная дата. INTEGER используется для целых чисел, TIME — для времени суток.
Разобранный пример: две таблицы с внешним ключом
- Напишите SQL для создания таблицы
ORDERS, гдеOrderIDявляется первичным ключом,CustomerID— внешним ключом, ссылающимся наCUSTOMER, и добавьте столбецOrderDate.
CREATE TABLE ORDERS (
OrderID INTEGER,
CustomerID INTEGER,
OrderDate DATE,
PRIMARY KEY (OrderID),
FOREIGN KEY (CustomerID) REFERENCES CUSTOMER(CustomerID)
);
- Баллы:
CREATE TABLEс именем; каждый атрибут с подходящим типом;PRIMARY KEY;FOREIGN KEY … REFERENCES, указывающий имя таблицы и ее поля.
DML: запрос данных с помощью SELECT
SELECT Name, Town
FROM CUSTOMER
WHERE Town = 'London'
ORDER BY Name ASC;
SELECTперечисляет поля для вывода (*для всех),FROMназывает таблицу,WHEREоставляет только строки, удовлетворяющие условию,ORDER BYсортирует результат,ASCилиDESC.- Строки заключаются в одинарные кавычки; числа — нет. Операции сравнения:
=,<,>,<=,>=,<>; условия объединяются операторамиAND,OR,NOT;LIKE 'A%'совпадает с текстом, начинающимся с A;BETWEEN 10 AND 20задает диапазон.

Только строки, прошедшие проверку WHERE, попадают в результат
Какой ключевое слово SQL извлекает данные из таблицы? (одно слово)
SELECT перечисляет поля для извлечения; FROM называет таблицу.
Условие WHERE в операторе SELECT:
WHERE фильтрует строки по условию; ORDER BY сортирует; список SELECT выбирает столбцы.
Разобранный пример: напишите запрос
- Напишите SQL-скрипт для вывода имен и адресов электронной почты всех активных клиентов в Манчестере, в алфавитном порядке по имени.
SELECT Name, Email
FROM CUSTOMER
WHERE Town = 'Manchester' AND Active = TRUE
ORDER BY Name;
- Один балл за каждое: правильные поля после
SELECT; правильная таблица послеFROM;WHEREс обоими условиями и строкой в одинарных кавычках;ORDER BY Name. Используйте точно те имена таблиц и полей, которые даны в вопросе.
Расположите части оператора SELECT в том порядке, в котором они написаны.
Поля, таблица, фильтр, сортировка. ORDER BY всегда находится в конце, а оператор заверается точкой с запятой.
Две таблицы: INNER JOIN
SELECT CUSTOMER.Name, ORDERS.OrderDate
FROM CUSTOMER INNER JOIN ORDERS
ON CUSTOMER.CustomerID = ORDERS.CustomerID
WHERE ORDERS.OrderDate >= '2024-01-01';
- INNER JOIN объединяет строки двух таблиц, где внешний ключ в одной совпадает с первичным ключом в другой, указанными в klauze
ON. - Префиксы поля таблицей, если то же имя встречается в обеих. В программе требуется выполнение запросов не более чем к двум таблицам.
Объединение двух таблиц с помощью INNER JOIN
JOIN сопоставляет строки, где внешний ключ равен первичному ключу — здесь Orders.CustomerID = Customer.CustomerID — и объединяет каждую пару совпадений в одну более широкую строку.
INNER JOIN используется для:
JOIN объединяет две таблицы на основе связи (обычно внешний ключ совпадает с первичным ключом).
Агрегаты и GROUP BY
SELECT CustomerID, COUNT(*) AS NumOrders
FROM ORDERS
GROUP BY CustomerID;
SELECT AVG(Price) FROM PRODUCT;
SELECT SUM(Quantity) FROM ORDER_LINE WHERE OrderID = 1042;
- Агрегатные функции сводят множество строк к одному значению:
COUNTколичество строк,SUMсумма,AVGсреднее значение. GROUP BYсоздаёт одну итоговую строку для каждого значения поля: количество заказов для каждого клиента. Без него агрегатная функция обобщает всю таблицу.
Что возвращает COUNT(*)?
COUNT(*) подсчитывает строки; SUM/AVG/MIN/MAX — другие агрегатные функции.
Чтобы вывести количество заказов каждого покупателя, запрос должен включать: выберите все подходящие варианты.
Подсчитать строки, по одной группе на покупателя, из таблицы заказов. Сортировка является необязательной.
Изменение данных: INSERT, UPDATE, DELETE
INSERT INTO CUSTOMER (CustomerID, Name, Town, Joined, Active)
VALUES (101, 'Ada Lovelace', 'London', '2024-03-01', TRUE);
UPDATE CUSTOMER SET Town = 'Bristol' WHERE CustomerID = 101;
DELETE FROM CUSTOMER WHERE CustomerID = 101;
INSERT INTO … VALUESдобавляет строку: перечислите поля, затем значения в том же порядке.UPDATE … SET … WHEREизменяет совпадающие строки.DELETE FROM … WHEREудаляет их.- Всегда указывайте для
UPDATEиDELETEусловиеWHERE, иначе изменения затронут все строки в таблице.
Что произойдёт, если выполнить UPDATE или DELETE без условия WHERE?
Без условия WHERE операция затрагивает все строки — это частая и опасная ошибка.
Сопоставьте каждое DML-утверждение с его действием.
SELECT читает; INSERT добавляет; UPDATE изменяет; DELETE удаляет — четыре основных глагола DML.
Разбор примера: прочитайте оператор
SELECT Name
FROM CUSTOMER INNER JOIN ORDERS
ON CUSTOMER.CustomerID = ORDERS.CustomerID
WHERE OrderDate = '2024-05-01'
ORDER BY Name DESC;
- Укажите, что выведет этот скрипт. Имена всех клиентов, сделавших заказ 1 мая 2024 года, по одной строке на каждый такой заказ, в обратном алфавитном порядке.
- Читайте в порядке выполнения: соедините таблицы по ID клиента, оставьте строки за эту дату, выведите имя, отсортируйте по убыванию. Клиент с двумя заказами в этот день появится дважды.
Потерянные баллы
- Строки в одиночных кавычках, числа без кавычек:
Town = 'London',CustomerID = 101. ORDER BYидёт послеWHERE; соединение требует условияON; каждый оператор заверается точкой с запятой.COUNT(*)считает строки, а не уникальные значения; для вопроса по группам нужноGROUP BY.CREATE,ALTERиPRIMARY KEY— это DDL;SELECT,INSERT,UPDATE,DELETE— это DML. Используйте точные названия, данные в задании.
Вы поняли
- DDL создаёт и изменяет структуру:
CREATE DATABASE,CREATE TABLEс типизированными атрибутами,PRIMARY KEY,FOREIGN KEY … REFERENCES,ALTER TABLE … ADD· DML работает с данными - типы:
CHARACTER,VARCHAR(n),BOOLEAN,INTEGER,REAL,DATE,TIME SELECT fields FROM table WHERE condition ORDER BY field;INNER JOIN … ONдля двух таблиц;COUNT,SUM,AVGсGROUP BYдля одной строки на группуINSERT INTO … VALUES,UPDATE … SET … WHERE,DELETE FROM … WHERE: никогда не используйте UPDATE или DELETE безWHERE