Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 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 (время программистов). Для вас не будет сюрпризом, что этот запрос не вернет ни одной строки, доказывая тот факт, что в данной компании никто не работает так тяжело, как программисты.
|