SQL-запросы на каждый день

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

Все запросы ниже рассматриваются на примере таблиц битрикса. Так уж сложилось у автора.

Выборка: 

Запросы на выборку (если не углубляться в теорию) выглядят примерно следующим образом:

SELECT DISTINCT b_iblock_element.NAME FROM b_iblock_element, b_catalog_product WHERE b_iblock_element.ID = b_catalog_product.ID AND b_iblock_element.ACTIVE = ‘Y’ AND b_catalog_product.QUANTITY > 0 AND b_iblock_element.DETAIL_TEXT = »;

 

Где DISTINCT — это удаление дубликатов, а скелет запроса выглядит так:

Select … From … Where … ;

При желании можно задать псевдоним для таблицы (в рамках запроса) или столбца (при выводе) через AS. Например, …FROM b_iblock_element AS s1…;

Вставка:

Insert — это всегда добавление строк в существующую таблицу. То есть, если ранее записи в таблице не существовало — её можно вставить таким образом:

INSERT INTO b_iblock_element(NAME, ACTIVE, CODE) VALUES (‘TES’, ‘Y’, 'tes');

 

Обновление:

В том случае, если требуется обновить существующее значение, то используется UPDATE, который в простейшем варианте выглядит так:

UPDATE b_iblock_element SET CODE = ''

Данная команда обновит все значения CODE в таблице b_iblock_element.

Однако, в рамках битрикса, зачастую приходится объединять таблицы между собой для обновления данных. Например, так:

UPDATE b_iblock_element as s1 
LEFT JOIN
b_iblock_element_prop_s28 as s2
ON
s1.ID = s2.IBLOCK_ELEMENT_ID
SET PREVIEW_TEXT = CONCAT_WS(" , ", s1.XML_ID, s1.NAME, REPLACE(s1.NAME,' ',''), REPLACE(s2.PROPERTY_4602, ' ','')) WHERE s1.IBLOCK_ID = 28;

LEFT JOIN — объединяет таблицы

REPLACE — в данном случае удаляет пробелы из входной строки

CONCAT_WS — объединяет аргументы в строку через разделитель

В упрощенном варианте запросы выглядят так:

UPDATE … LEFT JOIN … ON … WHERE … ;

Удаление:

DELETE просто удаляет данные из таблицы. В упрощенном виде он выглядит так:

DELETE FROM ... WHERE ...

A TRUNCATE полностью очищает таблицу и (в MySQL) сбрасывает значения авто_инкремента. Выглядит так:

TRUNCATE TABLE ...

CONCAT_WS и GROUP_CONCAT:

CONCAT_WS позволяет объединить строки (или какие-либо иные значения) через разделитель. Например:

UPDATE b_iblock_element
SET PREVIEW_TEXT = CONCAT_WS(" ", 'Отзыв о товаре', NAME);

Результатом выполнения запроса будет фраза вида «Отзыв о товаре Таком-то», то есть строки объединены и разделены через пробел.

GROUP_CONCAT — позволяет объединить некую группу записей по определенному основанию. Например, может потребоваться вывести список аксессуаров к определенной модели (модель одна, а аксессуаров много). Задачи такого плана можно решить с помощью функции GROUP_CONCAT.

Синтаксис этого запроса выглядит следующим образом:

SELECT NAME, GROUP_CONCAT (DISTINCT ACSS ORDER BY ACSS DESC SEPARATOR ',')
FROM b_iblock_element
GROUP BY
NAME

То есть все аксессуары будут объединены в одну строку и разделены через запятую (параметр SEPARATOR). В принципе всё, теоретическое основание данной функции достаточно обширно, поэтому его касаться не будем.

LEFT JOIN в UPDATE:

LEFT JOIN позволяет объединять таблицы. Существуют еще несколько JOIN’ов (О различии их хорошая картинка ниже), но чаще всего используется левое объединение. Запрос с использование LEFT JOIN выглядит, чаще всего, так:

UPDATE b_iblock_element as s1 
LEFT JOIN
b_iblock_element_prop_s28 as s2
ON
s1.ID = s2.IBLOCK_ELEMENT_ID;

Чем различаются разные JOIN’ы?

Достаточно хорошая картинка, поясняющая различие между разными Join’ами:

В принципе, на этом все наиболее часто используемые запросы заканчиваются. В целом, неплохой получился «справочник».