Язык SQL или Structured Query Language (язык структурированных запросов) предназначен для управления данными в системе реляционных баз данных (RDBMS). В этой статье будет рассказано о часто используемых командах SQL, с которыми должен быть знаком каждый программист. Этот материал идеально подойдёт для тех, кто хочет освежить свои знания об SQL перед собеседованием на работу. Для этого разберите приведённые в статье примеры и вспомните, что проходили по базам данных.
Обратите внимание, что в некоторых системах баз данных требуется указывать точку с запятой в конце каждого оператора. Точка с запятой является стандартным указателем на конец каждого оператора в SQL. В примерах используется MySQL, поэтому точка с запятой требуется.
Настройка базы данных для примеров
Создайте базу данных для демонстрации работы команд. Для работы вам понадобится скачать два файла: DLL.sql и InsertStatements.sql. После этого откройте терминал и войдите в консоль MySQL с помощью следующей команды (статья предполагает, что MySQL уже установлен в системе):
mysql -u root -p
Затем введите пароль.
Выполните следующую команду. Назовём базу данных «university»:
CREATE DATABASE university; USE university; SOURCE <path_of_DLL.sql_file>; SOURCE <path_of_InsertStatements.sql_file>;

Команды для работы с базами данных
- Просмотр доступных баз данных
SHOW DATABASES;
2. Создание новой базы данных
CREATE DATABASE;
3. Выбор базы данных для использования
USE <database_name>;
4. Импорт SQL-команд из файла .sql
SOURCE <path_of_.sql_file>;
5. Удаление базы данных
DROP DATABASE <database_name>;
Работа с таблицами
6. Просмотр таблиц, доступных в базе данных
SHOW TABLES;

7. Создание новой таблицы
CREATE TABLE <table_name1> ( <col_name1> <col_type1>, <col_name2> <col_type2>, <col_name3> <col_type3> PRIMARY KEY (<col_name1>), FOREIGN KEY (<col_name2>) REFERENCES <table_name2>(<col_name2>) );
Ограничения целостности при использовании CREATE TABLE
Может понадобиться создать ограничения для определённых столбцов в таблице. При создании таблицы можно задать следующие ограничения:
- ячейка таблицы не может иметь значение NULL;
- первичный ключ — PRIMARY KEY (col_name1, col_name2, …);
- внешний ключ —
FOREIGN KEY (col_namex1, …, col_namexn) REFERENCES table_name(col_namex1, …, col_namexn).
Можно задать больше одного первичного ключа. В этом случае получится составной первичный ключ.
Пример
Создайте таблицу «instructor»:
REATE TABLE instructor (
ID CHAR(5),
name VARCHAR(20) NOT NULL,
dept_name VARCHAR(20),
salary NUMERIC(8,2),
PRIMARY KEY (ID),
FOREIGN KEY (dept_name)
REFERENCES department(dept_name)
);
8. Сведения о таблице
Можно просмотреть различные сведения (тип значений, является ключом или нет) о столбцах таблицы следующей командой:
DESCRIBE <table_name>;

9. Добавление данных в таблицу
INSERT INTO <table_name> (<col_name1>, <col_name2>, <col_name3>, …)
VALUES (<value1>, <value2>, <value3>, …);
При добавлении данных в каждый столбец таблицы не требуется указывать названия столбцов.
INSERT INTO <table_name>
VALUES (<value1>, <value2>, <value3>, …);
10. Обновление данных таблицы
UPDATE <table_name>
SET <col_name1> = <value1>, <col_name2> = <value2>, ... WHERE <condition>;
11. Удаление всех данных из таблицы
DELETE FROM <table_name>;
12. Удаление таблицы
DROP TABLE <table_name>;
Команды для создания запросов
13. SELECT
SELECT используется для получения данных из определённой таблицы:
SELECT <col_name1>, <col_name2>, …
FROM <table_name>;
Следующей командой можно вывести все данные из таблицы:
SELECT * FROM <table_name>;

