Язык запросов DQL включает единственную команду SELECT, которая заменяет все операции реляционной алгебры. Команда извлекает данные из одной или нескольких таблиц, видов или снимков в результирующую таблицу, соответствующую запросу к БД
Упрощенный синтаксис команды SELECT
SELECT [DISTINCT | ALL] <COLUMN LIST>
FROM <TABLE _REFERENCE>
[WHERE < SEARH_CONDITION>]
[GROUP BY <GROUP_LIST>]
[HAVING <HAVINNG_CONDITION>],
[ORDER BY <ORDER_LIST> [DESC]]
[FOR UPDATE OF <COLUMN LIST> [NOWAIT] ]
Здесь SELECT – ключевое слово, которое сообщает базе данных, что команда является запросом.
Опция DISTINCT исключает дублирование строк в выборке.
Опция ALL возвращает все строки, даже если они повторяются.
< COLUMN_LIST > – список столбцов таблицы, которые должны быть представлены в результате выполнения запроса.
<COLUMN_LIST> : = { * | expr [AS alias]},
* - определяет , что будут выбраны все столбцы указанной таблицы;
ехрr – выражение выбора, определяющее столбец или несколько столбцов таблицы БД, в том числе вычисляемый столбец (например, min(salary));
AS alias – определяет псевдоним, используемый для ссылки и как заголовок столбца;
FROM – ключевое слово, за которым следует имя таблицы ,или список имен таблиц, или подзапрос, которые используют как источник информации.
<TABLE _REFERENCE>: = {table [ ALIAS]} | view | subquery},
table [ALIAS] - имя таблицы или список имен таблиц, из которых производится выборка данных. Алиас используется всегда, когда в списке присутствует несколько таблиц;
view - определяет, что будут выбраны все столбцы указанного вида (представления);
subquery - подзапрос, имеющий такой же смысл, как если бы в данном месте был указан вид. Подзапросом называется оператор SELECT, появляющийся внутри другого оператора. Подзапрос называют вложенным запросом.
WHERE - определяет условие, которое может быть либо истинным, либо ложным для каждой строки таблицы. Команда извлекает только те строки таблицы, для которых условие имеет значение «истина». Условие состоит из двух частей: условия соединения таблиц и условия фильтрации строк. Условие соединения кодируется первым. Запрос называется объединением (JOIN), если он скомбинирован из двух и более таблиц или представлений, указанных во фразе FROM. Существует множество способов соединения таблиц: эквисоединение, не -эквисоединение, самообъединение, внешнее соединение.
GROUP BY - определяет столбец или группу столбцов, на основании значений которых строки объединяются в группы. К таким группам строк могут применятся различные групповые функции (например, SUM).
HAVING - определяет условие включения групп в результат запроса.
ORDER BY - определяет порядок сортировки данных в результирующем наборе. Опция DESC (DESCENDING) задает сортировку в убывающем порядке.
FOR UPDATE - блокирует выбранные строки. Эта фраза не может совместно использоваться с фразами DISTINCT и GROUP BY, а также с функциями агрегирования.
NOWAIT - возвращает управление в том случае, если оператор SELECT пытается блокировать строки, которые уже были заблокированы другим пользователем. Если эта фраза опущена, то Oracle будет ожидать освобождения заблокированных строк и затем вернет результирующий набор, извлеченный оператором SELECT.
Рассмотрим несколько примеров реализации запросов.
В примерах используются модель данных БД «ATOS» (см. приложение 3).
Внимание! Для успешного выполнения работы, приобретения требуемых знаний и навыков необходимо детально изучить возможности команды SELECT.
Пример 1
Узнать имена всех покупателей из Москвы:
SELECT name, city
FROM Сustomer
WHERE city=’ Moscow’;
Предложение WHERE может использовать операторы сравнения ( =, <, > и др.) , булевы операторы AND, OR, NOT, кроме того, специальные операторы IN, BETWEEN, LIKE и IS NULL .
Оператор IN полностью определяет множество, которому данное значение может принадлежать или не принадлежать.
Пример 2
Найти всех покупателей, работающих либо в Санкт-Петербурге, либо в Москве:
SELECT *
FROM Сustomer
WHERE city IN (‘Moscow’, ‘Sent-Peterburg’);
Оператор BETWEEN задает границы интервала, в который должно попадать значение, чтобы условие было истинным.
Пример 3
Узнать служащих, заработная плата которых в диапазоне от 800 до 1300:
SELECT *
FROM Employee
WHERE salary BETWEEN 800 AND 1300;
Оператор BETWEEN является включающим, т.е. граничные условия (в нашем примере 800 и 1300) делают условие истинным.
LIKE применим только к символьным полям и используется для поиска подстрок. Существует два типа шаблонов, используемых с LIKE:
• символ ”подчеркивание” ( _ ) заменяет один любой символ. Например, образцу ‘b_t’ соответствуют ‘bat’ или ‘bit’, но не соответствует ‘brat’;
• символ “процент” ( % ) заменяет последовательность символов произвольной длины, в том числе и нулевой. Например, образцу ‘ % p%t’ соответ-ствуют ‘put’ , ‘posit’ , ‘opt‘, но не ’spite’.
Пример 4
Определить служащих, фамилии которых начинаются на ‘G’:
SELECT *
FROM Employee
WHERE last_name Like ‘G%’;
Пример 5
Определить покупателей, у которых в Order нет ни одного заказа:
SELECT name
FROM Customer
WHERE id NOT IN
(SELECT customer_id FROM Order);
Запросы могут обобщать не только группы значений, но и значения одного поля. Для этого применяются агрегатные функции SUM, AVG, MIN, MAX, COUNT. Они дают единственное значение для целой группы строк таблицы.
Пример 6
Найти сумму всех заказов из таблицы Order:
SELECT SUM (total) FROM Order;
ORDER BY используют для упорядочения строк в результирующем наборе.
Пример 7
Вывести покупателей в алфавитном порядке:
SELECT name
FROM customer
ORDER BY name;
GROUP BY – необязательная опция, которая группирует строки в запросе на основании значения в одной или более колонках.
Пример 8
Определить и вывести максимальную сумму покупки у каждого покупателя
SELECT customer_id, MAX(total) ” max ”
FROM Order
GROUP BY customer_id;
HAVING сообщает о необходимости включения групп в результате запроса.
< having_condition > не может содержать подзапрос.
HAVING используется с GROUP BY для указания критерия, по которому группа включается в результат запроса. Несколько условий связываются операторами AND и OR.
Пример 9
Определить и вывести общую сумму заказов для каждого покупателя, за исключением тех, которые были приняты сегодня:
SELECT customer_id, SUM(total) “sum”
FROM Order
HAVING date_ord = Sysdate
GROUP BY customer_id
ORDER BY sum(total);
|