Последние новости:

Поиск по сайту:

...не вы съели идею, а вас съела идея (Ф.М. Достоевский).

SQL — Подзапросы

2 мин для чтения
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
24.04.2017
SQL - подзапросы

Подзапрос или внутренний запрос или вложенный запрос является запросом в другом SQL запросе и встроенный в предложении WHERE.

Подзапрос используется для получения данных, которые будут использоваться в основном запросе в качестве условия для дальнейшего ограничения данных, которые будут извлечены.

Подзапросы можно использовать с SELECT, INSERT, UPDATE и заявлением DELETE вместе с операторами LIKE =, <, >, >=, <=, IN, BETWEEN и т.д.

Есть несколько правил, которым подзапросы должны следовать:

  • Подзапросы должны быть заключены в круглые скобки.
  • Подзапрос может иметь только один столбец в SELECT, если несколько столбцов находятся в главном запросе для подзапроса, то необходимо сравнить свои выбранные столбцы.
  • Команда ORDER BY не может быть использована в подзапросе, хотя основной запрос может использовать команды ORDER BY. Команда GROUP BY может быть использована для выполнения той же функции, что и ORDER BY в подзапросе.
  • Подзапросы, которые возвращают более одной строки могут быть использованы только с несколькими операторами значений, таких как оператор IN.
  • SELECT, список не может включать в себя любые ссылки на значения, которые относятся к BLOB, ARRAY, CLOB или NCLOB.
  • Подзапрос не может быть немедленно заключен в заданной функции.
  • Оператор BETWEEN не может быть использован с подзапросом. Тем не менее, оператор BETWEEN может быть использован в подзапросе.

Подзапросы с оператором SELECT

Подзапросы наиболее часто используется с SELECT. Базовый синтаксис выглядит следующим образом:

SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR
   (SELECT column_name [, column_name ]
   FROM table1 [, table2 ]
   [WHERE])

Пример

Рассмотрим таблицу клиентов, имеющих следующие записи:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Maxim    |  35 | Moscow    | 21000.00 |
|  2 | AndreyEx |  38 | Krasnodar | 55500.00 |
|  3 | Oleg     |  33 | Rostov    | 34000.00 |
|  4 | Masha    |  35 | Moscow    | 34000.00 |
|  5 | Ruslan   |  34 | Omsk      | 45000.00 |
|  6 | Dima     |  32 | SP        | 45000.00 |
|  7 | Roma     |  34 | SP        | 10000.00 |
+----+----------+-----+-----------+----------+

 

Теперь, давайте проверим следующий подзапрос с оператором SELECT.

SQL> SELECT * 
   FROM CUSTOMERS 
   WHERE ID IN (SELECT ID 
         FROM CUSTOMERS 
         WHERE SALARY > 44000);

 

Это произведет следующий результат:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  2 | AndreyEx |  38 | Krasnodar | 55500.00 |
|  5 | Ruslan   |  34 | Omsk      | 45000.00 |
|  6 | Dima     |  32 | SP        | 45000.00 |
+----+----------+-----+-----------+----------+

Подзапросы с заявлением INSERT

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

Базовый синтаксис выглядит следующим образом.

INSERT INTO table_name [ (column1 [, column2 ]) ]
   SELECT [ *|column1 [, column2 ]
   FROM table1 [, table2 ]
   [ WHERE VALUE OPERATOR ]

Пример

Рассмотрим таблицу CUSTOMERS_BKP с аналогичной структурой в виде таблицы клиентов. Теперь, чтобы скопировать всю таблицу CUSTOMERS в таблицу CUSTOMERS_BKP, вы можете использовать следующий синтаксис.

SQL> INSERT INTO CUSTOMERS_BKP
   SELECT * FROM CUSTOMERS 
   WHERE ID IN (SELECT ID 
   FROM CUSTOMERS) ;

Подзапросы с заявлением UPDATE

Подзапрос может быть использован в сочетании с заявлением UPDATE. Либо один или несколько столбцов в таблице, могут быть обновлены при использовании подзапросов с заявлением UPDATE.

Базовый синтаксис выглядит следующим образом.

UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]

Пример

Предполагая, что у нас есть таблица CUSTOMERS_BKP, которая является резервной копией таблицы Customers. Следующий пример обновляет SALARY на 0,25 раза в таблице клиентов для всех клиентов, возраст которых больше или равен 37.

SQL> UPDATE CUSTOMERS
   SET SALARY = SALARY * 1.2
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
      WHERE AGE >= 37 );

 

Это будет влиять на две строки и, наконец, таблица CUSTOMERS будет иметь следующие записи:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Maxim    |  35 | Moscow    | 21000.00 |
|  2 | AndreyEx |  38 | Krasnodar | 66600.00 |
|  3 | Oleg     |  33 | Rostov    | 34000.00 |
|  4 | Masha    |  35 | Moscow    | 34000.00 |
|  5 | Ruslan   |  34 | Omsk      | 45000.00 |
|  6 | Dima     |  32 | SP        | 45000.00 |
|  7 | Roma     |  34 | SP        | 10000.00 |
+----+----------+-----+-----------+----------+

Подзапросы с заявлением DELETE

Подзапрос может быть использован в сочетании с DELETE как и с любыми другими заявлениями, упомянутых выше.

Базовый синтаксис выглядит следующим образом.

DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]

Пример

Предполагая, у нас есть таблица CUSTOMERS_BKP, которая является резервной копией таблицы Customers. Следующий пример удаляет записи из таблицы CUSTOMERS для всех клиентов, чей возраст больше или равен 37.

SQL> DELETE FROM CUSTOMERS
   WHERE AGE IN (SELECT AGE FROM CUSTOMERS_BKP
      WHERE AGE >= 37 );

 

Это будет влиять на одну строку и, наконец, таблица CUSTOMERS будет иметь следующие записи:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Maxim    |  35 | Moscow    | 21000.00 |
|  3 | Oleg     |  33 | Rostov    | 34000.00 |
|  4 | Masha    |  35 | Moscow    | 34000.00 |
|  5 | Ruslan   |  34 | Omsk      | 45000.00 |
|  6 | Dima     |  32 | SP        | 45000.00 |
|  7 | Roma     |  34 | SP        | 10000.00 |
+----+----------+-----+-----------+----------+

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Если статья понравилась, то поделитесь ей в социальных сетях:

Читайте также

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

**ссылки nofollow

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Статьи партнеров:

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

badge
Обратный звонок 1
Отправить

Спасибо! Ваша заявка принята

close

Спасибо! Ваша заявка принята

close