Оператор выбора 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 являются необязательными.