Поиск с использованием метасимволов может осуществляться только в текстовых полях. Самый распространенный метасимвол – %. Он означает любые символы.
Например, если надо найти слова, начинающиеся с букв «вел», то напишем LIKE 'вел%', а если необходимо найти слова, которые содержат символы «клуб», то напишем LIKE '%клуб%'.
Например:
Еще один часто используемый метасимвол – _. В отличие от %, который обозначает «несколько или ни одного символа», нижнее подчеркивание обозначает «ровно один символ».
Например:
Обратите внимание на пробел между метасимволом и «рыб», если его пропустить, то запрос не сработает, т.к. метасимвол _ обозначает ровно один символ, а пробел – это тоже символ.
Вложенные запросы
Пусть необходимо узнать, кто создал тему «Велосипеды», делаем для этого соответствующий запрос:
Вместо имени автора получен его идентификатор, т.к. был сделан запрос к одной таблице – Темы, а имена авторов тем хранятся в другой таблице – Пользователи. Поэтому, узнав идентификатор автора темы, необходимо сделать еще один запрос – к таблице «Пользователи», чтобы узнать его имя:
В SQL предусмотрена возможность объединять такие запросы в один путем превращения одного из них в подзапрос (вложенный запрос). Итак, чтобы узнать, кто создал тему «Велосипеды», делаем следующий запрос:
То есть, после ключевого слова WHERE, в условие записывается еще один запрос. MySQL сначала обрабатывает подзапрос, возвращает id_author = 2, и это значение передается в предложение WHERE внешнего запроса. В одном запросе может быть несколько подзапросов, синтаксис у такого запроса следующий:
SELECT имя_столбца FROM имя_таблицы WHERE часть условия IN
(SELECT имя_столбца FROM имя_таблицы WHERE часть условия IN
|
(SELECT имя_столбца FROM имя_таблицы WHERE условие));
Обратите внимание, что подзапросы могут выбирать только один столбец, значения которого они будут возвращать внешнему запросу. Попытка выбрать несколько столбцов приведет к ошибке.
Составим еще один запрос, узнаем, какие сообщения на форуме оставлял автор темы «Велосипеды»:
Теперь узнаем, в каких темах оставлял сообщения автор темы «Велосипеды»:
Сначала MySQL выполнит самый глубокий запрос:
SELECT id_author FROM topics WHERE topic_name = 'велосипеды'
Полученный результат (id_author = 2) передаст во внешний запрос, который примет вид:
SELECT id_topic FROM posts WHERE id_author IN (2);
Полученный результат (id_topic: 4, 1) передаст во внешний запрос, который примет вид:
SELECT topic_name FROM topics WHERE id_topic IN (4, 1);
И выдаст окончательный результат (topic_name: о рыбалке, о рыбалке). Т.е. автор темы «Велосипеды» оставлял сообщения в теме «О рыбалке», созданной Сергеем (id = 1) и в теме «О рыбалке», созданной Светой (id = 4).
Есть два момента, на которые стоит обратить внимание:
1. Не рекомендуется создавать запросы со степенью вложения больше трех. Это приводит к увеличению времени выполнения и к сложности восприятия кода.
2. Приведенный синтаксис вложенных запросов, скорее наиболее употребительный, но вовсе не единственный.
Например, можно вместо запроса
SELECT name FROM users WHERE id_user IN
(SELECT id_author FROM topics WHERE topic_name = 'велосипеды');
написать:
SELECT name FROM users WHERE id_user = (SELECT id_author FROM topics WHERE topic_name = 'велосипеды');
Т.е. можно использовать любые операторы, используемые с ключевым словом WHERE.