14. SELECT DISTINCT
В столбцах таблицы могут содержаться повторяющиеся данные. Используйте SELECT DISTINCT для получения только неповторяющихся данных.
SELECT DISTINCT <col_name1>, <col_name2>, …
FROM <table_name>;

15. WHERE
Можно использовать ключевое слово WHERE в SELECT для указания условий в запросе:
SELECT <col_name1>, <col_name2>, …
FROM <table_name> WHERE <condition>;
В запросе можно задавать следующие условия:
- сравнение текста;
- сравнение численных значений;
- логические операции AND (и), OR (или) и NOT (отрицание).
Пример
Попробуйте выполнить следующие команды. Обратите внимание на условия, заданные в WHERE:
SELECT * FROM course WHERE dept_name=’Comp. Sci.’;
SELECT * FROM course WHERE credits>3; SELECT * FROM course WHERE dept_name='Comp. Sci.' AND credits>3;
16. GROUP BY
Оператор GROUP BY часто используется с агрегатными функциями, такими как COUNT, MAX, MIN, SUM и AVG, для группировки выходных значений.
SELECT <col_name1>, <col_name2>, …
FROM <table_name>
GROUP BY <col_namex>;
Пример
Выведем количество курсов для каждого факультета:
SELECT COUNT(course_id), dept_name
FROM course GROUP BY dept_name;

17. HAVING
Ключевое слово HAVING было добавлено в SQL потому, что WHERE не может быть использовано для работы с агрегатными функциями.
SELECT <col_name1>, <col_name2>, ...
FROM <table_name> GROUP BY <column_namex> HAVING <condition>
Пример
Выведем список факультетов, у которых более одного курса:
SELECT COUNT(course_id), dept_name
FROM course GROUP BY dept_name HAVING COUNT(course_id)>1;

18. ORDER BY
ORDER BY используется для сортировки результатов запроса по убыванию или возрастанию. ORDER BY отсортирует по возрастанию, если не будет указан способ сортировки ASC или DESC.
SELECT <col_name1>, <col_name2>, …
FROM <table_name> ORDER BY <col_name1>, <col_name2>, … ASC|DESC;
Пример
Выведем список курсов по возрастанию и убыванию количества кредитов:
SELECT * FROM course ORDER BY credits;
SELECT * FROM course ORDER BY credits DESC;
19. BETWEEN
BETWEEN используется для выбора значений данных из определённого промежутка. Могут быть использованы числовые и текстовые значения, а также даты.
SELECT <col_name1>, <col_name2>, … FROM <table_name> WHERE <col_namex> BETWEEN <value1> AND <value2>;
Пример
Выведем список инструкторов, чья зарплата больше 50 000, но меньше 100 000:
SELECT * FROM instructor WHERE salary BETWEEN 50000 AND 100000;

20. LIKE
Оператор LIKE используется в WHERE, чтобы задать шаблон поиска похожего значения.
Есть два свободных оператора, которые используются в LIKE:
- % (ни одного, один или несколько символов);
- _ (один символ).
SELECT <col_name1>, <col_name2>, …
FROM <table_name>
WHERE <col_namex> LIKE <pattern>;
Пример
Выведем список курсов, в имени которых содержится «to», и список курсов, название которых начинается с «CS-»:
SELECT * FROM course WHERE title LIKE ‘%to%’;
SELECT * FROM course WHERE course_id LIKE 'CS-___';

21. IN
С помощью IN можно указать несколько значений для оператора WHERE:
SELECT <col_name1>, <col_name2>, … FROM <table_name> WHERE <col_namen> IN (<value1>, <value2>, …);
Пример
Выведем список студентов с направлений Comp. Sci., Physics и Elec. Eng.:
SELECT * FROM student WHERE dept_name IN (‘Comp. Sci.’, ‘Physics’, ‘Elec. Eng.’);

