Помните, как вы были студентами, и готовились к экзаменам по ночам?
Предлагаю вашему вниманию простую шпаргалку по SQL с теорией и практикой, которой вы сможете воспользоваться в любое время.
![](https://webcf.waybackmachine.org/web/20220506210921/https://habrastorage.org/getpro/habr/upload_files/1a7/29c/414/1a729c41434a77770a4c5d42cb8565c4.jpg)
Статья пригодится:
ИТ специалисту, которому необходимо быстро освоить минимальный уровень SQL для выполнения рабочих задач,
Системному аналитику, которому требуется освежить знания перед собеседованием или научиться, если раньше не было задач с SQL.
В статье есть:
Минимум теории для задач на работе или собеседовании (прим. операторов в SQL больше, но в своей работе использовала чаще всего эти);
Практические задания, которые можно выполнить у себя на ПК бесплатно, предварительно установив сервер баз данных.
SQL теория
SQL (structured query language) - язык структурированных запросов, который позволяет работать с данными (найти, изменить, удалить или создать) в реляционной базе данных (БД).
Реляционные БД - это базы, где связанная информация, представленная в виде двумерных таблиц (например, Postgres, Mysql, Oracle и др.).
СУБД - система управления БД, программа с помощью которой можно создавать, наполнять и просматривать БД .
ER диаграммы (Entity-Relationship model) - показывает структуру и связи таблиц в БД. Помогает в написании SQL запросов.
Для работы мозга студенту нужна энергия. Проще всего ее получить из сладкого. Значит будем учиться на примере базы данных сладостей. Изучать теорию мы с вами будем на реальном примере.
Наша БД состоит из таблиц:
![ER диаграмма базы данных сладостей ER диаграмма базы данных сладостей](https://webcf.waybackmachine.org/web/20220506210921/https://habrastorage.org/getpro/habr/upload_files/2e6/53f/5e8/2e653f5e88476bfb030bc5608c23adee.jpg)
(прим. показана часть БД с необходимыми таблицами для выполнения практических заданий)
sweets_types - виды сладостей
Столбец | Тип данных | Обязательность | Описание |
id | integer | not null (должно быть значение) | Идентификатор вида сладости. PK |
name | character varying | not null | Вид сладости |
manufacturers - производители
Столбец | Тип данных | Обязательность | Описание |
id | integer | not null | Идентификатор производителя. PK |
name | character varying | not null | Производитель |
phone | character varying | Телефон | |
adress | character varying | Адрес | |
city | character varying | not null | Населенный пункт |
country | character varying | not null | Страна |
storehouses - склады
Столбец | Тип данных | Обязательность | Описание |
id | integer | not null | Идентификатор склада. PK |
name | character varying | not null | Название склада |
adress | character varying | Адрес | |
city | character varying | not null | Населенный пункт |
country | character varying | not null | Страна |
manufacturers_storehouses - связь производителя со складом
Столбец | Тип данных | Обязательность | Описание |
id | integer | not null | Идентификатор связи. PK |
storehouses_id | character varying | not null | Идентификатор склада. FK |
manufacturers_id | character varying | Идентификатор производителя. FK |
sweets - сладости
Столбец | Тип данных | Обязательность | Описание |
id | integer | not null | Идентификатор сладости. PK |
sweets_types_id | integer | Идентификатор вида. FK | |
name | character varying | not null | Название сладости |
cost | character varying | not null | Стоимость |
weight | character varying | not null | Вес |
manufacturer_id | integer | not null | Идентификатор производителя. FK |
with_sugar | boolean | С сахаром? true - да, false - нет | |
requires_freezing | boolean | Требует заморозки? true - да, false - нет | |
production_date | date | not null | Дата изготовления |
expiration_date | date | not null | Срок годности |
В таблице есть:
Столбцы,
Строки,
Ячейки,
Ограничения (constraint): PK - первичный ключ, FK - вторичный ключ,
Тип данных.
![Пример таблицы sweets с данными Пример таблицы sweets с данными](https://webcf.waybackmachine.org/web/20220506210921/https://habrastorage.org/getpro/habr/upload_files/ec0/032/b66/ec0032b669a9c75f962392556b995158.jpg)
В SQL выделяют основные 4 группы операторов:
DDL (Data Definition Language) – работа со структурой БД,
DML (Data Manipulation Language) – работы с данными таблиц,
DCL (Data Control Language) – работа с правами,
TCL (Transaction Control Language) – работа с транзакциями.
DML чаще всего спрашивают на собеседовании. DCL и DML нужны в работе системного аналитика. DCL, TCL в моей практике не приходилось пользоваться ни на собеседовании, ни в работе системного аналитика, поэтому в данной статье не будем их рассматривать, так как за ночь нужно выучить или вспомнить то, что действительно могут спросить на собеседовании (экзамене) или пригодиться в работе.
А теперь шпаргалки SQL операторов
Работа со структурой БД (DDL)
CREATE. Создание таблицы.
CREATE TABLE public.sweets_types
(
id integer NOT NULL,
name character varying NOT NULL,
PRIMARY KEY (id)
);
Имя создаваемой таблицы указано в формате: Имя схемы.Имя таблицы
.
Например, схема = public, имя таблицы = sweets_types, тогда имя создаваемой таблицы = public.sweets_types
ALTER. Добавление, изменение или удаление столбцов в таблице.
Пример SQL запроса, который добавит столбец name_english
с типом данных character varying
в таблицу sweets_types
ALTER TABLE IF EXISTS public.sweets_types
ADD COLUMN name_english character varying;
DROP. Удаление целиком таблицы из БД.
DROP TABLE public.sweets_types;
TRUNCATE. Удаление всех записей из таблицы.
TRUNCATE TABLE public.sweets_type;
Работа с данными таблиц (DML)
INSERT. Добавление строки в таблицу.
INSERT INTO public.sweets_types(name)
VALUES
('вафли'),
('конфеты');
Столбец id
в таблице sweets_types
является PK и сгенерится автоматом при добавлении, поэтому в INSERT
добавляем значение столбца name
UPDATE. Обновление данных строки в таблице.
UPDATE public.sweets_types SET name = 'вафли новые'
WHERE id = 1;
DELETE. Удаление строки из таблицы.
DELETE FROM public.sweets_types WHERE name = 'вафли';
SELECT. Просмотр данных из таблицы.
Все виды сладостей (идентификатор и имя)
SELECT * FROM public.sweets_types;
Только имена видов сладостей
SELECT name FROM public.sweets_types;
DISTINCT. Возвращает уникальные значения, без повторений.
SELECT DISTINCT name FROM public.sweets
WHERE. Условие фильтрации записей при выборе данных.
Список сладостей, у которых стоимость равна 100
SELECT name FROM public.sweets
WHERE cost = '100';
AND, OR, BETWEEN. Оператор «И», «Или», «Между».
Список сладостей, у которых стоимость равна 100 и вес равен 100
SELECT name FROM public.sweets
WHERE cost = '100' AND weight = '100';
Список сладостей, у которых стоимость равна от 50 до 100
SELECT name FROM public.sweets
WHERE cost BETWEEN '50' AND '100';
GROUP BY. Группировка столбцов.
SELECT sweets_types_id FROM public.sweets
GROUP BY sweets_types_id;
HAVING. Используется для фильтрации по условию, когда есть группировка.
Найти вид сладости, у которого есть изделия с весом 300
SELECT sweets_types_id FROM public.sweets
GROUP BY sweets_types_id, weight
HAVING weight = '300';
ORDER BY ASC, DESC. Сортировка в порядке возрастания (asc) или убывания (desc).
ASC можно не указывать.
SELECT * FROM public.sweets
ORDER BY name DESC;
COUNT. Количество строк.
Посчитать количество сладостей, у которых вес равен 300
SELECT COUNT(id) FROM public.sweets
WHERE weight = '300';
SUM, MAX, MIN, AVG. Сумма значений, максимальное, минимальное, среднее значение.
SELECT SUM(id) FROM public.sweets;
SELECT MAX(id) FROM public.sweets;
SELECT MIN(id) FROM public.sweets;
SELECT AVG(id) FROM public.sweets;
LIKE. Поиск заданного значения в столбце по совпадению.
С оператором LIKE используются два подстановочных знака:
% - любое количество символов;
_ - один символ.
Найти список сладостей, которые начинаются на М
SELECT * FROM public.sweets
WHERE name LIKE 'М%';
JOIN или INNER JOIN, LEFT JOIN, RIGHT JOIN. Объединение двух таблиц.
JOIN или INNER JOIN - возвращает записи, имеющие в обеих таблицах
LEFT JOIN - возвращает все записи из левой таблицы и те, которые есть в левой и правой таблице
RIGHT JOIN - возвращает все записи из правой таблицы и те, которые есть в правой таблице
Подробная работа с JOIN описана в статье.
SELECT * FROM public.sweets s
JOIN public.sweets_types st ON s.sweets_types_id = st.id
WHERE st.name = 'шоколад';
SQL практика
Шаг 1. Установить инструменты для работы
Для выполнения практических заданий берем базу данных - Postgres и СУБД - pgAdmin
Скачать Postgres и pgAdmin можно по ссылке. Как поставить показано в видео по ссылке.
После установки у вас создастся локальный сервер на вашем ПК, в котором вы создадите базу данных.
Как настроить подключение к серверу через pgAdmin описано в статье по ссылке, раздел 2. Запуск.
ШАГ 1. Создаем таблицы в БД
В pgAdmin есть форма создания таблиц: Схемы -> public -> Таблицы -> Создать.
Заполните вкладки General, Столбцы.
Посмотреть картинки как это сделать в pgAdmin
![](https://webcf.waybackmachine.org/web/20220506210921/https://habrastorage.org/getpro/habr/upload_files/7ab/836/6ef/7ab8366ef88c79115e59608192dd7879.jpg)
![](https://webcf.waybackmachine.org/web/20220506210921/https://habrastorage.org/getpro/habr/upload_files/604/6f8/b9d/6046f8b9decf1046bda4c7758d8ac11a.jpg)
Для столбцов id в таблицах устанавливаем ограничения
![](https://webcf.waybackmachine.org/web/20220506210921/https://habrastorage.org/getpro/habr/upload_files/2cf/fdb/e56/2cffdbe56949a5ec62987c14b4a87cc0.jpg)
Скрипт SQL на создание таблиц в БД
CREATE TABLE public.sweets_types
(
id integer NOT NULL,
name character varying NOT NULL,
PRIMARY KEY (id)
);
ALTER TABLE IF EXISTS public.sweets_types
OWNER to postgres;
COMMENT ON TABLE public.sweets_types
IS 'Виды сладостей';
CREATE TABLE public.sweets
(
id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 ),
sweets_types_id integer,
name character varying NOT NULL,
cost character varying NOT NULL,
weight character varying NOT NULL,
manufacturer_id integer NOT NULL,
with_sugar boolean,
requires_freezing boolean,
production_date date NOT NULL,
expiration_date date NOT NULL,
PRIMARY KEY (id)
);
ALTER TABLE IF EXISTS public.sweets
OWNER to postgres;
COMMENT ON TABLE public.sweets
IS 'Записи о сладостях';
CREATE TABLE public.manufacturers_storehouses
(
id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 ),
storehouses_id integer NOT NULL,
manufacturers_id integer NOT NULL,
PRIMARY KEY (id)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.manufacturers_storehouses
OWNER to postgres;
COMMENT ON TABLE public.manufacturers_storehouses
IS 'Связь компании производителя и склада';
CREATE TABLE public.manufacturers
(
id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 ),
name character varying NOT NULL,
phone character varying,
adress character varying,
city character varying NOT NULL,
country character varying NOT NULL,
PRIMARY KEY (id)
);
ALTER TABLE IF EXISTS public.manufacturers
OWNER to postgres;
COMMENT ON TABLE public.manufacturers
IS 'Компании производители';
CREATE TABLE public.storehouses
(
id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 ),
name character varying NOT NULL,
adress character varying,
city character varying NOT NULL,
country character varying NOT NULL,
PRIMARY KEY (id)
);
ALTER TABLE IF EXISTS public.storehouses
OWNER to postgres;
COMMENT ON TABLE public.storehouses
IS 'Склады';
✅ Таблицы созданы!
ШАГ 2. Добавляем записи в БД
Наполняем таблицы данными с помощью SQL скрипта. Используем оператор INSERT INTO ... VALUES
В pgAdmin заходим в таблицу sweets_types и создаем скрипт Insert: Схемы -> public -> Таблицы -> sweets_types (правая кнопка мыши) -> Scripts -> Insert.
Аналогично наполняем данными другие таблицами.
Посмотреть картинки как это сделать в pgAdmin
![](https://webcf.waybackmachine.org/web/20220506210921/https://habrastorage.org/getpro/habr/upload_files/725/e98/ab9/725e98ab95c2c7a90c79fc698c11d691.jpg)
Скрипт SQL на наполнение данными таблиц
INSERT INTO public.sweets_types(
name)
VALUES
('вафли'),
('конфеты'),
('мармелад'),
('печенье'),
('шоколад');
INSERT INTO public.storehouses(
name, adress, city, country)
VALUES
('MSK-1', '109235, г. Москва, Проектируемый проезд 4386, д.8', 'Moscow', 'Russia'),
('SPB-1', '197375, г. Санкт-Петербург, Суздальское шоссе, д. 26', 'Saint-petersburg', 'Russia'),
('EKB-1', '620137, г. Екатеринбург, Шефская улица, д. 1А', 'Ekaterinburg', 'Russia');
INSERT INTO public.manufacturers(
name, phone, adress, city, country)
VALUES
('Мишаня', '', '109235, г. Москва, Проектируемый проезд, д.15', 'Moscow', 'Russia'),
('Собакен', '78125748899', '197375, г. Санкт-Петербург, Суздальское шоссе, д. 75', 'Saint-petersburg', 'Russia'),
('Мартыха', '74657896525', '620137, г. Екатеринбург, Шефская улица, д. 5А', 'Ekaterinburg', 'Russia');
INSERT INTO public.manufacturers_storehouses(
storehouses_id, manufacturers_id)
VALUES
(1, 1),
(2, 2),
(3, 3),
(1, 2),
(2, 1);
INSERT INTO public.sweets(
sweets_types_id, name, cost, weight, manufacturer_id, with_sugar, requires_freezing, production_date, expiration_date)
VALUES
(1, 'Мильтик', '100', '200',1, false, false, '2022-05-03', '2022-05-15'),
(2, 'Микус', '150', '300', 1 , true, true, '2022-04-03', '2022-05-03'),
(3, 'Миви', '110', '100', 1 , true, false, '2022-03-03', '2022-04-14'),
(4, 'Ми', '120', '200', 1, false, true, '2022-03-04', '2022-04-04'),
(5, 'Миса', '145', '570', 1, true, false, '2021-03-03', '2021-12-03'),
(1, 'Сольтик', '115', '200', 2 , false, false, '2022-05-03', '2022-05-15'),
(2, 'Сокус', '155', '300', 2 , true, true, '2022-03-03', '2022-05-03'),
(3, 'Сови', '117', '500', 2 , true, false, '2022-03-03', '2022-04-14'),
(4, 'Со', '129', '250', 2, false, true, '2022-03-04', '2022-04-04'),
(5, 'Сор', '148', '500', 2, true, false, '2021-02-03', '2021-12-03'),
(1, 'Мальтик', '210', '200', 3 , false, false, '2022-05-03', '2022-05-15'),
(2, 'Макус', '350', '300', 3 , true, true, '2022-01-03', '2022-05-03');
✅ Таблицы наполнены!
ШАГ 3. Отрабатываем поиск данных
Предлагаю вам сначала самим написать SQL запросы, а потом смотреть решение. Так вы научитесь искать данные на практических задачах и закрепите теоретические знания
![](https://webcf.waybackmachine.org/web/20220506210921/https://habrastorage.org/getpro/habr/upload_files/fc3/75b/21f/fc375b21fbd3da8943f690dcefb90117.jpg)
№1. Какие компании производители есть в базе?
Решение №1
SELECT * FROM manufacturers;
Выгрузите все столбцы из таблицы manufacturers
№2. Найдите все виды сладостей.
Примечание: виды сладостей в таблице не повторяются
Решение №2
SELECT name FROM public.sweets_types;
№3. В каких городах есть склады?
Решение №3
SELECT DISTINCT city FROM storehouses;
№4. Найти сладости с истекшим срок годности.
Подсказка: используйте для условия переменную current_date.
Решение №4
SELECT name FROM public.sweets WHERE expiration_date<current_date;
№5. Найти сладости, у которых стоимость от 200 до 300
Решение №5.
SELECT * FROM public.sweets WHERE cost>='200' AND cost<'300';
--или
SELECT * FROM public.sweets WHERE cost BETWEEN '200'AND'300';
№6. Найти сладости, у которых название начинается на букву М
Решение №6
SELECT * FROM public.sweets WHERE name LIKE 'М%';
№7. Составить список сладостей, отсортированных от А до Я
Решение №7
SELECT * FROM public.sweets ORDER BY name
№8. Найти количество сладостей по каждому виду. В ответе вывести имя вида и количество
Решение №8
SELECT COUNT (s.id), st.name FROM public.sweets s
JOIN public.sweets_types st ON s.sweets_types_id = st.id
GROUP BY st.name;
№9. Найти количество сладостей по каждому виду, у которых истек срок годности.
Решение №9
SELECT COUNT (s.id), st.name FROM public.sweets s
JOIN public.sweets_types st ON s.sweets_types_id = st.id
GROUP BY st.name, s.expiration_date
HAVING s.expiration_date<current_date;
№10. Найти количество сладостей по каждому виду, у которых название вида начинается на букву п.
Решение №10
SELECT COUNT (s.id), st.name FROM public.sweets s
JOIN public.sweets_types st ON s.sweets_types_id = st.id
GROUP BY st.name, s.expiration_date
HAVING st.name LIKE 'п%';
№11. В каких городах есть склады со сладостями Мильтик?
Решение №11
SELECT DISTINCT s.city FROM public.storehouses s
JOIN public.manufacturers_storehouses ms ON s.id = ms.storehouses_id
JOIN public.sweets sw ON sw.manufacturer_id = ms.manufacturers_id
WHERE sw.name = 'Мильтик';
№12. Какое максимальное значение идентификатора у сладости?
Решение №12
SELECT MAX(id) FROM public.sweets;
№13. Какое количество сладостей на каждом складе?
Решение №13
SELECT s.name, COUNT (sw.id) FROM public.storehouses s
JOIN public.manufacturers_storehouses ms ON s.id = ms.storehouses_id
JOIN public.sweets sw ON sw.manufacturer_id = ms.manufacturers_id
GROUP BY s.name;
✅ Обучился несложным запросам SQL!
Конечно за ночь весь SQL не изучить, но разобраться с необходимым минимум для несложных задач или собеседования вполне реально. Главное желание учиться!
А какие каверзные задачки по SQL задавали вам на собеседовании или встречались в вашей работе?
![](https://webcf.waybackmachine.org/web/20220506210921/https://habrastorage.org/getpro/habr/upload_files/43c/96a/305/43c96a305b5d8255e65bb7249fda1f79.jpg)