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

sqlite> SELECT _id FROM pages WHERE url == 'boolean';
8
sqlite> SELECT date FROM dates WHERE page_id == 8 ORDER BY date DESC;
2019-06-04
2019-05-30

Но с помощью SQL вы можете сделать эти запросы более компактными, вынеся первый запрос в подзапрос во втором:

sqlite> SELECT date FROM dates WHERE page_id ==
   ...> (SELECT _id FROM pages WHERE url == 'boolean')
   ...> ORDER BY date DESC;
2019-06-04
2019-05-30

Здесь скобки выделяют подзапрос, и его результаты вставляются в основной запрос без использования точки с запятой после подзапроса. Таким образом, page_id будет сопоставляться с найденным _id в таблице pages.

Если же мы не знаем точное название или URL страницы, как тогда осуществить поиск, не просматривая всю таблицу? Для подобных случаев в SQL предусмотрен оператор LIKE, с помощью которого можно указать образец для поиска.

При работе с шаблонами % и _ используются для обозначения неизвестных символов. Знак % заменяет любое количество символов, включая их полное отсутствие, а _ соответствует любому одиночному символу. Если начало url страницы известно и это 'b', страницу можно найти следующим образом:

sqlite> SELECT _id,url FROM pages WHERE url LIKE 'b%';
7|binary
8|boolean

Запрос с оператором LIKE может быть задействован и в подзапросе. Однако, если найдено несколько совпадений по заданному шаблону, то результат первым совпадением попадет в основной запрос:

sqlite> SELECT date,page_id FROM dates WHERE page_id ==
   ...> (SELECT _id FROM pages WHERE url LIKE 'b%'); 
2019-05-26|7

Далее можно детализировать шаблон, например:

sqlite> SELECT date,page_id FROM dates WHERE page_id ==
   ...> (SELECT _id FROM pages WHERE url LIKE 'b__l%n'); 
2019-05-30|8
2019-06-04|8

Вопросы для самопроверки:

  1. Что произойдет, если использовать LIKE оператор с шаблоном, соответствующим нескольким записям?
  2. Какой SQL оператор используется для поиска записей, если неизвестно точное значение определенной колонки?
  3. Какие символы используются в шаблонах оператора LIKE и что они обозначают?
  4. Какие преимущества дает использование подзапросов в SQL?
  5. Какие ограничения есть при использовании оператора LIKE в подзапросах?