Чистый SQL или ORM и Query Builder? — Пятиминутка PHP
Небольшая заметка с полей.
Недавно втянулся в использование SQL синтаксиса LEFT JOIN LATERAL – ключевое слово LATERAL. Буквально по-другому стал смотреть на решение некоторых задач!
Проверил по документации, погугил, в популярных PHP ORM – нигде нет поддержки LATERAL, ни в Doctrine, ни в Laravel Query Builder, ни в Yii Query Builder, ни в Cycle ORM
И тут хочу дать пояснение, моё отношение к различным Query Builder и обёрткам над SQL синтаксисом. Вот какой подход я применяю при выборе между написанием простого SQL и использованием Query Builder / ORM:
• Если мне нужно поработать с конкретной сущностью в ООП стиле, скорее всего у меня уже есть описание модели реализованное для той или иной ORM, соответственно использую модель, использую ООП, под капотом все запросы за меня строит и выполняет ORM;
• Зачастую базовый фреймворк / админка / CRM предоставляют некую точку расширения, где нужно вписать небольшую функцию или переопределить метод и в этой точке расширения фреймворк нам в явном виде передаёт заготовку Query Builder – использую эту заготовку, навешивая свои дополнения к запросу. Обычно в этот Query Builder я добавляю условия отбора или атрибуты;
• Если я сам пишу некий фреймворк и подготавливаю эти точки расширения для будущих программистов, то создаю заготовку Query Builder;
• Во всех остальных случаях, когда надо сделать выборку из базы и, скорее всего, это выборка из двух или более таблиц, да ещё с подзапросами или EXISTS – тогда предпочитаю чистый SQL! Обычный SQL хорошо читается глазами, хорошо подсвечивается в PhpStorm и отлаживать его гораздо проще, чем Query Builder с миксом из анонимных функций.
По моей схеме выше кажется, что чистый SQL занимает всего один пункт из четырёх, но на практике это не так уж мало!
Ещё одно возражение против написания SQL – я ухожу от высокоуровневых абстракций работы с сущностями и их связями и проваливаюсь на более низкий уровень хранения данных. Может лучше обернуть всю низкоуровневую работу как минимум в некий репозитории или использовать языки типа DQL? Может и лучше. Надо смотреть по ситуации.
Когда по проекту раскидано много уникальных и не тривиальных запросов на чистом SQL и, допустим, мы решили сделать рефакторинг реляционной схемы БД, в этом случае придётся перелопатить все вручную написанные SQL запросы, раскиданные по разным файлам и модулям – проблемка. Кажется, используя паттерн репозиторий, т. е. некие классы прослойки, инкапсулирующие конкретные SQL запросы, большой рефакторинг схемы данных был бы проще.
С другой стороны, подобные классы репозитории со временем накапливают в себе совершенно разношерстные SQL запросы, множество частных случаев и в итоге превращаются некие GOD репозитории (по аналогии с GOD Object или Helper или Utils классами). Либо, если делить классы репозитории по модулям и подсистемам их становится так много, мы возвращаемся к тому, с чего начали – SQL запросы размазаны по коду всего проекта, сложно рефакторить схему.
Как всегда то или иное решение – это компромисс или tradeoff. Мой опыт и мой выбор таков, что я не стесняюсь писать запросы на чистом SQL по месту их применения, не вынося всю работу с базой в некие репозитории. А когда придёт время рефакторинга PhpStorm мне поможет. Да, PhpStorm умеет рефакторить и SQL запросы тоже! Я могу переименовать таблицу или атрибут во вкладке Database и этот переименование произойдёт и в кодовой базе, но только в тех местах, где PhpStorm разспознал SQL язык, сделал так называемый language injection. Конечно, переименование и Find Usages в PhpStorm не покрывают всех сценариев рефакторинга схемы данных, но как это часто бывает по правилу Парето – в 80% случаев достаточно.
Под конец дам ссылку на презентацию доклада Валентина Удальцова с PHP Russia 2021. Процитирую основные тезисы:
ORM, QueryBuilder’ы и прочие абстракции связывают руки при попытке использовать БД на полную катушку. Какой смысл выбирать между PostgreSQL, MySQL и Oracle, если ваша библиотека всё равно не умеет в upsert, lateral join, returning, json path и оконные функции?
В докладе я расскажу, как мы в Happy Inc. прошли путь от Doctrine ORM через DBAL и кастомный QueryBuilder до нативных запросов в чистом виде, и объясню, почему это во всех смыслах выгодное архитектурное решение.
https://phprussia.ru/moscow/2021/abstracts/7654
Всем SQL!
Все о SQL языке структурированных запросов – This is Data
SQL или structured query language — это язык структурированных запросов применяемый для создания, модификации и управления данными в реляционной базе данных.
Автор: Роман Романчук
Оконные функции — это мощнейший инструмент аналитика, который с легкостью помогает решать множество задач. Если вам нужно произвести вычисление над заданным набором строк, объединенных каким-то одним признаком, например идентификатором клиента, вам на помощь придут именно они.
Автор: Роман Романчук
В своей прошлой статье я рассказывал про программные возможности языка SQL и обещал поделиться кейсом по созданию автоматизированного отчета на основе стека технологий MS SQL Server и Power BI.
Автор: Роман Романчук
Многие аналитики работающие с SQL и занимающиеся анализом данных, никогда не сталкивались с программированием на этом языке, потому что SQL в первую очередь язык структурированных запросов, а не полноценный язык программирования. Однако, программные возможности в нем есть, хотя и весьма скромные.
Автор: Роман Романчук
Средняя зарплата… Средняя продолжительность жизни… Практически каждый день мы с вами слышим эти словосочетания, используемые для описания множества одним единственным числом. Но как ни странно, «среднее значение» — достаточно коварное понятие, часто вводящее в заблуждение обычного, неискушенного в математической статистике, человека.
Автор: Роман Романчук
В прошлой статье мы с вами узнали что такое когортный анализ и как его сделать с помощью лучшего друга любого веб-аналитика — MS Excel. Сегодня я предлагаю вам избавиться от рутины и автоматизировать данный отчет при помощи BigQuery и Data Studio.
Автор: Роман Романчук
В первой части данной статьи мы учились подключаться к Google BigQuery, рассмотрели оператор SELECT и его параметры, попробовали написать простые запросы. Сегодня я хотел бы рассказать о более продвинутых возможностях SQL. Давайте вспомним, что хотел от нас бизнес в первой части, а хотел он следующее:
Поиск: ‘
- Все посты39
- Анализ данных12
- Визуализация данных10
- Сбор данных13
- Системный анализ3
- Хранение и обработка данных8
Оператор SQL Server OR на практических примерах
Резюме : в этом руководстве вы узнаете, как использовать оператор SQL Server ИЛИ
для объединения двух логических выражений.
Знакомство с SQL Server
Оператор OR
SQL Server OR
— это логический оператор, позволяющий комбинировать два логических выражения. Он возвращает TRUE
, когда любое из условий оценивается как TRUE
.
Ниже показан синтаксис ИЛИ
оператор:
Язык кода: SQL (язык структурированных запросов) (sql)
логическое_выражение ИЛИ логическое_выражение
В этом синтаксисе boolean_expression
— это любое допустимое логическое выражение, которое оценивается как истинное, ложное и неизвестное.
В следующей таблице показан результат оператора ИЛИ
при объединении ИСТИНА
, ЛОЖЬ
и НЕИЗВЕСТНО
:
TRUE | FALSE | UNKNOWN | |
---|---|---|---|
TRUE | TRUE | TRUE | TRUE |
FALSE | TRUE | FALSE | UNKNOWN |
НЕИЗВЕСТНО | ИСТИНА | НЕИЗВЕСТНО | НЕИЗВЕСТНО |
При использовании более одного логического оператора в операторе SQL Server оценивает 9Операторы 0005 OR после оператора AND
. Однако вы можете использовать круглые скобки, чтобы изменить порядок оценки.
Примеры операторов SQL Server
OR
См. следующую таблицу production.roducts
из примера базы данных.
A) Пример использования оператора
ИЛИ
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБЕРИТЕ наименование товара, список цен ИЗ производство.продукция КУДА list_price < 200 ИЛИ list_price > 6000 СОРТИРОВАТЬ ПО список цен;
B) Пример использования нескольких операторов
OR
ВЫБРАТЬ
наименование товара,
brand_id
ИЗ
производство.продукция
КУДА
идентификатор_бренда = 1
ИЛИ бренд_id = 2
ИЛИ бренд_id = 4
СОРТИРОВАТЬ ПО
brand_id DESC; Язык кода: SQL (язык структурированных запросов) (sql) Можно заменить несколько 9Операторы 0005 OR оператором IN
, как показано в следующем запросе:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT наименование товара, brand_id ИЗ производство. продукция КУДА brand_id IN (1, 2, 3) СОРТИРОВАТЬ ПО brand_id DESC;
C) Использование оператора
OR
с оператором AND
примерРассмотрим следующий пример:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT наименование товара, идентификатор_бренда, список цен ИЗ производство.продукция КУДА идентификатор_бренда = 1 ИЛИ бренд_id = 2 И list_price > 500 СОРТИРОВАТЬ ПО brand_id DESC, список цен;
ИЛИ
и И
. Как всегда, SQL Server сначала оценивал оператор AND
. Таким образом, запрос возвратил продукты с идентификатором бренда 2 и прейскурантной ценой выше 500 или товары с идентификатором бренда 1.Чтобы найти продукты с идентификатором бренда 1 или 2 и прейскурантной ценой выше 500, используйте круглые скобки, как показано в следующем запросе:
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБЕРИТЕ наименование товара, идентификатор_бренда, список цен ИЗ производство.продукция КУДА (brand_id = 1 ИЛИ brand_id = 2) И list_price > 500 СОРТИРОВАТЬ ПО идентификатор_бренда;
В этом руководстве вы узнали, как использовать оператор SQL Server OR
для формирования условия путем объединения двух логических выражений.
Оператор SQL OR и его практическое применение
Резюме : в этом руководстве вы узнаете, как использовать оператор SQL OR для объединения двух логических выражений.
Введение в оператор SQL OR
SQL OR — это логический оператор, который объединяет два логических выражения. Оператор SQL OR возвращает значение true или false в зависимости от результатов выражений.
Оператор ИЛИ обычно используется в предложении WHERE
оператора SELECT
, UPDATE
или DELETE
для формирования гибкого условия.
Ниже показан синтаксис оператора SQL OR:
SELECT столбец1, столбец2, ... ИЗ Таблица 1 КУДА выражение1 ИЛИ выражение2;
В следующей таблице показан результат оператора OR
при сравнении значений true, false и NULL.
ИСТИНА | ЛОЖЬ | НОЛЬ | 57 80003 TRUE | TRUE | TRUE | TRUE |
FALSE | TRUE | FALSE | NULL |
NULL | TRUE | NULL | NULL |
Notice что оператор ИЛИ всегда возвращает истину, если одно из выражений истинно.
Если система базы данных поддерживает функцию короткого замыкания, оператор OR
прекращает вычисление оставшихся частей условия, как только одно из выражений становится истинным.
Обратите внимание, что функция короткого замыкания помогает системе базы данных экономить ресурсы процессора, прерывая обработку оставшейся части логического выражения, как только она может определить результат. Для получения дополнительной информации о функции короткого замыкания ознакомьтесь с руководством по оператору SQL AND.
При использовании оператора ИЛИ с оператором И система базы данных оценивает оператор ИЛИ после оператора И. Это известно как правило приоритета. Однако вы можете использовать круглые скобки, чтобы изменить порядок оценки.
Примеры оператора SQL ИЛИ
Мы будем использовать таблицу сотрудников
из примера базы данных для демонстрации оператора ИЛИ
.
Следующий оператор находит всех сотрудников, которые пришли в компанию в 1997 или 1998 году.
ВЫБЕРИТЕ Имя, фамилия, Дата приема на работу ИЗ сотрудники КУДА ГОД (дата_найма) = 1997 ИЛИ ГОД (дата_найма) = 1998 СОРТИРОВАТЬ ПО Имя, фамилия;
Попробуйте
Чтобы найти всех сотрудников, которые присоединились к компании в 1997 или 1997 и работал в отделе с идентификатором 3, вы используете операторы И
и ИЛИ
следующим образом:
SELECT Имя, фамилия, Дата приема на работу, id_отдела ИЗ сотрудники КУДА id_отдела = 3 А ТАКЖЕ ( ГОД (дата_найма) = 1997 ИЛИ ГОД (наем_дата) = 1998 ) СОРТИРОВАТЬ ПО Имя, фамилия;
Попробуйте
Если не использовать круглые скобки, запрос будет получать сотрудников, которые пришли в компанию в 1997 году и работали в отделе с идентификатором 3, или сотрудников, которые пришли в компанию в 1998 независимо от факультетов.
Это связано с тем, что система базы данных оценивает оператор OR
после оператора AND
.
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБЕРИТЕ Имя, фамилия, Дата приема на работу, id_отдела ИЗ сотрудники КУДА id_отдела = 3 И ГОД (наем_дата) = 1997 ИЛИ ГОД (наем_дата) = 1998 СОРТИРОВАТЬ ПО Имя, фамилия;
Попробуйте
Если запрос использует много ИЛИ
операторов, его будет трудно читать. Чтобы сделать запрос более читабельным, вместо него можно использовать оператор IN
.
Например, следующий запрос находит всех сотрудников, которые пришли в компанию в 1990, 1999 или 2000 году.
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБЕРИТЕ Имя, фамилия, Дата приема на работу ИЗ сотрудники КУДА ГОД (дата_найма) = 2000 ИЛИ ГОД (наем_дата) = 1999 ИЛИ ГОД (наем_дата) = 1990;
Попробуйте
Вы можете заменить операторы OR
оператором IN
следующим образом:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT Имя, фамилия, Дата приема на работу ИЗ сотрудники КУДА ГОД (дата найма) В (1990, 1999, 2000) СОРТИРОВАТЬ ПО Дата приема на работу;
Попробуйте
В этом руководстве вы узнали, как использовать оператор SQL OR
для объединения двух логических выражений для формирования гибкого условия.