Давайте вспомним запрос, который использовался для извлечения даты изменения определенной страницы. В случае, если идентификатор этой страницы неизвестен, сначала необходимо сделать выборку из таблицы 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