1. Главная страница » Компьютеры » Mysql вложенные запросы select

Mysql вложенные запросы select

Автор: | 16.12.2019

В сервер MySQL поддерживает вложенные запросы вида INSERT . SELECT . и REPLACE . SELECT . . В других контекстах можно использовать и функцию IN() .

Вложенные операции выборки реализованы в версии 4.1.

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

можно переписать следующим образом:

Для более сложных подзапросов часто можно создать временные таблицы, содержащие данный подзапрос. Иногда, однако, этот способ не годится, чаще всего для команд DELETE , для которых в стандарте SQL не поддерживаются объединения (за исключением вложенных выборок). В этой ситуации возможны два временных (пока вложенные запросы не поддерживаются сервером MySQL) варианта решения проблемы.

Первый вариант следующий: при помощи какого-либо процедурно-ориентированного языка программирования (такого как Perl или PHP) делается запрос SELECT для получения первичных ключей тех записей, которые должны быть удалены, а затем полученные величины используются для составления команды DELETE (DELETE FROM . WHERE . IN (key1, key2, . )) .

Второй вариант предполагает применение диалогового SQL для автоматического создания набора команд DELETE с использованием расширения MySQL CONCAT() (вместо стандартного оператора || ). Например:

Можно поместить этот запрос в файл скрипта, перенаправить стандартный вход клиента командной строки с этого файла, а стандартный выход — на еще один экземпляр клиента командной строки:

Сервер версии MySQL 4.0 поддерживает многотабличные удаления — эту функцию можно использовать для эффективного удаления строк как из одной таблицы, так и из нескольких одновременно

Подзапросы представляют выражения SELECT, которые встроены в другие запросы SQL. Рассмотрим простейший пример применения подзапросов.

Например, создадим таблицы для товаров и заказов:

Таблица Orders содержит данные о купленным товарам из таблицы Products.

Добавим в таблицы некоторые данные:

При добавлении данных в таблицу Orders как раз используются подзапросы. Например, первый заказ был сделан на товар Galaxy S8. Соответственно в таблицу Orders нам надо сохранить информацию о заказе, где поле ProductId указывает на Id товара Galaxy S8, поле Price — на его цену. Но на момент написания запроса нам может быть неизвестен ни Id покупателя, ни Id товара, ни цена товара. В этом случае можно выполнить подзапрос в виде

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

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

Или найдем товары, цена которых выше средней:

Коррелирующие и некоррелирующие подзапросы

Подзапросы бывают коррелирующими и некоррелирующими. В примерах выше команды SELECT фактически выполняли один подзапрос для всех строк, извлекаемых командой. Например, подзапрос возвращает минимальную или среднюю цену, которая не изменится, сколько бы мы строк не выбирали в основном запросе. То есть результат подзапроса не зависел от строк, которые выбираются в основном запросе. И такой подзапрос выполняется один раз для всего внешнего запроса.

Но также можно использовать и коррелирующие подзапросы (correlated subquery), результаты которых зависят от строк, которые выбираются в основном запросе.

Например, выберем все заказы из таблицы Orders, добавив к ним информацию о товаре:

В данном случае для каждой строки из таблицы Orders будет выполняться подзапрос, результат которого зависит от столбца ProductId. И каждый подзапрос может возвращать различные данные.

Коррелирующий подзапрос может выполняться и для той же таблицы, к которой выполняется основной запрос. Например, выберем из таблицы Products те товары, стоимость которых выше средней цены товаров для данного производителя:

Читайте также:  Dark souls remastered характеристики

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

Второй подзапрос аналогичен, только он используется для фильтрации извлекаемых из таблицы Products. И также он будет выполняться для каждой строки.

Чтобы избежать двойственности при фильтрации в подзапросе при сравнении производителей ( SubProds.Manufacturer=Prods.Manufacturer ) для внешней выборки установлен псевдоним Prods, а для выборки из подзапросов определен псевдоним SubProds.

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

Как только человек начинает работать с множеством данных, возникает необходимость их каким-либо образом упорядочивать и архивировать, поэтому рано, или поздно приходит мысль о создании такого виртуального архива, как база данных, в которой и будет храниться вся необходимая информация. Тогда можно прибегнуть, к примеру, к такой программе, как Microsoft Access .

Создав в ней базу данных, кажется, что дело уже сделано, но уже совсем скоро появится необходимость, которую диктует современная жизнь — это возможность пользоваться всеми данными заключенными в базе через интернет с других компьютеров.