22. JOIN
JOIN используется для связи двух или более таблиц с помощью общих атрибутов внутри них. На изображении ниже показаны различные способы объединения в SQL. Обратите внимание на разницу между левым внешним объединением и правым внешним объединением:

SELECT <col_name1>, <col_name2>, … FROM <table_name1> JOIN <table_name2> ON <table_name1.col_namex> = <table2.col_namex>;
Пример 1
Выведем список всех курсов и соответствующую информацию о факультетах:
SELECT * FROM course
JOIN department
ON course.dept_name=department.dept_name;

Пример 2
Выведем список всех обязательных курсов и детали о них:
SELECT prereq.course_id, title, dept_name, credits, prereq_id
FROM prereq
LEFT OUTER JOIN course ON prereq.course_id=course.course_id;

Пример 3
Выведем список всех курсов вне зависимости от того, обязательны они или нет:
SELECT course.course_id, title, dept_name, credits, prereq_id
FROM prereq RIGHT OUTER JOIN course ON prereq.course_id=course.course_id;

23. View
View — это виртуальная таблица SQL, созданная в результате выполнения выражения. Она содержит строки и столбцы и очень похожа на обычную SQL-таблицу. View всегда показывает самую свежую информацию из базы данных.
Создание
CREATE VIEW <view_name> AS
SELECT <col_name1>, <col_name2>, … FROM <table_name> WHERE <condition>;
Удаление
DROP VIEW <view_name>;
Пример
Создадим view, состоящую из курсов с 3 кредитами:

24. Агрегатные функции
Эти функции используются для получения совокупного результата, относящегося к рассматриваемым данным. Ниже приведены общеупотребительные агрегированные функции:
- COUNT (col_name) — возвращает количество строк;
- SUM (col_name) — возвращает сумму значений в данном столбце;
- AVG (col_name) — возвращает среднее значение данного столбца;
- MIN (col_name) — возвращает наименьшее значение данного столбца;
- MAX (col_name) — возвращает наибольшее значение данного столбца.
25. Вложенные подзапросы
Вложенные подзапросы — это SQL-запросы, которые включают выражения SELECT, FROM и WHERE, вложенные в другой запрос.
Пример
Найдём курсы, которые преподавались осенью 2009 и весной 2010 годов:
SELECT DISTINCT course_id
FROM section WHERE semester = ‘Fall’ AND year= 2009 AND course_id IN ( SELECT course_id FROM section WHERE semester = ‘Spring’ AND year= 2010 );

