Формирование запросов средствами языка SQL
Формирование запросов средствами языка SQL
Оператор SELECT
Оператор SELECT позволяет формировать запрос к базе данных. В результате выполнения этого оператора СУБД формирует результирующий набор (иногда также называемый набором данных). Если этот оператор был введен в интерактивном режиме взаимодействия с базой данных, то результат отображается в виде таблицы в текущем диалоговом окне. На рис. 3.1 приведен пример выполнения оператора SELECT , извлекающего данные всех столбцов из таблицы dept.
Если оператор SELECT выполняется из приложения на другом языке программирования, то формируется результирующий набор, размещаемый в памяти приложения или сервера БД, а затем приложение извлекает данные из результирующего набора в свои переменные.
Оператор SELECT имеет в стандарте SQL92 следующее формальное описание:
SELECT [DISTINCT] { {function_agregate | expr [AS new_field_name] } .,: | specification.* | * [INTO list_variable] FROM {{ имя_таблицы [AS] [table_alias] [(field .,:)]} | {subquery [AS] subquery_alas [(field .,:)]} | union_table | constructor_of_table_value | {TABLE имя_таблицы [AS] alias [(field .,:)]} } .,: [WHERE condition] [GROUP BY {{ имя_таблицы | alias }.field} .,: {COLLATE name}] [HAVING condition] [{ UNION | INTERSECT | EXCEPT } [ALL] [CORRESPONDING [BY (field.,:)]] SELECT_operator | {TABLE имя_таблицы} | constructor_of_table_value [ORDER BY] {{field_result [ASC|DESC]}.,:} |{{ integer [ASC|DESC]}.,:} ;Листинг 3.1. Формальное описание оператора SELECT
Для выполнения запроса требуется привилегия SELECT на все таблицы, участвующие в запросе.
После фразы SELECT указывается список выражений, определяющий значения, формируемые запросом. В самом простом случае список выражений является списком полей таблицы. Если требуется извлечение значений всех полей, то вместо списка полей можно указать символ *. Например:
SELECT * FROM tbl1;
Имя поля может быть квалифицировано именем таблицы, указываемым через точку. Например:
SELECT tbl1.f1, tbl2.f1 FROM tbl1, tbl2;
- Фраза FROM определяет одну или несколько таблиц или подзапросов, используемых для извлечения данных.
- Фраза INTO используется только во встроенном SQL, указывая переменные, в которые записывается результат запроса. При этом формируемый результирующий набор может содержать только одну строку.
- Фраза WHERE определяет условие, которому должны удовлетворять все строки, используемые для формирования результирующего набора.
Во всех операциях сравнения языка SQL применяется трехзначная логика ( 3VL ). Предикат, указываемый фразой WHERE, может принимать одно из следующих значений: TRUE, FALSE или UNKNOWN. Значение UNKNOWN получается при сравнении значения NULL с любым другим значением, включая значение NULL.
Предикат содержит одно или несколько выражений, выполняющих сравнения. В выражениях могут участвовать имена столбцов, функции агрегирования, переменные встроенного SQL, параметры модульного SQL.
Кроме стандартных операторов сравнения, таких как =, <>, >, <, >=, <= могут быть использованы следующие операторы:
-
BETWEEN - возвращает TRUE, если значение находится в указанном диапазоне. Например:
x BETWEEN y AND z
(x<=z) AND (x>=y).
-
IN - совпадает с одним из перечисленных в списке. Например:
x IN (a,b,c).
-
LIKE - возвращает TRUE для значений, совпадающих с указанной подстрокой символов. Например:
x LIKE 'abc'.
-
IS NULL - возвращает TRUE, если значение равно NULL. Этот предикат возвращает только значение TRUE или FALSE. Например:
x IS NULL.
-
EXISTS - предикат существования, возвращающий значение TRUE, если указанный в нем подзапрос содержит хотя бы одну строку.Например:
SELECT * FROM tbl1 t_out WHERE EXISTS (SELECT * FROM tbl1 t_in WHERE t_in.f1= t_out.f1).
- UNIQUE - предикат уникальности, возвращающий значение TRUE, если указанный в нем подзапрос не содержит одинаковых строк.
- MATCH - предикат совпадения, возвращающий значение TRUE, если при частичном совпадении (указана фраза PARTIAL ) все значения сравниваемой строки равны NULL или существует хотя бы одна строка подзапроса, совпадающая с сравниваемой строкой.
- OVERLAPS - предикат перекрытия, возвращающий значение TRUE, если сравниваемый период времени перекрывает другие указанные периоды. Тип сравниваемых данных может быть DATETIME или INTERVAL (допустим только для второго значения).
- SOME, ANY или ALL - предикаты количественного сравнения, для которых существуют следующие правила:
Для примера обозначим строку запроса заключенной в скобки, а строки подзапроса - разделенными пробелом. Так, следующий предикат вернет значение TRUE:
(10, 1)> ANY (12, 2 0, NULL 5, 20),
так как первая строка из подзапроса удовлетворяет условию. А предикат
(NULL, NULL) = ANY (12, 2 NULL, NULL 5, 20)
вернет значение UNKNOWN, так как сравнение NULL c NULL в результате дает UNKNOWN. Предикат
(10, 1)> ALL (12, 0 0, NULL 5, 20)
вернет значение FALSE, так как сравнение строки (10,1) с каждой строкой подзапроса возвращает значение FALSE.