MySQL представляет собой наиболее популярную и распространенную СУБД для сети интернет. Данная СУБД не предназначена для того, чтобы работать с большим количеством информации, но ее возможности позволяют справляться со всеми задачами, необходимыми для работы интернет сайтов как скромных, так и ресурсов приличных размеров.

Чтобы обращаться и собственно работать с БД MySQL существуют определенные команды, которые обычно обозначают как запросы MySQL . Именно с помощью запросов можно выполнять такие манипуляции с базой как удаление, сортировка, изменение, добавление, получение и т.д.

Какими бывают MySQL запросы?

Все существующие команды MySQL можно разделить на простые или легкие для понимания и запоминания и сложные запросы.

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

Сложные запросы MySQL — это команды, которые могут затрагивать одновременно две или даже больше таблиц из одной базы данных.

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

Простые MySQL запросы

Существует два запроса, которые можно назвать максимально или супер простыми.
« Show databases; » — данный запрос выведет на экран список всех имеющихся баз данных.

« Show tables in bd; » — данная команда позволит узнать количество и наименования всех таблиц, которые есть в базе данных под названием bd .

Ну а теперь от супер простых запросов перейдем просто к простым.

Запросы MySQL типа Select

Зная значение слова select , можно понять, что все команды, связанные с данным словом, будут направлены на выбор и просмотр информации хранящейся только в одной таблице принадлежащей к базе.

« SELECT count(*) FROM cart; » — данный запрос позволит узнать, сколько записей содержится в упомянутой таблице:


Запрос « SELECT * FROM cart; » — позволит просмотреть все данные, которые имеются в таблице cart из базы данных:


« SELECT * FROM cart LIMIT 2,3; » — с помощью данного запроса можно выбрать блок данных и вывести его. В данном случае выбраны 3 записи на вывод, начиная со второй строчки. Такой запрос может быть очень полезен для создания блоков со страницами для навигации:


« SELECT * FROM people ORDER BY number; » — данная команда позволит вывести все поля таблицы под названием people в соответствии с полем number в порядке увеличения его значений:

Читайте также:  Exiting replaceorappendinstalldate coid fromdoctopdf 91dc00f46037408aa1f8d2239fe6a716 exe


« SELECT * FROM people ORDER BY number DESC; » — данный запрос позволяет выбрать все строки той же таблицы people , только упорядоченные не так как в предыдущем примере, а по убыванию:


« SELECT * FROM people ORDER BY number LIMIT 5; » — этот запрос выбирает из таблицы people только 5 строк, которые располагаются в соответствии с увеличением значения поля number :


« SELECT * FROM people WHERE name=’Anna’; » — данный запрос делает выборку полей таблицы people , в которых в роли значения поля name указана переменная Anna :


« SELECT * FROM people WHERE name LIKE ‘An% ‘;» — выводит только те поля таблицы people , в которых в полях под названием name начинается с букв An :


« SELECT * FROM people WHERE name LIKE ‘%na’ ORDER BY number ;» — запрос выводит данные таблицы people только тогда, когда значение поля name оканчивается буквами na , причем данные выводятся упорядоченными в соответствии с увеличением значения поля number :


« SELECT name, last_name FROM people; » — выводит на экран только данные таблицы people заключенные в полях last_name и name :


« SELECT DISTINCT site FROM cart; » — команда выводит только не повторяющиеся значения поля site из таблицы cart . К примеру, если таблица будет содержать только три значения sit.ru, sit.ru, wi-de.ru , то после работы данной команды будет выведено только два значения — sit.ru и wi-de.ru :


« SELECT * from people where age in (12,15,18); » — данный запрос выведет на экран только те данные из таблицы people , у которых в качестве значения поля под названием age будут указаны цифры 12, 15 или 18:

Запросы MySQL типа Insert

Данные виды запросов к базе данных позволяют вставить необходимую информацию в таблицу. То есть, посредством команд insert можно вставить в таблицу строку, добавив тем самым информацию к базе данных.

« INSERT into cart (sit, des) values (‘sit.ru’, ‘Sit-разработка сайтов’) » — данный запрос позволит вставить в таблицу базы под названием cart еще одну строку, у которой в поле sit будет значение sit.ru а в поле des значение Sit -разработка сайтов.

Запросы MySQL типа Update

Данный вид запросов занимается изменением данных уже имеющихся в базе.

« UPDATE cart set sit = ‘do.com’ where >» — запрос изменит значение, записанное в поле sit таблицы cart , в строке, номер id которой равен 3, на значение do.com .

Запросы MySQL типа Delete