Для решения многих стандартных задач не требуется быть SQL-виртуозом, достаточно изучить азы работы с базами:
- создание и редактирование таблиц;
- сохранение и обновление записей;
- выборка и фильтрация данных;
- индексирование полей.
Этими азами мы и займемся: разберем синтаксис SQL-запросов в теории и на реальных примерах. К счастью, язык баз данных очень похож на простые английские предложения, так что вы легко с ним справитесь.
Чтобы учиться эффективнее, сразу же закрепляйте новые знания практикой. Поиграть с SQL можно на этом замечательном ресурсе. В левой панели вы должны ввести весь код, относящийся к структуре базы данных. После этого начинайте экспериментировать с SELECT’ами в правом поле.
- В примерах используется SQL-синтаксис для MySQL 5.6. Запросы, предназначенные для разных СУБД, могут различаться.
Терминология
База данных состоит из таблиц, а таблица – из колонок и строк.
Каждая колонка, или поле таблицы, представляет собой конкретный вид информации, например, имя студента (строка) или зарплата сотрудника (число).
Каждая строка, или запись таблицы, – это описание конкретного объекта, например, студента или сотрудника.
Уровень: Новичок
Создание и редактирование таблиц
CREATE
Несложно догадаться, что оператор CREATE создает новую таблицу в базе. Ему нужно передать описания всех полей таблицы в формате:
название_поля тип_данных [атрибуты_поля]
Создадим таблицу с данными о собаках и их рационе питания:
# создать таблицу dogs с 5 полями разных типов CREATE TABLE rations ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL, weight INT DEFAULT 0, color VARCHAR(20), portion INT );
ALTER
Не всегда получается создать идеальную таблицу с первого раза. Не бойтесь вносить изменения, добавлять, удалять или изменять существующие поля:
# переименовать таблицу rations в portions ALTER TABLE rations RENAME TO portions; # добавить в таблицу portions числовое поле age ALTER TABLE portions ADD age INT; # удалить из таблицы portions поле color ALTER TABLE portions DROP COLUMN color; # переименовать поле name в dog_name ALTER TABLE portions CHANGE name dog_name VARCHAR(20) NOT NULL;
DROP и TRUNCATE
Оператор DROP удаляет таблицу из базы целиком:
# удалить таблицу portions DROP TABLE portions;
Если вам нужно удалить только записи, сохранив саму таблицу, воспользуйтесь оператором TRUNCATE:
# очистить таблицу portions TRUNCATE TABLE portions;
Атрибуты и ограничения
Можно ограничить диапазон данных, которые попадают в поле, например, запретить устанавливать в качестве возраста или веса отрицательные числа.
Самые распространенные в SQL ограничения целостности (CONSTRAINTS):
- DEFAULT – устанавливает значение по умолчанию;
- AUTO_INCREMENT – автоматически инкрементирует значение поля для каждой следующей записи;
- NOT NULL – запрещает создавать запись с пустым значением поля;
- UNIQUE – следит, чтобы поле или комбинация полей оставались уникальны в пределах таблицы;
- PRIMARY KEY – UNIQUE + NOT NULL. Первичный ключ должен однозначно идентифицировать запись таблицы, поэтому он должен быть уникальным и не может оставаться пустым;
- CHECK – проверяет значение поля на соответствие некоторому условию.
Ограничения можно добавлять при создании таблицы, а затем при необходимости добавлять/изменять/удалять. Они могут действовать на одно поле или комбинацию полей.
Первичный ключ, автоматический инкремент, NOT NULL и значение по умолчанию мы уже использовали в примере с собаками.
Решим новую задачу – составление списка президентов:
# уникальная комбинация страна + имя президента CREATE TABLE presidents ( country VARCHAR(20), name VARCHAR(50), age INT CHECK(age > 50), UNIQUE(country, name) );
Ограничение уникальности не позволит занести в таблицу одного и того же президента одной страны дважды. Кроме того, не попадут в список и слишком молодые политики.
Для добавления и удаления ограничений к существующим таблицам используйте оператор ALTER. Ограничениям можно давать имя, чтобы ссылаться на них впоследствии. Для этого предназначена конструкция CONSTRAINT.
CREATE TABLE presidents ( country VARCHAR(20), name VARCHAR(50), age INT ); # добавить именованное ограничение уникальности ALTER TABLE presidents ADD CONSTRAINT unique_president UNIQUE(country, name); # удалить именованное ограничение ALTER TABLE presidents DROP INDEX unique_president; # добавить неименованное ограничение уникальности ALTER TABLE presidents ADD UNIQUE(country, name); # добавить проверку значения ALTER TABLE presidents ADD CHECK (age > 50);
Еще одно удобное ограничение в SQL – внешний ключ (FOREIGN KEY). Он позволяет связать поля двух разных таблиц.
Для примера возьмем базу данных организации с таблицами сотрудников и отделов:
CREATE TABLE departments ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) ); # в поле departament будет храниться id одного из отделов, # перечисленных в таблице departments CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), department INT, salary INT, FOREIGN KEY (department) REFERENCES departments(id) );
Теперь в поле department таблицы employees нельзя будет указать произвольный отдел. Он обязательно должен содержаться в таблице departments.
Сохранение и обновление записей
INSERT
Добавить в таблицу новую запись (или даже сразу несколько) очень просто:
INSERT INTO portions (dog_name, weight, portion) VALUES ("Jack", 25, 250); INSERT INTO portions (dog_name, weight, portion) VALUES ("Max", 15, 180), ("Charlie", 37, 350);
Вы даже можете скопировать записи из одной таблицы и вставить их в другую одним запросом. Для этого нужно скомбинировать операторы INSERT и SELECT:
CREATE TABLE dogs( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL, weight INT DEFAULT 0 ); INSERT INTO dogs (name, weight) SELECT dog_name, weight FROM portions;
UPDATE
Оператор UPDATE используется для изменения существующих записей таблицы.
UPDATE employees SET salary = 0;
Вот так легким движением руки мы обнулили зарплату сразу у всех сотрудников.
Запрос можно уточнить, добавив секцию WHERE с условием отбора записей.
UPDATE employees SET salary = 0 WHERE name = "Ivan Ivanov";
С условиями мы подробно разберемся чуть позже, когда будем говорить о выборке данных из базы.
DELETE
Можно удалить из таблицы все записи сразу или только те, которые соответствуют некоторому условию:
DELETE FROM employees; # Ивана Иванова пора увольнять DELETE FROM employees WHERE name = "Ivan Ivanov";

