Оператор выбора SELECT
Язык запросов (Data Query Language) в SQL состоит из единственного оператора SELECT. Этот единственный оператор поиска реализует все операции реляционной алгебры. Как просто, всего один оператор. Однако писать запросы на языке SQL (грамотные запросы) сначала совсем не просто. Надо учиться, так же как надо учиться решать математические задачки или составлять алгоритмы для решения непростых комбинаторных задач. Один и тот же запрос может быть реализован несколькими способами, и, будучи все правильными, они, тем не менее, могут существенно отличаться по времени исполнения, и это особенно важно для больших баз данных.
Синтаксис оператора SELECT имеет следующий вид:
Здесь ключевое слово ALL означает, что в результирующий набор строк включаются все строки, удовлетворяющие условиям запроса. Значит, в результирующий набор могут попасть одинаковые строки. И это нарушение принципов теории отношений (в отличие от реляционной алгебры, где по умолчанию предполагается отсутствие дубликатов в каждом результирующем отношении). Ключевое слово DISTINCT означает, что в результирующий набор включаются только различные строки, то есть дубликаты строк результата не включаются в набор.
Символ *. (звездочка) означает, что в результирующий набор включаются все столбцы из исходных таблиц запроса.
В разделе FROM задается перечень исходных отношений (таблиц) запроса.
74
В разделе WHERE задаются условия отбора строк результата или условия соединения кортежей исходных таблиц, подобно операции условного соединения в реляционной алгебре.
В разделе GROUP BY задается список полей группировки.
В разделе HAVING задаются предикаты-условия, накладываемые на каждую группу.
В части ORDER BY задается список полей упорядочения результата, то есть список полей, который определяет порядок сортировки в результирующем отношении. Например, если первым полем списка будет указана Фамилия, а вторым Номер группы, то в результирующем отношении сначала будут собраны в алфавитном порядке студенты, и если найдутся однофамильцы, то они будут расположены в порядке возрастания номеров групп.
В выражении условий раздела WHERE могут быть использованы следующие предикаты:
По стандарту в шаблон могут быть включены специальные символы:
15 NULL и IS NOT NULL
75
Если в данном кортеже ( в данной строке) указанный атрибут имеет неопределенное значение, то предикат IS NULL принимает значение "Истина" (TRUE), а предикат IS NOT NULL - "Ложь" (FALSE), в противном случае предикат IS NULL принимает значение "Ложь", а предикат IS NOT NULL принимает значение "Истина".
Введение Null-значений вызвало необходимость модификации классической двузначной логики и превращения ее в трехзначную. Все логические операции, производимые с неопределенными значениями, подчиняются этой логике в соответствии с заданной таблицей истинности:
А | В | Not A | А ? В | A ? B |
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 |
В условиях поиска могут быть использованы все рассмотренные ранее предикаты.
Отложив на время знакомство с группировкой, рассмотрим детально первые три строки оператора SELECT:
76
Все последующие разделы оператора SELECT являются необязательными.
Самый простой запрос SELECT без необязательных частей соответствует просто декартову произведению. Например, выражение
соответствует декартову произведению таблиц R1 и R2.
Выражение
соответствует проекции декартова произведения двух таблиц на два столбца А из таблицы R1 и В из таблицы R2, при этом дубликаты всех строк сохранены, в отличие от операции проектирования в реляционной алгебре, где при проектировании по умолчанию все дубликаты кортежей уничтожаются.
Рассмотрим базу данных, которая моделирует сдачу сессии в некотором учебном заведении. Пусть она состоит из трех отношений R1, R2, R3. Будем считать, что они представлены таблицами Rl, R2 и R3 соответственно.
R1 | ||
ФИО | Дисциплина | Оценка |
Петров Ф. И. | Базы данных | 5 |
Сидоров К. А. | Базы данных | 4 |
Миронов А. В. | Базы данных | 2 |
Степанова К. Е. | Базы данных | 2 |
Крылова Т. С. | Базы данных | 5 |
Сидоров К. А. | Теория информации | 4 |
Степанова К. Е. | Теория информации | 2 |
Крылова Т. С. | Теория информации | 5 |
77
R1 | ||
ФИО | Дисциплина | Оценка |
Миронов А. В. | Теория информации | Null |
Владимиров В. А. | Базы данных | 5 |
Трофимов П. А. | Сети и телекоммуникации | 4 |
Иванова Е. А. | Сети и телекоммуникации | 5 |
Уткина Н. В. | Сети и телекоммуникации | 5 |
Владимиров В. А. | Английский язык | 4 |
Трофимов П. А. | Английский язык | 5 |
Иванова Е. А. | Английский язык | 3 |
Петров Ф. И. | Английский язык | 5 |
R2 | |
ФИО | Группа |
Петров Ф. И. | 4906 |
Сидоров К. А. | 4906 |
Миронов А. В. | 4906 |
Крылова Т. С. | 4906 |
Владимиров В. А. | 4906 |
Трофимов П. А. | 4807 |
Иванова Е. А. | 4807 |
Уткина Н. В. | 4807 |
R3 | |
Группа | Дисциплина |
4906 | Базы данных |
4906 | Теория информации |
4906 | Английский язык |
4807 | Английский язык |
4807 | Сети и телекоммуникации |
Вывести список всех групп (без повторений), где должны пройти экзамены.
78
Результат:
Группа |
4906 |
4807 |
Результат:
ФИО |
Петров Ф. И. |
Крылова Т. С. |
Здесь часть WHERE задает условия соединения отношений R2 и R3, при отсутствии условий соединения в части WHERE результат будет эквивалентен расширенному декартову произведению, и в этом случае каждому студенту были бы приписаны все дисциплины из отношения R3, а не те, которые должна сдавать его группа.
Результат:
ФИО | Дисциплина |
Петров Ф. И. | Базы данных |
Сидоров К. А. | Базы данных |
Миронов А. В. | Базы данных |
Степанова К. Е. | Базы данных |
Крылова Т. С. | Базы данных |
Владимиров В. А. | Базы данных |
Петров Ф. И. | Теория информации |
Сидоров К. А. | Теория информации |
Миронов А. В. | Теория информации |
Степанова К. Е. | Теория информации |
79
ФИО | Дисциплина |
Крылова Т. С. | Теория информации |
Владимиров В. А. | Теория информации |
Петров Ф. И. | Английский язык |
Сидоров К. А. | Английский язык |
Миронов А. В. | Английский язык |
Степанова К. Е. | Английский язык |
Крылова Т. С. | Английский язык |
Владимиров В. А. | Английский язык |
Трофимов П. А. | Сети и телекоммуникации |
Иванова Е. А. | Сети и телекоммуникации |
Уткина Н. В. | Сети и телекоммуникации |
Трофимов П. А. | Английский язык |
Иванова Е. А. | Английский язык |
Уткина Н. В. | Английский язык |
Здесь мы использовали псевдонимы для именования отношения R1 а и b, так как для записи условий поиска нам необходимо работать сразу с двумя экземплярами данного отношения.
Результат:
ФИО |
Степанова К. Е. |
80
Наличие неопределенных (Null) значений повышает гибкость обработки информации, хранящейся в БД. В наших примерах мы можем предположить ситуацию, когда студент пришел на экзамен, но не сдавал его по некоторой причине, в этом случае оценка по некоторой дисциплине для данного студента имеет неопределенное значение. В данной ситуации можно поставить вопрос: "Найти студентов, пришедших на экзамен, но не сдававших его с указанием названия дисциплины".Оператор SELECT будет выглядеть следующим образом:
Результат:
ФИО | Дисциплина |
Миронов А. В. | Теория информации |