Главная » Программирование » Основы SQL. Оператор SELECT. Подзапросы
Русфонд

Основы SQL. Оператор SELECT. Подзапросы

7 июня 2012 - Рубрики Программирование

3030 просмотров

В сайдбар справа добавлена кнопка Google+. Если вам поможет данный материал, прошу вас нажмите на кнопку - порекомендуйте сайт в Google.

Здравствуй, уважаемый читатель!

Продолжаем изучение языка SQL. Тема сегодняшней статьи — использование подзапросов (коррелированных подзапросов) в операторе SELECT.

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

Синтаксис примерно следующий

SELECT <ПОЛЕ1>, <ПОЛЕ2>,
(SELECT <ПОЛЕ> FROM <ТАБЛИЦА2> <ПСЕВДОНИМ2> WHERE  <ПСЕВДОНИМ2>.<ПОЛЕ>= <ПСЕВДОНИМ1>.<ПОЛЕ>) AS <ПОЛЕ3>
FROM <ПСЕВДОНИМ1>

То есть выборка из второй таблицы осуществляется на основе условия WHERE. Обычно тут указывают первичный и внешний ключи для однозначной идентификации полей, но возможны и различные варианты.

Теперь рассмотрим конкретные примеры, чтобы лучше понять механизм подзапросов. Помимо таблицы employees заведем еще одну таблицу departments,

а также в таблицу employees добавим колонку dept_id, которая будет содержать номер отдела, в котором работает сотрудник

1) Вывести имя сотрудника и название отдела, в котором он работает

select	name,
        (select	dept_name from departments d
	 where	d.id=e.dept_id) as dept_name
from employees e

Еще раз обращаю ваше внимание на условие, указанное после where. Именно по нему идет поиск имени отдела в таблице departments. Буквы d и e называются алиасами таблиц, было бы то же самое если бы вместо этих символов вы написали названия соответствующих таблиц. С помощью алиасов работать гораздо удобнее и быстрее.

2) Посчитать количество сотрудников в каждом отделе

select dept_name,
(select count(*) from employees e where e.dept_id=d.id)
from departments d

Как видим в подзапросах можно использовать и агрегатные функции. Также можно посчитать, например, средний возраст сотрудников в отделе, немного видоизменив запрос.

Эту же задачу можно было бы решить  без использования подзапросов с помощью конструкции GROUP BY, но мы пока не работали с ней. О ней в одной из ближайших статей.

Подзапросы можно также использовать в условии, а также и в можно сделать выборку из запроса.

3) Найти сотрудников, которые относятся к отделу Склад

select name
from employees
where dept_id = (select id from departments where dept_name like '%Склад%')

Если бы было несколько отделов, например, склад1, склад2 …. и необходимо было бы узнать сотрудников из всех этих отделов, то просто нужно было бы заменить знак «=» на IN

select name
from employees
where dept_id in (select id from departments where dept_name like '%Склад%')

А теперь небольшие рекомендации по написанию запросов с использованием подзапросов. Написание происходит так как написано в задаче, то есть вы перечисляете сначала список полей, потом доходите до того поля, которого нет в вашей таблице, открываете скобки и пишете подзапрос на извлечение данного значения. И так далее. И уже в конце пишете название первичной таблицы. Данный метод написания запроса отличается от написания запросов с использованием join-ов. Там изначально ставится «*» в select и первым делом соединяют таблицы с помощью join (inner, left, right, full, cross). И уже после установки связи перечисляют выводимые поля.

Использование подзапросов имеет преимущества и недостатки:

+) легко составить запрос
+) труднее допустить ошибку
-) код громоздкий
-) невозможно использовать псевдонимы полей в GROUP BY, придется копировать весь подзапрос

Если этот материал оказался вам полезен, порекомендуйте его в в Google, нажав кнопку Google+ справа в сайдбаре или через кнопки социальных сервисов ниже.

П.С. не забудьте оставить комментарий к статье, а также поделиться ссылкой с друзьями и коллегами через социальные сервисы или скопировав ссылку на статью ниже. Кроме того, вы можете предложить тему статьи через кнопку слева "Предложить тему статьи". Там же можно оставить пожелания, идеи по развитию сайта, а также благодарности (ну а вдруг)
П.П.С. предлагаю вам также вступить в Группа Вконтакте!группу Вконтакте, где вы сможете пообщаться с участниками на интересующие вас темы. Смелее!!!
Если вы больше времени проводите в Twitter, то за обновлениями на сайте можно следить, подписавшись на мою лентуTwitter: follow me!

Возможно вам также будут интересны статьи :

 

Предыдущие материалы из данной категории:

Комментариев: 0 , , , , , ,

Понравилась статья? Поделитесь ссылкой




Оставьте комментарий:




:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)

Я человек, а не бот.