Уровень: уверенный пользователь
Выборка и фильтрация данных
Для получения данных из базы служит оператор SELECT. В SQL есть множество способов отфильтровать именно те данные, которые вам нужны, а также отсортировать их и разбить по группам.
Вот небольшая демо-база, на которой вы можете попрактиковаться:
CREATE TABLE departments ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) ); CREATE TABLE employees ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), department INT, salary INT, boss INT ); INSERT INTO departments (name) VALUES ("administration"), ("accounting"), ("customer service"), ("finance"), ("legal"), ("logistics"), ("orders"), ("purchasing"); INSERT INTO employees (name, department, salary, boss) VALUES ("John Doe", 1, 40000), ("Jane Smith", 1, 35000, 1), ("Fred Brown", 1, 48000, 1), ("Kevin Jones", 2, 36000), ("Josh Taylor", 2, 22000, 4), ("Alex Clark", 2, 29000, 5), ("Branda Evans", 2, 27000, 5), ("Anthony Ford", 4, 32000), ("David Moore", 4, 29000, 8), ("Scott Riley", 5, 20000), ("Chris Gilmore", 5, 28000, 10), ("Roberta Newman", 5, 33000, 11), ("Kenny Washington", NULL, 55000);
SELECT
# получить все поля из всех записей SELECT * FROM employees; # получить только имена и зарплаты всех работников SELECT name, salary FROM employees;
Можно переименовывать поля для вывода:
SELECT name as employee FROM employees;
Добавление условий:
# имена работников, зарплата которых выше 20 тысяч SELECT name FROM employees WHERE salary > 20000; # все сотрудники с запрлатой от 25 до 30 тысяч SELECT name FROM employees WHERE salary BETWEEN 25000 AND 30000; # все Джоны среди работников SELECT * FROM employees WHERE name LIKE "john%" # все сотрудники, кроме Джонов и Джонсов SELECT * FROM employees WHERE name NOT LIKE "john%" AND name NOT LIKE "%jones" # все сотрудники юридического отдела, администрации и бухгалтерии SELECT * FROM employees WHERE department IN [1, 2, 5] # все сотрудники, у которых нет начальников SELECT * FROM employees WHERE boss IS NULL
Сортировка:
# по уменьшению зарплаты SELECT name, salary FROM employees ORDER BY salary ASC; # по увеличению зарплаты SELECT name, salary FROM employees ORDER BY salary DESC;
Ограничение количества результатов:
# пять самых высокооплачиваемых работника SELECT name FROM employees ORDER BY salary DESC LIMIT 5; # все работники кроме пяти самых высокооплачиваемых SELECT name FROM employees ORDER BY salary DESC OFFSET 5;
Агрегатные функции и группировка
SQL позволяет привести несколько записей таблицы к некоторому единому значению:
# общее количество работников SELECT COUNT(*) FROM employees; # найти работника с максимальной зарплатой SELECT name, MAX(salary) FROM employees; # найти работника с минимальной зарплатой SELECT name, MIN(salary) FROM employees; # найти среднюю зарплату по предприятию SELECT AVG(salary) FROM employees; # найти сумму всех зарплат SELECT SUM(salary) FROM employees;
Агрегатные функции могут работать со всеми записями таблицы разом, а могут и с отдельными группами. Чтобы эти группы сформировать, используйте оператор GROUP BY:
# найти максимальную зарплату в каждом отделе SELECT department, MAX(salary) FROM employees GROUP BY department;
Полученные группы тоже можно отфильтровывать: для этого предназначена конструкция HAVING. Например, не будем учитывать в выборке отделы, в которых работает меньше трех человек:
SELECT department, MAX(salary) FROM employees GROUP BY department HAVING COUNT(*) > 3;
Объединение таблиц
Очень часто нужная вам информация хранится в разных таблицах – это обусловлено законами нормализации. Поэтому важно уметь объединять их.
В запросе, захватывающем несколько таблиц, нужно указать следующее:
- все интересующие вас поля, которые могут принадлежать разным таблицам;
- тип соединения;
- правило, по которому поля одной таблицы будут поставлены в соответствие полям другой таблицы.
Соединение бывает внутреннее (INNER) и внешнее (OUTER).
Внутреннее соединение
При внутреннем соединении вы получите в результате только те записи, для которых нашлось соответствие во всех таблицах.
SELECT employees.name, employees.salary, departments.name as department FROM employees INNER JOIN departments ON employees.department = departments.id;
SQL просмотрит каждую запись из таблицы employees и попытается поставить ей в соответствие каждую запись из таблицы departments. Если это удастся (id отделов совпадают), запись будет включена в результат, иначе – не будет.
Таким образом, вы не увидите Kenny Washington, у которого отдел не указан, а также все отделы, в которых нет сотрудников.
Если не указано условие для соединения таблиц, SQL создаст все возможные комбинации сотрудников и отделов.
Внешнее соединение
При внешнем соединении в результат попадают также записи без соответствий. При этом вы можете регулировать, из какой таблицы такие записи берутся, а из какой – нет.
Например, чтобы увидеть в результате Kenny Washington, потребуется левое внешнее соединение. Слово OUTER можно не указывать – соединение по умолчанию внешнее:
SELECT employees.name, employees.salary, departments.name as department FROM employees LEFT JOIN departments ON employees.department = departments.id;
Теперь в результате есть все данные из левой таблицы (employees), даже если для них нет соответствия.
Правое соединение соответственно проигнорирует Кенни, но выведет все пустые отделы:
SELECT employees.name, employees.salary, employees.department, departments.name FROM employees RIGHT JOIN departments ON employees.department = departments.id;
И наконец, полное внешнее соединение выведет и соответствия, и пустые отделы, и сотрудников без отдела.
SELECT employees.name, employees.salary, employees.department, departments.name FROM employees FULL JOIN departments ON employees.department = departments.id;
Декартово произведение
Оператор CROSS JOIN позволяет получить все возможные комбинации записей из двух таблиц:
SELECT * FROM employees CROSS JOIN departments;
Автосоединение
Кроме того, таблицу можно соединять с самой собой. Это пригодится, чтобы найти босса для каждого сотрудника. Сейчас в поле boss находится идентификатор другого сотрудника, необходимо вывести его имя:
SELECT e1.name, e1.department, e2.name as boss FROM employees e1 LEFT JOIN employees e2 ON e1.boss = e2.id
Благодаря использованию левого соединения мы можем вывести также сотрудников, не имеющих руководителей.
Объединение выборок
SQL позволяет сделать две отдельные выборки, а затем объединить их результаты по определенному правилу:
UNION
Объединить штатных и внештатных сотрудников
// без дублей (или со всеми дублями) SELECT * FROM employees UNION [ALL] SELECT * FROM freelancers;
INTERSECT
Найти всех сотрудников, которые участвуют в сборной предприятия по спортивной ходьбе
SELECT name FROM employees INTERSECT SELECT name FROM race_walking_team
MINUS
Найти всех сотрудников, которые не участвуют в сборной предприятия по спортивной ходьбе и заставить участвовать:
SELECT name FROM employees MINUS SELECT name FROM race_walking_team

