Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Создание подзапросов





Подзапрос — это запрос внутри другого запроса, т.е. запрос, в котором исполь­зуются результаты другого запроса. Иногда подзапросы называют вложенными за­просами или подвыборками.

Подзапросы производных таблиц

Подзапросы производных таблиц дают возможность указать запрос в выра­жении FROM другого запроса. По сути это позволяет создать временную таблицу и добавить ее в запрос. Например, рассмотрим следующий простой запрос:

select employeelD, name from employee where job='Программист';

Должно быть очевидным, что этот запрос возвратит имена и кодовые номера всех программистов. Можно использовать этот запрос в рамках другого, чтобы получить дополнительную информацию:

select programmer.name

from (select employeeID, name from employee where job='Программист')

as programmer,

assignment

where programmer.employeelD = assignment.employeelD;

В данном случае мы используем подзапрос (select employeelD, name from employee where job='Программист') для создания производной таблицы, содержащей только employeelD и name, которой мы назначаем псев­доним programmer. После этого к созданной таблице можно обратиться с за­просом, как к любой другой. В данном случае мы используем эту таблицу для того, чтобы выяснить, кто из программистов работал над выполнением внешних заданий и получаем следующий результат

Подзапросы с одним значением

Как и в предыдущем разделе, мы начинаем с простого запроса

select max(hours) from assignment;

Он возвращает одно значение, представляющее собой максимальное время (в часах), которое работник потратил на выполнение задания. Здесь используется функция MySQL, которую мы не еще упоминали, — функция

max (),

возвраща­ющая максимальное значение соответствующего столбца. Ис­пользование результатов, возвращенных такими функциями, является типичным примером применения подзапросов с одним значением.

Подзапросы с одним значением возвращают одно значение столбца и обычно используются для сравнения. Рассмотрим, например, следующий запрос:

select e.employeeID, e.name

from employee e, assignment a

where е. employeeID = a. employeeID

and a.hours = (select max(hours) from assignment);

Здесь мы пытаемся найти того, кого можно назвать "ломовой лошадью" ком­пании: кто из служащих потратил больше всех времени на выполнение задания? Вот результат выполнения такого запроса:

Подзапросы в логических выражениях

Подзапросы в логических выражениях используются для проверки истинно­сти результата некоторых специальных функций, возвращающих значения типа BOOLEAN. Такими специальными функциями являются IN, EXISTS, а также ALL, ANY и SOME.

Ключевое слово IN используется для проверки принадлежности к некоторому множеству значений. Рассмотрим следующий запрос:

select name

from employee

where employeelD not in

(select employeeID

from assignment);

Этот запрос даст тот же результат, что и запрос, рассмотренный выше в при­мере применения LEFT JOIN. Он позволяет найти служащих, которые не имели внешних заданий. Ключевое слово IN позволяет провести поиск в некотором мно­жестве значений. Здесь мы получим то же, что и от вышеприведенного запроса с LEFT JOIN:


Достаточно интересным является следующая возможность использования клю­чевого слова IN для проверки принадлежности к определенному набору значений:

select name

from employee

where employeeID not in (6651, 1234);

Ключевое слово EXISTS работает лишь немного по-другому по сравнению со словом IN. При использовании EXISTS мы на самом деле используем в подзапро­се данные некоторого внешнего запроса. Такой запрос иногда называют связанным подзапросом.

Рассмотрим следующий пример:

select e.name, e.employeeID

from employee e

where not exists

(select *

from assignment

where employeelD = e.employeelD);

Здесь нам нужно получить список служащих, которые никогда не работали над внешними заданиями.

В подзапросе мы ищем строки таблицы assignment, в которых значение employeeID совпадает со значением employee.employeeID. Значение е.employeelD получено от внешнего запроса. На самом деле MySQL здесь делает следующее. Для каждой строки из таблицы employee проверяются ре­зультаты подзапроса, и в случае отсутствия соответствия (WHERE NOT EXISTS) информация о служащем добавляется в результирующее множество.

Некоторые пользователи находят такой синтаксис более простым для пони­мания, но тот же результат можно получить и при помощи LEFT JOIN, как это было сделано выше. Использование LEFT JOIN, кроме того, будет более эф­фективным, и, таким образом, соответствующий запрос будет выполнен быстрее. Запрос предоставит точно такой же результат

 

Ключевые слова ALL, ANY и SOME используются для сравнения с набором значений, возвращенных подзапросом.

Предположим, что Нора Эдварде, которая, если вы помните, является наибо­лее загруженным программистом, поставит задачу доказать, что никто не работает больше программистов. Чтобы установить этот факт, она создаст следующий за­прос:

select e.name

from employee e, assignment a

where e.employeeID = a.employeeID and a.hours > all

(select a.hours

from assignment a, employee e

where e.employeeID = a.employeeID

and e.job='Программист');

Здесь подзапрос возвращает список значений времени (количество часов), ко­торое было затрачено на выполнение заданий программистами в компании. Затем запрос ищет сотрудников, которые работали над заданиями больше, чем эти про­граммисты, используя для этого а. hours > ALL (время программистов).

Для вас не будет сюрпризом, что этот запрос не вернет ни одной строки, доказывая тот факт, что в данной компании никто не работает так тяжело, как программисты.

 

 

Date: 2016-07-25; view: 366; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.008 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию