Использование подзапросов в SQL

Продолжаем изучать 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. Пока. Удачи!

Понравилась статья? Поделиться с друзьями:
Заметки IT специалиста
Комментариев: 2
  1. Аватар
    Илья

    Пробую в 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».

  2. Аватар
    Илья

    Всё. Решение найдено.
    «Подзапросы разрешены и в конструкции FROM оператора SELECT. Их синтаксис вы­глядит следующим образом:
    SELECT … FROM {подзапрос) AS имя …»

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
Нажимая на кнопку «Отправить комментарий», я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.