Уровень: SQL-мастер
Представления
Views, или представления, в SQL – это SELECT-запрос, который вы можете сохранить для дальнейшего использования. Один раз написали, а потом можете пользоваться полученной таблицей, которая – внимание! – всегда остается актуальной в отличие от результата обычных запросов.
У представлений есть еще одна важная миссия: обеспечение безопасности. Под view вы легко можете скрыть бизнес-логику и архитектуру базы и защитить свое приложение от нежелательных вторжений.
Представление может извлекать данные из одной или нескольких таблиц. Кроме того, при соблюдении ряда условий представление может быть изменяемым, то есть совершая операции над ним, можно изменять базовые таблицы.
// простое представление CREATE VIEW view(name, salary) AS SELECT name, salary FROM employees;
Если представление изменяемое, можно использовать при его создании CHECK OPTION для проверки изменений на соответствие некоторому предикату:
CREATE VIEW view(name, salary) AS SELECT name, salary FROM employees WHERE salary > 30000 WITH CHECK OPTION; // в такое представление не получится вставить следующую запись INSERT INTO view (name, salary) VALUES ("Jack Daniels", 25000);
Представления могут основываться как на таблицах базы, так и на других представлениях, образуя несколько уровней вложенности. С учетом этого предложение WITH можно расширить:
- WITH CASCADED CHECK OPTION – проверяет запросы на всех уровнях вложенности;
- WITH LOCAL CHECK OPTION – проверяет только «верхний» запрос.
CREATE VIEW view(name, salary) AS SELECT name, salary FROM employees WHERE salary > 30000; CREATE VIEW view2(name, salary) AS SELECT name, salary FROM view WHERE salary > 10000 WITH LOCAL CHECK OPTION; // строка будет вставлена в таблицу, но не будет видна в представлениях INSERT INTO view2 (name, salary) VALUES ("Jack Daniels", 15000);
Представление даже может ссылаться само на себя.
Чтобы удалить представление, используйте уже знакомый оператор DROP:
DROP VIEW view;
Индексы
Индексы – это специальный таблицы, которые позволяют ускорить поиск по базе данных. Их можно представить как алфавитный указатель в большой книге.
// создание индекса для двух полей CREATE INDEX index_name ON table(column1, column2);
Наличие индексов в базе ускоряет выполнение операций SELECT и вычисление условий WHERE. Но есть и обратная сторона медали: замедляются операции вставки и удаления данных, так как при этих изменениях необходимо пересчитывать индексы.
Триггеры
Триггеры в SQL – это процедуры, которые автоматически запускаются при выполнении определенной операции (INSERT/UPDATE/DELETE) – до (BEFORE) или после (AFTER) нее.
// создание триггера // бонус к зарплате каждому новому сотруднику DELIMITER $$ CREATE OR MODIFY TRIGGER bonuses BEFORE INSERT ON employees FOR EACH ROW BEGIN SET NEW.salary = NEW.salary+3000; END$$
Удалить существующий триггер можно с помощью оператора DROP:
DROP TRIGGER bonuses;
Удобные шпаргалки по SQL в pdf-формате.
Original : https://vk.com/@javarush-ot-create-do-join-vvedenie-v-sql-shpargalka