SQL (Часть 2)

К сожалению, тут код не вставишь и более адекватная верстка в статье - <a href="https://telegra.ph/SQL-CHast-2-12-25" rel="nofollow noreferrer noopener" target="_blank">ссылка</a>
К сожалению, тут код не вставишь и более адекватная верстка в статье - ссылка

Пролог

Не знаю на сколько вам нужно знать о том, когда был создан SQL, его нотации, стандарты и куча теоретической базы, но вот практика точно нужна! Теорию конечно же не отрицаю, так как она показывает насколько глубоко вы знаете язык и ваш технический кругозор, попробую дать как-нибудь позже, а пока давайте практиковаться! Возможно у вас уже завтра собеседование, а вы ещё не готовы или второпях ищите нужную информацию и в её обилии попадается уйма мусора и вы тратите огромное количество времени на то, чтобы найти нужный материал и подготовиться. А, возможно, вы уже действующий специалист и вам нужно погрузиться в sql, но нет доступного пособия, чтобы освоить, я конечно не говорю, что создам плацебо, но тем не менее хочу дать понятный туториал, чтобы каждый мог получить нужное ему.

Статья для начинающих и мидловых специалистов, сеньорам может быть скучно.

Что нужно знать аналитику?

  • Основы SQL. Знание основных операторов SQL, таких как CRUD: SELECT, INSERT, UPDATE, DELETE - для работы с данными.
  • Фильтрация и сортировка данных. Использование условий WHERE для фильтрации, ORDER BY и сортировки данных.
  • Соединение таблиц. Понимание различных типов соединений (JOIN), таких как INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, для объединения данных из разных таблиц.
  • Группировка данных: Использование GROUP BY и агрегатных функций (COUNT, SUM, AVG, MAX, MIN) для группирования данных и выполнения вычислений на группах.
  • Подзапросы и вложенные запросы. Использование подзапросов для создания сложных запросов.
  • Оконные функции. Применение оконных функций, таких как ROW_NUMBER, RANK, для выполнения расчетов в рамках определенного набора строк ("окон").
  • Оптимизация запросов. Понимание индексов, планов выполнения запросов и других аспектов для оптимизации производительности запросов.
  • Транзакции и управление версиями. Основы работы с транзакциями, уровни изоляции транзакций для обеспечения целостности данных. Senior!!!
  • Безопасность данных. Понимание ролей, разрешений и других аспектов безопасности для защиты данных. Senior!!! (А может вообще не пригодиться)
  • Работа с разными СУБД. Осведомленность о различиях в синтаксисе и функциональности между разными системами управления базами данных, такими как MySQL, PostgreSQL, Oracle, SQL Server.

Уровни аналитиков и SQL

Теперь попробуем распределить по уровням аналитиков, какие знания должны быть

SQL (Часть 2)

Junior System Analyst

  • Основы SQL (CRUD);
  • Фильтрация и сортировка данных (WHERE);
  • Соединение таблиц(JOIN);
  • Простые агрегатные функции;
  • Основы работы с транзакциями;

Middle System Analyst

  • Продвинутое соединение таблиц(LEFT, RIGHT, FULL JOIN...);
  • Группировка данных в сочетании с агрегатными функциями;
  • Подзапросы;
  • Оконные функции;
  • Основы оптимизации запросов;
  • Безопасность данных.

Senior System Analyst

  • Продвинутая оптимизация запросов;
  • Расширенные транзакции и управление версиями;
  • Расширенная безопасность данных;
  • Работа с разными СУБД;
  • Практика в решении сложных аналитических задач.

Теперь четко разделим операторы языка по категориям и опишем каждый опертор

  • DDL (Data Definition Language)
  • CREATE: Создание новых таблиц, представлений, индексов и т.д.
  • ALTER: Изменение структуры существующих таблиц.
  • DROP: Удаление таблиц, представлений, индексов и т.д.
  • TRUNCATE: Очистка всех строк из таблицы, сохраняя её структуру.

2. DQL (Data Query Language)

  • SELECT: Извлечение данных из базы данных.

3. DML (Data Manipulation Language)

  • INSERT: Вставка новых строк в таблицу.
  • UPDATE: Обновление существующих строк в таблице.
  • DELETE: Удаление строк из таблицы.

4. DCL (Data Control Language) - АНАЛИТИКИ НЕ ИСПОЛЬЗУЮТ!

  • GRANT: Предоставление прав доступа пользователям.
  • REVOKE: Отзыв прав доступа у пользователей.

5. TCL (Transaction Control Language) - В РАМКАХ NoSQL не работает!

  • COMMIT: Фиксация всех изменений, сделанных в транзакции.
  • ROLLBACK: Отмена всех изменений, сделанных в текущей транзакции.
  • SAVEPOINT: Установка точек, к которым можно вернуться в рамках транзакции.
  • SET TRANSACTION: Установка свойств для транзакции.

Практика!

В рамках практики поработаем с традиционными таблицами Employees (Сотрудники), Departments (Отделы).

Логическая модель данных

Employees:

  • EmployeeID (ID сотрудника);
  • FIO (ФИО);
  • DepartmentID (ID отдела);
  • Salary (Зарплата);

Departments:

  • DepartmentID (ID отдела);
  • DepartmentName (Название отдела).

0 Подготовительные работы

Давайте предварительно создадим таблицы Employees и Departments с некоторыми тестовыми данными по логической модели.

STEP 1 Создание таблицы отделов - Departments

CREATE TABLE Departments ( DepartmentID INT PRIMARY KEY, DepartmentName VARCHAR(100) );

STEP 2 Создание таблицы сотрудников - Employees

CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, FIO VARCHAR(150), DepartmentID INT, Salary DECIMAL(10, 2), FOREIGN KEY (DepartmentID) REFERENCES Departments(DepartmentID) );

STEP 3 Вставка данных в таблицу отделов - Departments

INSERT INTO Departments (DepartmentID, DepartmentName) VALUES (1, 'IT'), (2, 'Human Resources'), (3, 'Finance'), (4, 'Marketing'), (5, 'Sales'), (6, 'Research and Development'), (7, 'Customer Service'), (8, 'Legal'), (9, 'Administration'), (10, 'Production');

STEP 4 Вставка данных в таблицу - Employees

INSERT INTO Employees (EmployeeID, FIO, DepartmentID, Salary) VALUES (1, 'Иванов Иван Иванович', 1, 50000), (2, 'Петров Петр Петрович', 2, 45000), (3, 'Сидоров Сидор Сидорович', 3, 48000), (4, 'Алексеев Алексей Алексеевич', 1, 52000), (5, 'Николаев Николай Николаевич', 4, 43000), (6, 'Васильев Василий Васильевич', 5, 47000), (7, 'Максимов Максим Максимович', 6, 51000), (8, 'Григорьев Григорий Григорьевич', 7, 45000), (9, 'Дмитриев Дмитрий Дмитриевич', 8, 49000), (10, 'Егоров Егор Егорович', 9, 44000);

1 Основы SQL

А теперь как раз к тому, что должен знать любой аналитик, да и вообще ИТ специалист.

SELECT.

Получить все данные о сотрудниках (* - выводит все столбцы)

SELECT * FROM Employees;

Получить ФИО, зарплату сотрудников (прямое указание нужных атрибутов, выводит выводит только нужные)

SELECT fio, salary FROM Employees;

INSERT. Добавить нового сотрудника

INSERT INTO Employees (EmployeeID, Name, DepartmentID, Salary) VALUES (11, 'Иванов Иван Акатьевич', 3, 50000);

После добавления нового сотрудника вы можете, снова сделать SELECT и удостовериться, что сотрудник создан

UPDATE. Увеличить зарплату сотруднику с ID 11 на 5000

UPDATE Employees SET Salary = Salary + 5000 WHERE EmployeeID = 11;

После обновления данных сотрудника вы можете, снова сделать SELECT и удостовериться, что данные изменились

