Что такое SQL и как работает SELECT

Кому и зачем?

Представьте себе, что

  • вам нужно написать (или прочитать - мало ли кто его уже написал, но надо же разобраться как это работает) запрос к таблице или базе данных.
  • Вы никогда этого не делали (сами), но задача кажется не настолько сложной и достаточно важной чтобы воспользоваться случаем и наконец
  • разобраться что же это за SELECT такой, про который так много и часто слышно со всех сторон.

Что и кто?

SQL - это язык (стандарт) структурированных запросов. Запросов, очевидно, к базе данных, точнее, к её таблицам. Да, речь идёт о реляционных базах данных, состоящих из таблиц (отношений - relation). Под таблицей понимается множество записей (строк, рядов - row) одинаковой структуры, то есть состоящих из определённого набора полей (элементов столбцов - column).

Наверное самый популярный (известный широкой аудитории) запрос - это SELECT, возвращающий содержимое таблицы (в том числе, виртуальной - составленной из других таблиц и результатов других запросов) полностью (то самое, ставшее мемом SELECT * FROM a_table;) или частично (здесь всё сложнее, в том числе и с мемами). Логика его работы проста и изящна, а возможностей уточнения (структуры) запроса достаточно для того чтобы анализировать данные и представлять результаты в удобном виде.

Где и с чем?

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

Для начала традиционно определимся с дефинициями (определениями), а точнее с сущностями, о которых хотим порассуждать, или которые понадобятся для рассуждений.

  • Исходные данные (таблица - одна или несколько). Напомним, что таблица - это набор записей (строк) одинаковой структуры. Исходные данные, как правило, где-то хранятся, например, в базе данных.
  • Виртуальная таблица, в отличие от той, что представляет собой исходные данные - временная сущность, возникающая в результате обработки исходных данных.
  • Виртуальной таблицей, например, является результат выполнения SELECT, и данные, поступающие запросу на вход. Кстати, попытайтесь себе представить размер и структуру виртуальной таблицы из следующего примера (SELECT * FROM a_table, una_tabla;), если кома (запятая) эквивалентна CROSS JOIN, который в свою очередь суть декартово произведение.Так что, если вы перфекционист, не забывайте старину Декарта и не злоупотребляйте запятыми.
  • Агрегатом назовём результат агрегации (агрегирования) данных таблицы (исходной или виртуальной), то есть виртуальную таблицу, полученную путём объединения или группировки её записей (всех, или некоторых, или даже по группам).
  • Агрегат можно получить в результате выполнения запроса SELECT, использующего агрегатные функции и/или модификатор GROUP BY.В случае группировки, агрегатом уместно называть как всю совокупность полученных записей так и (если это требуется) каждую из записей
  • Модификатором назовём условие выбора записей таблицы, поступающей на вход SELECT или способ их обработки (например, вышеупомянутый GROUP BY).

Как?

Как же работает SELECT? Принцип очень простой - на вход поступает таблица (напомним: множество записей (строк) одинаковой структуры), некоторые строки которой могут быть исключены из рассмотрения или сгруппированы с помощью модификаторов (например, WHERE, GROUP BY, HAVING). На выход отправляется таблица, структура строк которой (содержимое полей - столбцов) явно описана между SELECT и FROM. Это могут быть все (*) или некоторые (явно указанные) столбцы входной таблицы, а также (явно описанные) выражения или агрегаты, вычисленные на основе этих столбцов.

Почему?

В чём же мощь (и причина популярности) этого (такого простого на первый взгляд) инструмента? Рискнём предположить, что помимо простой логики (см. предыдущий раздел), мощь SELECT обеспечивается широкими возможностями объединения и группировки (в том числе, с применением агрегирования) данных. За объединение “отвечает” JOIN, а за всё остальное (помимо GROUP BY и более продвинутых модификаторов) - агрегатные (в том числе, оконные) функции.

Оставим подробности для отдельных эссе, приведя лишь несколько примеров:

  • C помощью JOIN можно, например, обогащать исходную таблицу данными из другой, например, из таблицы-справочника.
  • По простому (например): таблицу объектов, привязанных к субъектам (по идентификатору субъекта) можно обогатить данными из справочника субъектов. А если таблица объектов используется только для привязки к субъектам, а подробная информация об объектах хранится в справочнике объектов (IMHO, это правильный (высокий) стиль), то можно добавить в JOIN и побольше информации о каждом объекте.
  • С помощью агрегатных оконных функций можно сегментировать и кластеризовать данные, заодно вычисляя необходимые метрики, характеризующие сегменты.
  • Ту же таблицу объектов из предыдущего абзаца можно сгруппировать по принадлежности к субъекту, которых в свою очередь можно сегментировать по какому-то из их параметров (мало ли характеристик субъекта может содержаться в справочнике). Да и объекты внутри группы по субъектам можно кластеризовать по какой-нибудь ещё характеристике самого объекта.

Опрос:

Захотелось ли вам научиться писать SQL запросы?

- Да! Я и не думал, что это так увлекательно!

- Да, но не раньше, чем выйдет обещанное продолжение про JOIN и агрегатные функции.

- Читать и понимать - скорее да, писать самому - наверное нет.

- Нет. Всё сложно и ничего не понятно. Ещё и Декарта вспомнили!

6868 показов
121121 открытие
Начать дискуссию