Подзапросы и шаблоны

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