Делимся последними новостями о СУБД SoQoL

Найти и получить

Найти и получить Поговорим о реализации select в SoQoL.

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

Самый простой пример использования, «без изюминки» — запросить все данные из таблицы. Например:
select * from <источники_данных>;

Кстати, про источник данных:
– он может быть не один;
– допустимо в качестве источника указать select-запрос;
– допустимо указание соединение источников (inner join, natural join, outer join, cross join).

Например:
select * from TABLE1 natural inner join TABLE2;

Можно объединять запросы через union. который даст результат без дублирующих значений, а union all — позволит получить все значения, включая дублирующиеся.

Например:
select "Возраст", "Подразделение" from (select "Возраст", "Подразделение" from VORONEZH union select "Возраст", "Подразделение" from MOSCOW) where "Возраст" > 65;

А если нам нужен результат без дубликатов? В этом случае в запрос добавляем ключевое слово distinct.

Например:
select distinct CITY from PHONE;

Если не нужны значения всех столбцов, тогда указываем вместо * конкретные столбцы и для любого из них можно указать новое имя столбца в результирующей таблице.

Хотите выбрать только конкретные строки — укажите после слова where условие выборки таких строк.

Источники выбрали, условие прописали, что ещё можно?

Реализовано применение конструкции group by, позволяющей в результирующем наборе группировать строки, имеющие одинаковое значение по одному или нескольким столбцам. А если в комплекте указать having, то это позволит получить только нужные группы строк.

Например:
select CITY, count(*) as COUNT from PHONE group by CITY having count(*) >= 5;

Для упорядочения записей в результирующем наборе достаточно указать конструкцию order by:
– asc — полученные значения будут упорядочены по возрастанию;
– desc — полученные значения будут упорядочены по убыванию.

Также для оператора select в SoQoL реализована возможность ограничения числа строк выборки:
– конструкция fetch first позволяет получить заданное число первых строк из результирующего набора;
– конструкция limit с дополнением offset позволяет получить заданное число первых строк из результирующего набора с указанием числа строк, которые необходимо пропустить перед возвращением строк результата.

Ну и на десерт…

А что делать, если в момент вашего обращения к таблице кто-то изменяет в ней данные? Когда и какие результаты вы получите?

Это управляется конструкцией for update в запросе select с указанием принципа поведения относительно уже заблокированных параллельной транзакцией строк:
– for update nowait — не ждать разблокировки и собрать то, что получится (до встречи с первой заблокированной строкой;
– for update skip locked — не ждать разблокировки и собрать результат исходя из всех «свободных» строк;
– for update — «ждать до последнего», до разблокировки и получить полную выборку, с учётом всех обновлённых строк.

Вы используете весь функционал select или чаще формируете простые запросы?

Обсудить можно в нашей группе в телеграм — https://t.me/soqol_dbms/92