https://github.com/andreiextr/guide_sql
https://github.com/andreiextr/guide_sql
Last synced: 5 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/andreiextr/guide_sql
- Owner: AndreiExtr
- Created: 2024-12-07T17:10:17.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2024-12-15T17:51:40.000Z (over 1 year ago)
- Last Synced: 2025-04-04T09:46:07.145Z (about 1 year ago)
- Size: 139 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README

# Справочник по SQL
### Ссылки на источники
1. [Официальная документация по MySQL](https://dev.mysql.com/doc/refman/8.0/en/)
2. [Официальная документация по PostreSQL](https://postgrespro.ru/docs/postgresql/13/index)
## Что такое SQL?
SQL — это язык структурированных запросов (Structured Query Language), позволяющий хранить, манипулировать и извлекать данные из реляционных баз данных (далее — РБД, БД).
## Почему SQL?
SQL позволяет:
- получать доступ к данным в системах управления РБД
- описывать данные (их структуру)
- определять данные в БД и управлять ими
- взаимодействовать с другими языками через модули SQL, библиотеки и предваритальные компиляторы
- создавать и удалять БД и таблицы
- создавать представления, хранимые процедуры (stored procedures) и функции в БД
- устанавливать разрешения на доступ к таблицам, процедурам и представлениям
## Процесс SQL
При выполнении любой SQL-команды в любой RDBMS (Relational Database Management System — система управления РБД, СУБД, например, PostgreSQL, MySQL, MSSQL, SQLite и др.) система определяет наилучший способ выполнения запроса, а движок SQL определяет способ интерпретации задачи.
В данном процессе участвует несколького компонентов:
- диспетчер запросов (Query Dispatcher)
- движок оптимизации (Optimization Engines)
- классический движок запросов (Classic Query Engine)
- движок запросов SQL (SQL Query Engine) и т.д.
Классический движок обрабатывает все не-SQL-запросы, а движок SQL-запросов не обрабатывает логические файлы.
## Команды SQL
Стандартными командами для взаимодействия с РБД являются `CREATE`, `SELECT`, `INSERT`, `UPDATE`, `DELETE` и `DROP`. Эти команды могут быть классифицированы следующим образом:
- `DDL` — язык определения данных (Data Definition Language)
|N|Команда|Описание|
|-----------|-----------|-----------|
| 1 | CREATE | Создает новую таблицу, представление таблицы или другой объект в БД |
| 2 | ALTER | Модифицирует существующий в БД объект, такой как таблица |
| 3 | DROP | Удаляет существующую таблицу, представление таблицы или другой объект в БД |
- `DML` — язык изменения данных (Data Manipulation Language)
|N|Команда|Описание|
|-----------|-----------|-----------|
| 1 | SELECT | Извлекает записи из одной или нескольких таблиц |
| 2 | INSERT | Создает записи |
| 3 | UPDATE | Модифицирует записи |
| 4 | DELETE | Удаляет записи |
- `DCL` — язык управления данными (Data Control Language)
|N|Команда|Описание|
|-----------|-----------|-----------|
| 1 | GRANT | Наделяет пользователя правами |
| 2 | REVOKE | Отменяет права пользователя |
***Обратите внимание***: использование верхнего регистра в названиях команд SQL — это всего лишь соглашение, большинство СУБД нечувствительны к регистру. Тем не менее, форма записи инструкций, когда названия команд пишутся большими буквами, а названия таблиц, колонок и др. — маленькими, позволяет быстро определять назначение производимой с данными операции.
## Что такое таблица?
Данные в СУБД хранятся в объектах БД, называемых таблицами (tables). Таблица, как правило, представляет собой коллекцию связанных между собой данных и состоит из определенного количества колонок и строк.
Таблица — это самая распространенная и простая форма хранения данных в РБД. Вот пример таблицы с пользователями (users):
|userId|userName|age|city|status|
|-----------|-----------|-----------|-----------|-----------|
| 1 | Igor | 24 | Moscow | active |
| 2 | Vika | 26 | Ekaterinburg | inactive |
| 3 | Elena | 27 | Ekaterinburg | active |
## Что такое нулевое значение?
Нулевое значение (NULL) — это значение поля, которое является пустым, т.е. нулевое значение — это значение поля, не имеющего значения. Важно понимать, что нулевое значение отличается от значения 0 и от значения поля, содержащего пробелы. `Поле с нулевым значением - это такое поля, которое осталось пустым при создании записи. Также, следует учитывать, что в некоторых СУБД пустая строка ('') — этоNULL`, а в некоторых — это разные значения.
## Ограничения
Ограничения (constraints) — это правила, применяемые к данным. Они используются для ограничения данных, которые могут быть записаны в таблицу. Это обеспечивает точность и достоверность данных в БД.
Ограничения могут устанавливаться как на уровне колонки, так и на уровне таблицы.
Среди наиболее распространенных ограничений можно назвать следующие:
- `NOT NULL` — колонка не может иметь нулевое значение
- `DEFAULT` — значение колонки по умолчанию
- `UNIQUE` — все значения колонки должны быть уникальными
- `PRIMARY KEY` — первичный или основной ключ, уникальный идентификатор записи в текущей таблице
- `FOREIGN KEY` — внешний ключ, уникальный идентификатор записи в другой таблице (таблице, связанной с текущей)
- `CHECK` — все значения в колонке должны удовлетворять определенному условию
- `INDEX` — быстрая запись и извлечение данных
Любое ограничение может быть удалено с помощью команды `ALTER TABLE` и `DROP CONSTRAINT` + название ограничения. Некоторые реализации предоставляют сокращения для удаления ограничений и возможность отключать ограничения вместо их удаления.
## Целостность данных
В каждой СУБД существуют следующие категории целостности данных:
- целостность объекта (Entity Integrity) — в таблице не должно быть дубликатов (двух и более строк с одинаковыми значениями)
- целостность домена (Domain Integrity) — фильтрация значений по типу, формату или диапазону
- целостность ссылок (Referential integrity) — строки, используемые другими записями (строки, на которые в других записях имеются ссылки), не могут быть удалены
- целостность, определенная пользователем (User-Defined Integrity) — дополнительные правила
## Синтаксис SQL
Синтаксис — это уникальный набор правил и рекомендаций. Все инструкции SQL должны начинаться с ключевого слова, такого как `SELECT`, `INSERT`, `UPDATE`, `DELETE`, `ALTER`, `DROP`, `CREATE`, `USE`, `SHOW` и т.п. и заканчиваться точкой с запятой (;) (точка с запятой не входит в синтаксис SQL, но ее наличия, как правило, требуют консольные клиенты СУБД для обозначения окончания ввода команды). SQL не чувствителен к регистру, т.е. `SELECT`, `select` и `SeLeCt` являются идентичными инструкицями. Исключением из этого правила является MySQL, где учитывается регистр в названии таблицы.
### Примеры синтаксиса
```
-- выборка
SELECT col1, col2, ...colN
FROM tableName;
SELECT DISTINCT col1, col2, ...colN
FROM tableName;
SELECT col1, col2, ...colN
FROM tableName
WHERE condition;
SELECT col1, col2, ...colN
FROM tableName
WHERE condition1 AND|OR condition2;
SELECT col2, col2, ...colN
FROM tableName
WHERE colName IN (val1, val2, ...valN);
SELECT col1, col2, ...colN
FROM tableName
WHERE colName BETWEEN val1 AND val2;
SELECT col1, col2, ...colN
FROM tableName
WHERE colName LIKE pattern;
SELECT col1, col2, ...colN
FROM tableName
WHERE condition
ORDER BY colName [ASC|DESC];
SELECT SUM(colName)
FROM tableName
WHERE condition
GROUP BY colName;
SELECT COUNT(colName)
FROM tableName
WHERE condition;
SELECT SUM(colName)
FROM tableName
WHERE condition
GROUP BY colName
HAVING (function condition);
-- создание таблицы
CREATE TABLE tableName (
col1 datatype,
col2 datatype,
...
colN datatype,
PRIMARY KEY (одна или более колонка)
);
-- удаление таблицы
DROP TABLE tableName;
-- создание индекса
CREATE UNIQUE INDEX indexName
ON tableName (col1, col2, ...colN);
-- удаление индекса
ALTER TABLE tableName
DROP INDEX indexName;
-- получение описания структуры таблицы
DESC tableName;
-- очистка таблицы
TRUNCATE TABLE tableName;
-- добавление/удаление/модификация колонок
ALTER TABLE tableName ADD|DROP|MODIFY colName [datatype];
-- переименование таблицы
ALTER TABLE tableName RENAME TO newTableName;
-- вставка значений
INSERT INTO tableName (col1, col2, ...colN)
VALUES (val1, val2, ...valN)
-- обновление записей
UPDATE tableName
SET col1 = val1, col2 = val2, ...colN = valN
[WHERE condition];
-- удаление записей
DELETE FROM tableName
WHERE condition;
-- создание БД
CREATE DATABASE [IF NOT EXISTS] dbName;
-- удаление БД
DROP DATABASE [IF EXISTS] dbName;
-- выбор БД
USE dbName;
-- завершения транзакции
COMMIT;
-- отмена изменений
ROLLBACK;
```
## Выражения
Выражение (expression) — это комбинация значений, операторов и функций для оценки (вычисления) значения. Выражения похожи на формулы, написанные на языке запросов. Они могут использоваться для извлечения из БД определенного набора данных.
Базовый синтаксис выражения выглядит так:
```
SELECT col1, col2, ...colN
FROM tableName
WHERE [condition|expression];
```
Существуют различные типы выражений: логические, числовые и выражения для работы с датами.
### Логические
Логические выражения извлекают данные на основе совпадения с единичным значением.
```
SELECT col1, col2, ...colN
FROM tableName
WHERE выражение для поиска совпадения с единичным значением;
```
Предположим, что в таблице users имеются следующие записи:
|userId|userName|age|city|status|
|-----------|-----------|-----------|-----------|-----------|
| 1 | Igor | 24 | Moscow | active |
| 2 | Vika | 26 | Ekaterinburg | inactive |
| 3 | Elena | 27 | Ekaterinburg | active |
Выполняем поиск активных пользователей:
```
SELECT * FROM users WHERE status = active;
```
Результат:
|userId|userName|age|city|status|
|-----------|-----------|-----------|-----------|-----------|
| 1 | Igor | 24 | Moscow | active |
| 3 | Elena | 27 | Ekaterinburg | active |
### Числовые
Используются для выполнения арифметических операций в запросе.
```
SELECT numericalExpression as operationName
[FROM tableName
WHERE condition];
```
Простой пример использования числового выражения:
```
SELECT (10 + 5) AS addition;
```
Результат:
|addition|
|-----------|
| 15 |
Существует несколько встроенных функций, таких как count(), sum(), avg(), min(), max() и др. для выполнения так называемых агрегирующих вычислений данных таблицы или колонки.
```
SELECT COUNT(*) AS records FROM users;
```
Результат:
|records|
|-----------|
| 4 |
- ```AVG``` - вычисляет среднее значение
- ```SUM``` - вычисляет сумму значений
- ```MIN``` - вычисляет наименьшее значение
- ```MAX``` - вычисляет наибольшее значение
- ```COUNT``` - вычисляет количество записей в таблице
Также существует несколько встроенных функций для работы со строками:
- ```CONCAT``` - объединение строк
- ```LENGTH``` - возвращает количество символов в строке
- ```TRIM``` - удаляет пробелы в начале и конце строки
- ```SUBSTRING``` - извлекает подстроку из строки
- ```REPLACE``` - заменяет подстроку в строке
- ```LOWER``` - переводит символы строки в нижний регистр
- ```UPPER``` - переводит символы строки в верхний регистр
с числами:
- ```ROUND``` - округляет число
- ```TRUNCATE``` - обрезает дробное число до указанного количества знаков после запятой
- ```CEILING``` - возвращает наименьшее целое число, которое больше или равно текущему значению
- ```FLOOR``` - возвращает наибольшее целое число, которое меньше или равно текущему значению
- ```POWER``` - возводит число в указанную степень
- ```SQRT``` - возвращает квадратный корень числа
- ```RAND``` - генерирует случайное число с плавающей точкой в диапазоне от 0 до 1
### Выражения для работы с датами
Эти выражения, как правило, возвращают текущую дату и время.
```
SELECT CURRENT_TIMESTAMP;
```
Результат:
|Current_Timestamp|
|-----------|
| 2021-06-20 12:45:00 |
```CURRENT_TIMESTAMP``` - это и выражение, и функция (```CURRENT_TIMESTAMP()```). Другая функция для получения текущей даты и времени - ```NOW()```.
Другие функции для получения текущей даты и времени:
- ```CURDATE/CURRENT_DATE``` - возвращает текущую дату
- ```CURTIME/CURRENT_TIME``` - возвращает текущее время