Вопрос № 18 Язык SQL. Оператор Select. Подзапросы.
Оператор select реализует любые запросы на базе одной или нескольких таблиц. Один оператор select реализует все операции реляционной алгебры. Общий вид оператора:
select [all/distinct] * /
from
[where ]
[group by
[hewing ]]
[order by ]
Оператор select возвращает в качестве результата отношение. Однако это отношение не удовлетворяет ограничениям реляционной модели т.к. оно может содержать одинаковые строки. Кроме того, результатом может быть и пустое отношение, а также значения вычисляемые.
Фраза all означает, что в результирующем отношении включены все строки и в том числе строки – дубликаты. Если не указать ни all ни distinct будет all.
distinct – строки – дубликаты из результирующего отношения вычеркиваются.
* - в результирующее отношение войдут все столбцы исходных таблиц.
Если задан список, в результирующее отношение войдут только те столбцы, которые перечислены в списке. Список столбцов может создавать столбец вычисляемый т.е. не существующий в исходных таблицах. После выражения определяющего способ получения такого столбца можно задать его имя as From из каких таблиц осуществляется извлечение данных. В списке таблицы перечисляются через запятую.
where для однотабличных запросов реализует операцию выборки, т.е. в результирующее отношение включаются только те строки, которые удовлетворяют заданному условию. В запросах на базе нескольких таблиц все исходные таблицы сначала соединяются в единую таблицу и во фразе where указываются условия соединения, как правило, естественное соединение.
group by создает группы строк с одинаковыми значениями в заданных столбцах. По этим группам можно получить некоторые итоги.
having осуществляет отбор групп в соответствии с заданными условиями.
order by обеспечивает упорядочение трок результирующего отношения по значениям заданных столбцов.
Оператор SELECT может содержать 1 и > SELECT’ов:
1) Скалярный - такой подзапрос в кач-ве результата возвращает одно значение
2) Строковый - возвращает в качестве результата несколько значений в виде одной строки
3) Табличный - возвращает таблицу в кач-ве резултата
Подзапрос может содержать фразы WHERE, HAVING и текст подзапроса ставится в скобки
Пример (скалярный):
Вывести даты на которые закл. договора с наиб. Суммой
SELECT DISTINCT date FROM dogovor WHERE sum = (SELECT MAX(sum) FROM dogovor)
Сначала вып. Подзапрос.
Пример (строковый):
Вывести договора, заключенные клиентами, проживающими в Оренбурге
SELECT * FROM dogovor WHERE cod_kl IN (SELECT code FROM client WHERE address LIKE ‘%Оренбург%’)
Часто встречаются запросы в которых имеет значение только один факт пуст или не пуст рез-т подзапроса.
EXIST - предикат (true, false)
true - когда рез-т подзапроса не пуст.
false - пуст рез-т подзапроса
С NOT EXIST тоже самое что с EXIST НО наоборот
Пример: Вывести агентов, которые в апреле 2012 не заключили ни одного договора
SELECT a.fio FROM agent a WHERE not exist(SELECT * FROM dogovor d WHERE d.cod_agent=a.tab_n AND date BETWEEN ’01.04.2012’ AND ‘30.04.2012’’)
Фразы ANY(SOME) и ALL в подзапросах:
Эти фразы используются для подзапросов, возвращающие несколько значений использ. совместно с условиями фильтрации GROUP. В случае ANY усл. считается выполненным если оно выполняется хотябы для одного значения, возвращенного подзапросом.
Эти фразы в частности используются для определения наиб. значений по группам
Пример: Вывести коды агентов которые в общей сложности закл. договоров на наиб. сумму
SELECT cod_agent FROM dogovor GROUP by cod_agent HAVING SUM(summa) >= ALL(SELECT SUM(summa) FROM dogovor GROUP by cod_agent).
Оператор select реализует любые запросы на базе одной или нескольких таблиц. Один оператор select реализует все операции реляционной алгебры. Общий вид оператора:
select [all/distinct] * /
from
[where ]
[group by
[hewing ]]
[order by ]
Оператор select возвращает в качестве результата отношение. Однако это отношение не удовлетворяет ограничениям реляционной модели т.к. оно может содержать одинаковые строки. Кроме того, результатом может быть и пустое отношение, а также значения вычисляемые.
Фраза all означает, что в результирующем отношении включены все строки и в том числе строки – дубликаты. Если не указать ни all ни distinct будет all.
distinct – строки – дубликаты из результирующего отношения вычеркиваются.
* - в результирующее отношение войдут все столбцы исходных таблиц.
Если задан список, в результирующее отношение войдут только те столбцы, которые перечислены в списке. Список столбцов может создавать столбец вычисляемый т.е. не существующий в исходных таблицах. После выражения определяющего способ получения такого столбца можно задать его имя as From из каких таблиц осуществляется извлечение данных. В списке таблицы перечисляются через запятую.
where для однотабличных запросов реализует операцию выборки, т.е. в результирующее отношение включаются только те строки, которые удовлетворяют заданному условию. В запросах на базе нескольких таблиц все исходные таблицы сначала соединяются в единую таблицу и во фразе where указываются условия соединения, как правило, естественное соединение.
group by создает группы строк с одинаковыми значениями в заданных столбцах. По этим группам можно получить некоторые итоги.
having осуществляет отбор групп в соответствии с заданными условиями.
order by обеспечивает упорядочение трок результирующего отношения по значениям заданных столбцов.
Оператор SELECT может содержать 1 и > SELECT’ов:
1) Скалярный - такой подзапрос в кач-ве результата возвращает одно значение
2) Строковый - возвращает в качестве результата несколько значений в виде одной строки
3) Табличный - возвращает таблицу в кач-ве резултата
Подзапрос может содержать фразы WHERE, HAVING и текст подзапроса ставится в скобки
Пример (скалярный):
Вывести даты на которые закл. договора с наиб. Суммой
SELECT DISTINCT date FROM dogovor WHERE sum = (SELECT MAX(sum) FROM dogovor)
Сначала вып. Подзапрос.
Пример (строковый):
Вывести договора, заключенные клиентами, проживающими в Оренбурге
SELECT * FROM dogovor WHERE cod_kl IN (SELECT code FROM client WHERE address LIKE ‘%Оренбург%’)
Часто встречаются запросы в которых имеет значение только один факт пуст или не пуст рез-т подзапроса.
EXIST - предикат (true, false)
true - когда рез-т подзапроса не пуст.
false - пуст рез-т подзапроса
С NOT EXIST тоже самое что с EXIST НО наоборот
Пример: Вывести агентов, которые в апреле 2012 не заключили ни одного договора
SELECT a.fio FROM agent a WHERE not exist(SELECT * FROM dogovor d WHERE d.cod_agent=a.tab_n AND date BETWEEN ’01.04.2012’ AND ‘30.04.2012’’)
Фразы ANY(SOME) и ALL в подзапросах:
Эти фразы используются для подзапросов, возвращающие несколько значений использ. совместно с условиями фильтрации GROUP. В случае ANY усл. считается выполненным если оно выполняется хотябы для одного значения, возвращенного подзапросом.
Эти фразы в частности используются для определения наиб. значений по группам
Пример: Вывести коды агентов которые в общей сложности закл. договоров на наиб. сумму
SELECT cod_agent FROM dogovor GROUP by cod_agent HAVING SUM(summa) >= ALL(SELECT SUM(summa) FROM dogovor GROUP by cod_agent).