DELETE. Удалить сотрудника с ID 11

DELETE FROM Employees WHERE EmployeeID = 123;

2 Фильтрация и Сортировка Данных

Получить имена сотрудников с зарплатой более 30000, отсортированные по зарплате в порядке убывания

SELECT Name FROM Employees WHERE Salary > 30000 ORDER BY Salary DESC;

3 Соединение таблиц / Объединение или работа с множествами

Получить список сотрудников вместе с названиями их отделов

SELECT E.Name, D.DepartmentName FROM Employees E INNER JOIN Departments D ON E.DepartmentID = D.DepartmentID;

4 Простые агрегатные функции

Получить среднюю зарплату по каждому отделу

SELECT D.DepartmentName, AVG(E.Salary) AS AverageSalary FROM Employees E INNER JOIN Departments D ON E.DepartmentID = D.DepartmentID GROUP BY D.DepartmentName;

!!! Запомни, не одна агрегирующая функция с выводом дополнительных столбцов, по которым эта агрегация будет делаться не заработает без указания по каким столбцам делать группировку в операторе GROUP BY

Получить просто среднюю зарплату

SELECT AVG(E.Salary) AS AverageSalary FROM Employees E INNER JOIN Departments D ON E.DepartmentID = D.DepartmentID;

!!! Запомни, но если ты выводишь просто значение по агрегационной функции, без столбцов, по которым будешь делать агрегацию - GROUP BY не нужен

Получить суммарную зарплату по каждому отделу

SELECT D.DepartmentName, SUM(E.Salary) AS SumSalary FROM Employees E INNER JOIN Departments D ON E.DepartmentID = D.DepartmentID GROUP BY D.DepartmentName;

Надеюсь, тебе намного проще чем этому джуну😉
Надеюсь, тебе намного проще чем этому джуну😉

5 Транзакции (ACID)

Базовая транзакция

Увеличить зарплату сотрудника с EmployeeID = 1 на 10000 и одновременно уменьшить зарплату сотрудника с EmployeeID = 2 на 10000, обеспечивая, чтобы обе операции были выполнены как одна транзакция.

START TRANSACTION;

UPDATE Employees SET Salary = Salary + 10000 WHERE EmployeeID = 1;

UPDATE Employees SET Salary = Salary - 10000 WHERE EmployeeID = 2;

COMMIT;

Транзакция с откатом

Попробуем выполнить те же обновления, что и в предыдущем примере, но сделаем откат транзакции, если зарплата сотрудника уходит в минус.

```sql

START TRANSACTION; UPDATE Employees SET Salary = Salary + 10000 WHERE EmployeeID = 1;

-- Предположим, что зарплата сотрудника с EmployeeID = 2 становится отрицательной

-- Здесь должна быть проверка, но для примера просто делаем откат ROLLBACK;

-- Если бы проверка показала, что все в порядке, то использовался бы

COMMIT.

```

Использование SAVEPOINT

В рамках одной транзакции изменить зарплаты нескольких сотрудников, но при ошибке в одном из обновлений откатиться к определенной точке, а не отменять всю транзакцию.

START TRANSACTION; SAVEPOINT Savepoint1; UPDATE Employees SET Salary = Salary + 5000 WHERE EmployeeID = 3; SAVEPOINT Savepoint2; UPDATE Employees SET Salary = Salary - 2000 WHERE EmployeeID = 4; -- Предположим, что обновление для EmployeeID = 4 вызвало ошибку ROLLBACK TO Savepoint1; COMMIT;

Фух, буду ждать от вас обратной связи, что получили вы и добавлю если потребуется скрины, того как должно всё получаться, или внесу правки. Используйте PostgreSQL. В следующей части затрону, то что нужно знать мидлу, и если останется время сеньору. До следующей встречи!

Канал - <a href="https://t.me/it_underside" rel="nofollow noreferrer noopener" target="_blank">ИЗНАНКА ИТ</a>
Канал - ИЗНАНКА ИТ
11
Начать дискуссию