Оператор выбора SELECT

Язык запросов (Data Query Language) в SQL состоит из единственного оператора SELECT. Этот единственный оператор поиска реализует все операции реляционной алгебры.

Синтаксис оператора SELECT имеет следующий вид:

SELECT [ALL | DISTINCT] <Список полей>|*)

FROM <Список таблиц>

[WHERE <Предикат-условие выборки или соединения>]

[GROUP BY <Список полей результата>]

[HAVING <Предикат-условие для группы>]

[ORDER BY <Список полей, по которым упорядочить вывод>]

SELECT — ключевое слово, которое обозначает, что эта команда — запрос. Все запросы начинаются этим словом с последующим пробелом. За ним может следовать способ выборки — с удалением дубликатов (DISTINCT) или без удаления (ALL, подразумевается по умолчанию). Использование ALL означает, что, в результирующий набор могут попасть одинаковые записи, а это нарушение принципов теории отношений. В реляционной алгебре предполагается отсутствие дубликатов в каждом результирующем отношении. Затем следует список перечисленных через запятую полей <Список полей>, которые выбираются запросом из таблиц, или символ * (звездочка) для выбора всех полей. Любые поля, не перечисленные здесь, не будут включены в результирующую таблицу, соответствующую выполнению команды. Это соответствует выполнению операции проекции в реляционной алгебре.

В разделе FROM задается перечень исходных таблиц запроса. FROM — ключевое слово, подобно SELECT, которое должно быть представлено в каждом запросе. Оно сопровождается пробелом и затем именами таблиц, используемых в качестве источника информации. В случае если указано более одного имени таблицы, неявно подразумевается, что над перечисленными таблицами осуществляется операция декартова произведения. Таблицам можно присвоить имена-псевдонимы, что бывает полезно для осуществления операции соединения таблицы с самой собою или для доступа из вложенного подзапроса к текущей записи внешнего запроса (вложенные подзапросы здесь не рассматриваются).

В разделе WHERE задаются условия отбора записей результата и соответствует операции селекции по условию в реляционной алгебре.

В разделе GROUP BY задается список полей группировки.

В разделе HAVING задаются предикаты-условия, накладываемые на каждую группу.

В части ORDER BY задается список полей упорядочения результата, то есть список полей, который определяет порядок сортировки в результирующем отношении. Например, если первым полем списка будет указана Фам_студ, а вторым Группа, то в результирующей таблице сначала будут собраны в алфавитном порядке студенты, и если найдутся однофамильцы, то они будут расположены в порядке возрастания номеров групп.

В выражении условий раздела WHERE могут быть использованы следующие предикаты:

· Предикаты сравнения { =, <>, >,<, >=,<= }, которые имеют традиционный смысл.

· Предикат Between A and В — принимает значения между А и В. Предикат истинен, когда сравниваемое значение попадает в заданный диапазон, включая границы диапазона. Одновременно в стандарте задан и противоположный предикат Not Between A and В, который истинен тогда, когда сравниваемое значение не попадает в заданный интервал, включая его границы.

· Предикат вхождения в множество IN (множество) истинен тогда, когда сравниваемое значение входит в множество заданных значений. При этом множество значений может быть задано простым перечислением или встроенным подзапросом. Одновременно существует противоположный предикат NOT IN (множество), который истинен тогда, когда сравниваемое значение не входит в заданное множество.

· Предикаты сравнения с образцом LIKE и NOT LIKE. Предикат LIKE требует задания шаблона, с которым сравнивается заданное значение, предикат истинен, если сравниваемое значение соответствует шаблону, и ложен в противном случае. Предикат NOT LIKE имеет противоположный смысл.

По стандарту в шаблон могут быть включены специальные символы:

­ символ вопроса (?) - для обозначения любого одиночного символа (в стандарте символ подчеркивания (_));

­ символ звездочки (*) — для обозначения любой произвольной последовательности символов (в стандарте символ процента (%));

­ остальные символы, заданные в шаблоне, обозначают самих себя.

· Предикат сравнения с неопределенным значением IS NULL. Неопределенное значение интерпретируется в реляционной модели как значение, неизвестное на данный момент времени. Это значение при появлении дополнительной информации в любой момент времени может быть заменено на некоторое конкретное значение. При сравнении неопределенных значений не действуют стандартные правила сравнения: одно неопределенное значение никогда не считается равным другому неопределенному значению. Для выявления равенства значения некоторого поля неопределенному применяют специальные стандартные предикаты:

<имя поля> IS NULL и <имя поля> IS NOT NULL.

Если в данном кортеже (в данной строке) указанный атрибут имеет неопределенное значение, то предикат IS NULL принимает значение «Истина» (TRUE), а предикат IS NOT NULL — «Ложь» (FALSE), в противном случае предикат IS NULL принимает значение «Ложь», а предикат IS NOT NULL принимает значение «Истина».

Введение Null-значений вызвало необходимость модификации классической двузначной логики и превращения ее в трехзначную. Все логические операции, производимые с неопределенными значениями, подчиняются этой логике в соответствии с таблицей истинности (табл. 3).

Таблица 3. Таблица истинности логических операций

А В Not A А and В А or В
TRUE TRUE FALSE TRUE TRUE
TRUE FALSE FALSE FALSE TRUE
TRUE Null FALSE Null TRUE
FALSE TRUE TRUE FALSE TRUE
FALSE FALSE TRUE FALSE FALSE
FALSE Null TRUE FALSE Null
Null TRUE Null Null TRUE
Null FALSE Null FALSE Null
Null Null Null Null Null

· Предикаты существования EXIST и несуществования NOT EXIST. Эти предикаты относятся к встроенным подзапросам.

В условиях поиска могут быть использованы все рассмотренные ранее предикаты.

Первые две строки оператора SELECT являются обязательными. Все последующие разделы оператора SELECT являются необязательными.

Наши рекомендации