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

Здравствуйте,野心勃勃的SQL-энтузиасты! Я рад быть вашим проводником в этом захватывающем путешествии в мир SQL подзапросов. Как某人, кто преподавал информатику на протяжении многих лет, я могу сказать вам, что подзапросы resemble secret sauce, который может сделать ваши навыки SQL отличными от хороших. Так что давайте окунемся и разгадаем тайны подзапросов вместе!

SQL - Sub Queries

SQL Подзапросы

Что такое подзапросы?

Представьте, что вы делаете бутерброд. Хлеб - это ваш основной запрос, но что делает его真正美味ным, это начинка внутри - это ваш подзапрос! В терминах SQL, подзапрос - это запрос, вложенный в другой запрос. Это как задавать вопрос в вопросе, позволяя вам выполнять сложные операции, которые могут быть невозможны с одним запросом.

Давайте рассмотрим простой пример:

SELECT employee_name
FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'Marketing');

В этом запросе, часть внутри скобок - это наш подзапрос. Он находит department_id для отдела 'Marketing', который затем используется внешним запросом для поиска всех сотрудников в этом отделе.

Правила, которые πρέπει следовать

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

  1. Подзапросы должны быть заключены в скобки.
  2. Подзапрос может иметь только одну колонку в предложении SELECT,除非主查询 содержит несколько колонок для сравнения.
  3. Команда ORDER BY не может быть использована в подзапросе, although основное предложение может использовать ORDER BY.
  4. Подзапросы, возвращающие более одной строки, могут быть использованы только с операторами множественных значений, такими как оператор IN.

Вот удобная таблица, резюмирующая эти правила:

Rule Description
Parentheses Подзапросы должны быть заключены в скобки
Single Column Подзапрос SELECT обычно возвращает только одну колонку
No ORDER BY ORDER BY нельзя использовать в подзапросе
Multiple Rows Используйте операторы множественных значений для подзапросов, возвращающих несколько строк

Подзапросы с предложением SELECT

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

SELECT product_name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);

Этот запрос выбирает все продукты с ценой выше средней цены всех продуктов. Подзапрос calculates среднюю цену, а основной запрос использует этот результат для фильтрации продуктов.

Вот еще один пример, который использует подзапрос в предложении SELECT:

SELECT
employee_name,
salary,
(SELECT AVG(salary) FROM employees) as avg_salary
FROM employees;

Этот запрос не только извлекает имя и зарплату каждого сотрудника, но и включает среднюю зарплату по всем сотрудникам в каждой строке. Это как если бы у вас был迷你-отчет для каждого сотрудника!

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

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

INSERT INTO high_salary_employees (employee_id, employee_name, salary)
SELECT employee_id, employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) * 1.5 FROM employees);

Этот запрос вставляет в таблицу high_salary_employees всех сотрудников, чья зарплата превышает среднюю зарплату в 1,5 раза. Это как создание VIP-списка ваших лучших зарабатывающих сотрудников!

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

Подзапросы могут сделать ваши предложения UPDATE much более мощными. Давайте рассмотрим пример:

UPDATE products
SET price = price * 1.1
WHERE category_id = (SELECT category_id FROM categories WHERE category_name = 'Electronics');

Этот запрос увеличивает цену всех продуктов в категории 'Electronics' на 10%. Подзапрос находит category_id для 'Electronics', который затем используется основным запросом для обновления правильных продуктов.

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

Наконец, давайте посмотрим, как подзапросы могут быть использованы с предложениями DELETE:

DELETE FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE last_order_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR)
);

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

И вот оно,folks! Мы совершили путешествие по земле SQL подзапросов, от основных концепций до более сложных приложений. Помните, что практика делает perfect, так что не бойтесь экспериментировать с этими запросами на своих базах данных.

Как я всегда говорю своим студентам, SQL resembles Swiss Army knife - и подзапросы resemble та скрытая бритва, которая может вытащить вас из сложных ситуаций. Так что продолжайте исследовать, продолжайте запрашивать и, самое главное, продолжайте учиться!

Credits: Image by storyset