Subqueries

Підзапити можна використовувати в клаузах SELECT, FROM, WHERE та JOIN.

  1. У WHERE краще використовувати з IN, оскільки не можна бути впевненим, що підзапит поверне один рядок. Наприклад:

    SELECT customerid,
    firstname,
    lastname
    FROM customers
    WHERE supportrepid IN
    ( SELECT employeeid FROM employees WHERE country = 'Canada' );
    
    Якщо ви впевнені, що підзапит повертає один рядок, можна використовувати = замість IN

  2. Підзапити в клаузі FROM:

    SELECT AVG(album.size)
    FROM
    ( SELECT
     SUM(bytes) AS SIZE
     FROM tracks
     GROUP BY albumid ) AS album;
    
    З таблиці tracks групуємо по albumid та обираємо суму байт кожної групи. Називаємо суму байт як SIZE, а всю вибірку іменуємо як album. Далі виконується зовнішній селект середнього значення по стовпчику album.size.

  3. Корельований підзапит. Корельований підзапит - це підзапит, який використовує значення із зовнішнього запиту. На відміну від звичайного підзапиту, корельований підзапит не може бути виконаний незалежно. Корельований підзапит є неефективним, оскільки він обчислюється для кожного рядка, обробленого зовнішнім запитом.

    SELECT albumid, title
     FROM albums
     WHERE 10000000 > ( SELECT
         sum(bytes)
         FROM tracks
         WHERE tracks.AlbumId = albums.AlbumId )
     ORDER BY title;
    
    Для кожного рядка, обробленого зовнішнім запитом, корельований підзапит обчислює розмір альбомів з треків, що належать поточному альбому, використовуючи функцію SUM.

  4. Підзапит у клаузі SELECT:

    SELECT albumid, title, (
     SELECT count(trackid) FROM tracks WHERE tracks.AlbumId = albums.AlbumId ) AS  tracks_count
     FROM albums
     ORDER BY tracks_count DESC;
    
    (це також корельований підзапит)