
Наиболее используемым, но и одним из самых сложных операторов является 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