SQL¶
Он же - язык структурированных запросов.
Про стандарты¶
SQL - это стандарт для работы с реляционной СУБД, но есть нюанс - каждая СУБД любит вставлять свои фичи, образуя так называемый диалект. Вот несколько из них, которые часто встречаются:
- PL/pgSQL - (Procedural Language/PostGres Structured Query Language) – используется в PostgreSQL.
- T-SQL – используется в Microsoft SQL Server.
- PL/SQL (Procedural Language / Structured Query Language) – используется в Oracle Database.
Операторы¶
Порядок обработки операторов¶
Всё зависит от используемой БД, но как правило порядок следующий:
- FROM (выбор таблиц)
- JOIN (комбинация по условиям)
- WHERE (фильтрация)
- GROUP BY (группировка)
- HAVING (фильтрация на основе групп)
- SELECT (возвращение результирующего датасета)
- DISTINCT (возврат уникальных)
- ORDER BY (сортировка)
- LIMIT и OFFSET
HAVING¶
Для фильтрации строк по значениям агрегатных функций используется оператор HAVING.
Отличие HAVING
от WHERE
:
WHERE
— сначала выбираются записи по условию, а затем могут быть сгруппированы, отсортированы и т.д.HAVING
— сначала группируются записи, а затем выбираются по условию, при этом, в отличие отWHERE
, в нём можно использовать значения агрегатных функций
Ссылки¶
- Руководство по стилю SQL · SQL Style Guide
- Форматтер SQL
- SQL для дата анализа
- SQL tutorial с разбором кучи задач
Сниппеты¶
Получение года из даты¶
Если есть задача, где нужно получить год из даты, можно воспользоваться функцией YEAR. Например, есть следующая задача - определить, какие товары не покупались в 2005 году:
MySQL¶
SELECT good_name FROM Goods AS g
WHERE g.good_id NOT IN (
SELECT good FROM Payments AS p
WHERE YEAR(p.date) = 2005 /* Здесь мы получаем год из даты и сравниваем его с 2005 */
)
Получение разницы между датами¶
MySQL¶
Это можно сделать при помощи функции TIMESTAMPDIFF
. Синтаксис следующий:
mysql> SELECT TIMESTAMPDIFF (MONTH, '2009-05-18', '2009-07-29');
+ ------------------------------------------------ +
| TIMESTAMPDIFF (МЕСЯЦ, '2009-05-18', '2009-07-29') |
+ ------------------------------------------------ +
| 2 |
+ ------------------------------------------------ +
1 ряд в наборе (0,00 сек)