Подзапросы и шаблоны
Вспомним запрос, с помощью которого мы узнавали даты правки отдельно взятой страницы. Если не известен ID страницы, сначала надо выполнить запрос к таблице 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
Поэтому подзапросы с LIKE следует делать более конкретными:
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