Перейти к содержанию

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.

Операторы

Порядок обработки операторов

Всё зависит от используемой БД, но как правило порядок следующий:

  1. FROM (выбор таблиц)
  2. JOIN (комбинация по условиям)
  3. WHERE (фильтрация)
  4. GROUP BY (группировка)
  5. HAVING (фильтрация на основе групп)
  6. SELECT (возвращение результирующего датасета)
  7. DISTINCT (возврат уникальных)
  8. ORDER BY (сортировка)
  9. LIMIT и OFFSET

HAVING

Для фильтрации строк по значениям агрегатных функций используется оператор HAVING.

Отличие HAVING от WHERE:

  • WHERE — сначала выбираются записи по условию, а затем могут быть сгруппированы, отсортированы и т.д.
  • HAVING — сначала группируются записи, а затем выбираются по условию, при этом, в отличие от WHERE, в нём можно использовать значения агрегатных функций

Ссылки

Сниппеты

Получение года из даты

Если есть задача, где нужно получить год из даты, можно воспользоваться функцией 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. Синтаксис следующий:

TIMESTAMPDIFF (единица измерения, datetime_expr1, datetime_expr2);
Пример:
mysql> SELECT TIMESTAMPDIFF (MONTH, '2009-05-18', '2009-07-29');
+ ------------------------------------------------ +
| TIMESTAMPDIFF (МЕСЯЦ, '2009-05-18', '2009-07-29') |
+ ------------------------------------------------ +
| 2 | 
+ ------------------------------------------------ +
1 ряд в наборе (0,00 сек)