Запросы данного типа позволяют производить удаление записей таблицы, являющейся частью базы данных.

« DELETE from cart where >» — данной командой удаляется вся информация из строки, id которой соответствует 3 в таблице cart .

Сложные запросы MySQL

Как уже было сказано ранее, сложный тип запросов — это запросы, которые способны одновременно задействовать две или даже больше двух таблиц в базе. Для того чтобы осознать принципы построения подобных команд рассмотрим хотя бы некоторые из них.

« SELECT DISTINCT name FROM people, address WHERE people.adress_no = ads.addr_no AND city LIKE ‘L%’; » — запрос сортирует и выводит все уникальные значения, записанные в поле name таблицы people , которые проживают по адресу с названием, начинающимся на букву L в соответствии со значением поля addr_no из таблицы баз под названием ads .

Данный запрос иначе может быть введен так:
« SELECT DISTINCT name FROM people p, ads a WHERE p.adress_no = a.addr_no AND city LIKE ‘L%’; ».

Оба этих запроса выведут на экран одно и то же. Если присмотреться, то подобные запросы не слишком то и сложны, главное точно знать наименование таблицы и через точку указать наименование поля, или же дать таблицам сокращенные имена для удобства и скорости ввода.

« SELECT her.char_name, her.cnt, char_temp. >» — Данный запрос позволяет вывести на экран данные из полей char_name , и cnt таблицы базы под названием her и поля ClassName из таблицы char_temp благодаря тому, что значения полей ClassId таблицы char_temp и class_id таблицы her имеют одинаковые идентификаторы. Данные выводятся в упорядоченном виде по полю ClassName таблицы char_temp .

Читайте также:  Pascal самоучитель для начинающих

В сокращенном виде данная команда будет выглядеть так: « SELECT char_name, cnt, >».

Если суть построения команд для вас стала понятной, то вы без труда сможете составлять сложные запросы, используя не только команду SELECT , но и команды UPDATE, DELETE, INSERT и другие.

Вложенные запросы MySQL

Во время работы с таблицами баз данных, особенно в деле разработки сайтов, зачастую возникает необходимость работать с множеством различных таблиц, пользуясь сложными запросами, но в иных случаях такое использование запросов может быть крайне неудобно и даже чересчур сложно. Да и к тому же множество запросов может сделать сайт слишком медленным.

Именно для того, чтобы избежать таких проблем MySQL делает возможным включение одного запроса в состав другого. Такие двойные запросы называются вложенные запросы или подчиненные. В подобных запросах оператор SELECT , который располагается внутри запроса, заключается в круглые скобки.

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

Рассмотрим на примере. Допустим, в нашей базе данных есть две таблицы. Первая таблица под названием Cat :


И вторая таблица под названием STR :


Наша задача заключается в том, чтобы с помощью вложенного запроса взять данные обеих таблиц и в итоге вывести на экран информацию о том, к какому имени раздела, сколько статей относиться.

Выглядеть данный запрос будет следующим образом: « SELECT (SELECT COUNT(*) FROM `STR` WHERE STR.category_ >».

Первым будет выполняться запрос в скобках ( SELECT COUNT(*) FROM ` STR ` WHERE STR.category_ >), который предоставит информацию обо всех категориях, а в нем уже сделаем выборку для того, чтобы вычислить количество страниц, предназначенных для указанных категорий, посредством запроса « SELECT (*) as `count`, cat.name FROM cat ».

Быстрота вывода результатов запроса

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

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

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

PHP и MySQL

СУБД MySQL — это одна из множества баз данных, поддерживаемая языком программирования PHP . Запросы к MySQL во время создания веб-страниц это обычное дело, потому что основная информация как раз таки и хранится в таблицах базы данных и чтобы вывести ее на экран, необходимы PHP запросы к MySQL .

Для того чтобы работать с MySQL в документах PHP предусмотрен специализированный алгоритм действий:

  • Установка соединения с базой данных при помощи команды mysql_connect();
  • Выбор необходимой базы данных командой mysql_select_db();
  • PHP запросы к MySQL через команду mysql_query();
  • Обработка результата запроса mysql_fetch_array();
  • Закрытие соединения с базой данных или отключение от сервера БД mysql_close();

Из всего описанного можно понять, что работать с базами MySQL не так то и сложно, главное — суметь понять и правильно строить запросы к нужной информации.

Если вы освоите правила построения запросов MySQL , тогда ваш сайт будет работать гораздо быстрее, и даже в случае если его одновременно будут использовать множество пользователей, это не сможет существенно отразиться на скорости открытия страниц.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code