Продолжаем изучать SQL, и сегодня мы будем говорить о достаточно полезной вещи в SQL это «Подзапрос». Рассмотрим что такое подзапрос и, конечно же, как обычно напишем несколько примеров, для того чтобы лучше понять, как писать эти подзапросы и в каких случаях их лучше использовать.
Как я уже сказал, о SQL мы разговариваем достаточно часто, так как это знание и умение использовать SQL требуется практически везде, будь то база данных сайта в Интернете или баз данных в организациях. Причем, даже совсем в небольших организациях, где всего один программист или системный администратор, но при этом имеется какая-нибудь база данных и для того, что ее администрировать, выгружать какие-то данные, для отчета, необходимы начальные знания SQL. Основы SQL мы рассматривали во многих статьях таких как «Язык запросов SQL – Оператор SELECT» или как «добавить колонку в таблицу на SQL». Но, так или иначе, тему подзапросов мы не затрагивали, и пришло время поговорить об этом.
И начнем мы как всегда с теории.
Что такое подзапрос?
Подзапрос – это отдельный запрос внутри другого запроса, который может объединяться с основным, но не обязательно.
Использовать подзапросы бывает достаточно удобно в некоторых случаях, но помните, что злоупотреблять ими не нужно. Так как это значительно усложняет план запроса и соответственно замедляет его работу.
О том, что еще влияет на скорость выполнения запросов, и чего лучше не надо делать можете посмотреть полезные советы по написанию SQL запросов.
Для наглядности я попытался изобразить подзапрос схематично:
В каких случаях использовать подзапрос?
Как я уже сказал писать вложенные запросы направо и налево не стоит, но иногда можно.
Например, когда выборка идет из одной таблице, которая имеет определенный ключ, а Вам необходимо получить одну колонку с максимальным значением из другой таблицу по этому ключу, при этом, не объединяя эти таблицы (в данном случае подзапрос пишется в конструкции select). Или, например, Вам необходимо обращаться к данным, которые расположены во многих таблицах, при том, что данные, из этих таблиц будут браться путем каких-то вычислений и уже к этим данным Вам необходимо обращаться, это можно сделать путем написания запроса в конструкции from, без написания дополнительных VIEW представлений, допустим, что Вам этот запрос потребуется только один раз, и чтобы не засорять базу, Вы не будете создавать представление.
Где можно использовать подзапрос?
Подзапрос можно использовать практически во всех конструкциях, давайте разберем самые часто используемые.
1. В конструкции Select. Пример:
select t1.col1, t1.col2, (select max(t2.col3) from table2 as t2 where t2.col1=t1.col1) as col3 from table1 as t1
2. В конструкции From. Пример:
SELECT col1, col2, col3 FROM (SELECT t1.col1 AS col1, t2.col2 AS col2, t1.col1+t2.col2 AS col3 FROM table1 as t1 LEFT JOIN table2 as t2 ON t1.col3=t2.col3 WHERE t1.col1 >1000) AS Q1
3.В конструкции WHERE. Пример:
select col1, col2, col3 from table1 where col1 = (select avg(col1) from table2)
4. При объединении. Другими словами можно осуществить объединение таблицы с подзапросом. Пример:
select t1.col1, t1.col2, t1.col3, q1.col1, q1.col2, q1.col3 from table1 as t1 left join (select col1, col2, col3 from table2) as q1 on t1.col1=q1.col1
Вот такие простенькие примеры, но это не все где можно использовать подзапрос, просто это наиболее распространенные варианты использования таких запросов. Надеюсь, стало немного понятно, и на последок давайте приведем пример многоуровневого запроса, просто так, он не из жизни, но так тоже можно писать. Пример:
select col1, col2, col3, col4, col5, col6 from (select t1.col1 as col1, t1.col2 as col2, t1.col3 as col3, q1.col1 as col4, q1.col2 as col5, q1.col3 as col6 from table1 as t1 left join (select col1, col2, (select avg(col1) from table3) as col3 from table2) as q1 on t1.col1=q1.col1 where t1.col1 >1000)
В данном запросе, мы обращаемся к подзапросу, в котором в свою очередь идет объединение с вложенным запросом, а в котором используется подзапрос в конструкции select.
Вот такие примеры, они не являются примером выхода из каких-то ситуаций, на практике они могут, и не понадобится, но для общего синтаксиса я их привел. На сегодня все, в дальнейшем будем осваивать новые тонкости SQL. Пока. Удачи!
Заметка! Для комплексного изучения языка SQL и T-SQL рекомендую посмотреть мои видеокурсы по T-SQL, которые помогут Вам «с нуля» научиться работать с SQL и программировать на T-SQL в Microsoft SQL Server.
Пробую в SQL Server 10.50.2500
и пункт 2 (подзапрос в конструкции From) не отрабатывает.
Пример того что после from отрабатывает корректно:
select
t1.ID as col1,
t1.Logist2 as col2,
t1.IDMain as col3,
t2.UserName as col4
from
tblZaiavka as t1
left join
tblUsers as t2
on t1.Logist2 = t2.UserName
where
t1.ID > 11670
Но если добавить:
select col1, col2, col3
from (здесь select что в примере выше)
то возникает ошибка:
Неправильный синтаксис около ключевого слова «from».
Всё. Решение найдено.
«Подзапросы разрешены и в конструкции FROM оператора SELECT. Их синтаксис выглядит следующим образом:
SELECT … FROM {подзапрос) AS имя …»