Как узнать, где все места, где мы можем использовать подзапросы в mysql? - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь использовать подзапросы в mysql и наткнулся на приведенные ниже инструкции, в которых мы можем использовать подзапросы в разных местах.

select Salary from Employee where (select max(Salary) from Employee) < 400;
select Salary from Employee where Salary < (select max(Salary) from Employee);
select Salary from (select * from Employee) as seq1 where Salary < 400;

Теперь я не понимаю, где все места, где мы можем использовать подзапросы поскольку есть несколько возможностей его использования.

Когда я проверяю документацию для предложения WHERE, он просто упоминал предоставление условия в качестве входных данных, но ничего не упоминалось о том, где все, что мы можем использовать подзапросы, чтобы сделать синтаксис правильным

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Вы можете использовать подзапрос в любом месте, где разрешена таблица, и вы просто читаете таблицу, например, предложения FROM или JOIN. Это называется производной таблицей . Это ваш третий пример. Поскольку он должен быть только для чтения, вы не можете использовать его в качестве цели для UPDATE или DELETE (но вы можете присоединиться к подзапросу в запросе UPDATE или DELETE).

Вы можете использовать подзапрос везде, где разрешено выражение. Подзапрос должен выбрать одно значение и должен возвращать не более одной строки (если он теперь возвращает строки, он оценивается как NULL). Ограничением является то, что вы не можете использовать подзапрос в предложении WHERE запроса UPDATE или DELETE, нацеленного на ту же таблицу; по этой причине вам необходимо присоединиться к подзапросу (см. Вы не можете указать целевую таблицу для обновления в предложении FROM ).

Это означает, что подзапрос можно использовать в SELECT список, в предложении WHERE и в предложении HAVING. Даже в предложении ON, хотя я редко видел такие примеры.

Вы можете использовать подзапрос вместо списка значений в выражении IN, например

SELECT Salary
FROM Employee
WHERE id in (SELECT Emp_id FROM Employee_Department WHERE Dept_id = 100)

Однако, по моему опыту, MySQL часто плохо оптимизирует их, и их лучше записывать как объединения:

SELECT e.Salary
FROM Employee AS e
JOIN Employee_Department AS d ON e.id = d.emp_id
WHERE d.dept_id = 100;

Запрос SELECT также может использоваться в качестве источника данных в запрос INSERT:

INSERT INTO low_salary_employees
SELECT employee_id
FROM Employee
WHERE Salary < (SELECT MAX(Salary)/10 FROM Employee)
1 голос
/ 05 мая 2020

Первые два примера запросов используют скалярные подзапросы, ie подзапросы, возвращающие одну строку и столбец. Вы можете использовать такой запрос везде, где вам нужно скалярное значение, поэтому это открывает широкий спектр вариантов использования, например, в предложении select, в предикате where и т. Д.

Третий пример отличается: здесь подзапрос возвращает набор записей (потенциально более одной строки и более одного столбца). Это называется таблицей , производной . Вы можете использовать почти так же, как и обычную таблицу, поэтому в основном в предложении from запроса.

...