Подзапрос – это рекурсивный запрос SQL в рамках более крупного запроса, или подзапрос считается внутренним запросом. Напротив, внешний запрос называется запросом, который включает подзапрос. Подзапрос MySQL может быть встроен в запросы, включая SELECT, INSERT, UPDATE или DELETE. Кроме того, внутри другого подзапроса может быть вложен подзапрос. Подзапрос фразы следует заключать в квадратные скобки, где бы он ни использовался. Мы научим вас, как и когда использовать подзапрос MySQL для составления сложных запросов, и опишем идею связанного подзапроса. Откройте оболочку командной строки на рабочем столе и введите пароль, чтобы начать ее использовать. Нажмите Enter и продолжите.
Создайте таблицу с именем «animals» в базе данных «data». Добавьте следующую запись о разных животных с разными свойствами, как показано. Получите эту запись с помощью запроса SELECT следующим образом:
>> SELECT * FROM data.animals;
Давайте извлечем ограниченные записи этой таблицы с помощью подзапросов. Используя приведенный ниже запрос, мы знаем, что подзапрос будет выполнен первым, а его выходные данные будут использоваться в основном запросе в качестве входных. Подзапрос просто извлекает возраст, при котором цена животного составляет 1300.
>> SELECT * FROM data.animals WHERE Age > ( SELECT Age FROM data.animals WHERE Price=’1300’ );
Давайте использовать одну и ту же таблицу в разных ситуациях. В этом примере мы будем использовать некоторую функцию вместо предложения WHERE в подзапросе. Мы взяли среднее значение всех цен на животных.
>> SELECT * FROM data.animals WHERE Price > ( SELECT AVG(Price) FROM data.animals);
Давайте использовать предложение IN в основном запросе SELECT. Прежде всего, подзапрос получит цены больше 2500. После этого основной запрос выберет все записи таблицы «animals», в которых цена находится в результате подзапроса.
>> SELECT * FROM data.animals WHERE Price IN ( SELECT Price FROM data.animals WHERE Price > 2500 );
Мы использовали подзапрос для получения имени животного, где цена равна 2500. В основном запросе все записи будут извлечены из таблицы, где имя животного равно цене 2500.
>> SELECT * FROM data.animals WHERE Name = ( SELECT Name FROM data.animals WHERE Price=’2500’ );
Предположим, что в вашей базе данных есть две таблицы ниже, «student» и «teacher». Давайте попробуем несколько примеров подзапросов с использованием этих двух таблиц.
>> SELECT * FROM data.student; >> SELECT * FROM data.teacher;
Мы будем извлекать данные из одной таблицы с помощью подзапроса и использовать их в качестве входных данных для основного запроса. Это означает, что эти две таблицы могут как-то связаны. В приведенном ниже примере мы использовали подзапрос для получения имени ученика из таблицы «student», где имя учителя – «AndreyEx». Этот запрос вернет AndreyEx в основную таблицу запросов «teacher». Затем основной запрос выберет все записи, связанные с именем учителя «AndreyEx». Так как у нас есть две записи для этого имени, значит, мы получили такой результат.
>> SELECT * FROM data.teacher WHERE TeachName = ( SELECT TeachName FROM data.student WHERE TeachName = ‘AndreyEx’ );
Чтобы разработать подзапрос для разных таблиц, попробуйте этот пример. У нас есть подзапрос, который извлекает имя учителя из таблицы student. Имя должно содержать букву «i» в любой позиции. Это означает, что все имена в столбце TeachName, содержащие «i» в своем значении, будут выбраны и возвращены в основной запрос. Основной запрос выберет все записи из таблицы ‘teacher’, где имя учителя находится в выходных данных, возвращаемых подзапросом. Поскольку подзапрос вернул 4 имени учителей, поэтому у нас будет запись всех этих имен, находящихся в таблице «teacher».
>> SELECT * FROM data.teacher WHERE TeachName IN ( SELECT TeachName FROM data.student WHERE TeachName LIKE ‘%i%’ );
Рассмотрим две таблицы ниже, «порядок» и «порядок1».
>> SELECT * FROM data.order; >> SELECT * FROM data.order1;
Давайте попробуем предложение ANY в этом примере, чтобы разработать подзапрос. Подзапрос выберет идентификатор из таблицы order1, где в столбце «Status» указано значение «Unpaid». «Id» может быть больше 1. Это означает, что в основной запрос будет возвращено более 1 значения для получения результатов «Unpaid» таблицы. В этом случае можно использовать любой идентификатор. Для этого запроса мы получили следующий результат.
>> SELECT Item, Sales, id FROM data.order WHERE id= ANY ( SELECT id FROM data.order1 WHERE Status= ’Unpaid’ );
Предположим, у вас есть указанные ниже данные в таблице order1 перед применением любого запроса.
>> SELECT * FROM data.order1;
Давайте применим запрос внутри запроса, чтобы удалить некоторые записи из таблицы ‘order1’. Во-первых, подзапрос выберет значение «Status» из таблицы «order», где элементом является «Book». Подзапрос возвращает значение Paid. Теперь основной запрос удалит строки из таблицы «order1», в которой значение столбца «Status» равно «Paid».
>> DELETE FROM data.order1 WHERE Status= ( SELECT Status FROM data.order WHERE Item = ’Book’ );
После проверки у нас остались следующие записи в таблице order1 после выполнения запроса.
>> SELECT * FROM data.order1;
Во всех приведенных выше примерах вы эффективно работали с множеством подзапросов. Надеемся, теперь все ясно и чисто.