BillingCity,
Total
FROM
invoices
WHERE
BillingCity = 'Tucson'
ORDER BY
Total
Рис. 48
В результате получено только семь счетов для города Тусон.
Примечание
При использовании текста в качестве критерия в условии WHERE указанные текстовые значения должны быть заключены в одинарные кавычки (BillingCity = 'Tucson').
НАПОМИНАНИЕ
В предыдущем примере мы использовали символ =, так как требовалось найти только одно значение. Если бы стояла задача получить данные для нескольких городов, мы могли бы использовать оператор IN аналогично тому, как мы использовали его для получения числовых значений.
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total
FROM
invoices
WHERE
BillingCity IN ('Tucson', 'Paris', 'London')
ORDER BY
Total
Рис. 49
Использование оператора LIKE для поиска подстановочных знаков
В предыдущих примерах для поиска необходимого текста мы использовали оператор =. SQL также позволяет искать фрагменты текстовой строки с помощью оператора LIKE. Это особенно полезно, когда мы не знаем, как именно было записано в базе данных текстовое значение. Кроме того, бывают случаи, когда текстовое значение было написано с ошибками. Если понадобится найти все счета, выставленные в городах, название которых начинается с буквы T, в условии WHERE придется изменить параметры.
Оператор LIKE использует подстановочные знаки, представленные символом % (символ процента). То, что следует за знаком =, это единственное значение, которое вы увидите в своем наборе результатов. С помощью оператора LIKE и подстановочного знака вы можете определить варианты ввода.
Примечание
Подстановочные знаки всегда заключаются в одинарные кавычки. Не заключенный в кавычки символ % — это просто арифметический оператор (показан ранее в этой главе в таблице операторов). Текстовый поиск не чувствителен к регистру. При использовании в запросе строчной или заглавной буквы результаты будут одинаковы.
С помощью подстановочного знака можно задать любое количество символов любого типа. Как показано в примере ниже, запрос ищет любые счета, выставленные в городах на букву T. В результат теперь попали Торонто и Тусон.
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total
FROM
invoices
WHERE
BillingCity LIKE 'T%'
ORDER BY
Total
Рис. 50
Добавление еще одного символа % перед буквой T изменит условие поиска на поиск счета, выставленного в городе, название которого содержит букву T.
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total
FROM
invoices
WHERE
BillingCity LIKE '%T%'
ORDER BY
Total
Рис. 51
Примечание
Разумеется, при этом в результатах появятся и города, названия которых начинаются или заканчиваются строчной буквой t. Символ % может представлять любую букву (буквы), включая строчную t.
Оператор LIKE также используется для исключения результатов, соответствующих указанным параметрам. Для этого необходимо поставить ключевое слово NOT перед оператором LIKE, и вы сможете исключить записи из результата запроса.
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total
FROM
invoices
WHERE
BillingCity NOT LIKE '%T%'
ORDER BY
Total
Из примеров видно, что существует множество способов использования оператора с подстановочными знаками. Рассмотрим наиболее распространенные.
Рис. 52
Рис. 53
Примечание
Символ % можно интерпретировать как «что угодно». Например, когда вы указываете '%T%', вы имеете в виду: «Меня не беспокоит, какие символы содержатся в строке до или после буквы T (буква T при этом не первая и не последняя)».
Фильтрация записей по дате
Используя все знания как о числах, так и о тексте, вы сможете теперь выполнить поиск счета, выставленного в определенную дату. Рассмотрим следующий пример:
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total
FROM
invoices
WHERE
InvoiceDate = '2009-01-03 00:00:00'
ORDER BY
Total
Рис. 54
Обратите внимание на способ написания даты. При указании даты в запросе важно сначала проанализировать, каким образом дата хранится в запрашиваемой таблице. Как вы знаете из главы 1, для этого надо перейти на вкладку Browse Data (Просмотр данных), выбрать таблицу invoices и проанализировать формат, в котором столбец InvoiceDate хранит даты. В нашей базе данных даты хранятся в формате гггг-мм-дд 00:00:00. Затем перейдите на вкладку Database Structure (Структура базы данных) и проанализируйте поле InvoiceDate таблицы invoices. Вы видите, что в столбце Type даты имеют тип данных DATETIME.
В условии WHERE дата, как и текст, заключена в одинарные кавычки. При работе с датами используйте те же операторы, что и при работе с числами: =, >, <, BETWEEN и т. д.
Практические задания
• Получите все счета, выставленные в период с 1 января 2009 г. по 31 декабря 2009 г.
• Найдите 10 самых крупных счетов, полученных после 5 июля 2009 г.
Функция DATE()
При работе с датами в SQL можно использовать ряд функций, которые помогают получать более точные результаты. Из предыдущего примера видно, что столбец InvoiceDate таблицы invoices имеет тип данных DATETIME. Поэтому, когда мы указывали значение даты в услови WHERE, мы включали время (2009-01-03 00:00:00). Функция DATE()позволяет исключить время при указании параметров даты.
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total
FROM
Invoices
WHERE
DATE(InvoiceDate) = '2009-01-03'
ORDER BY
Total
Рис. 55
Результат этого запроса идентичен результату предыдущего запроса. Однако использование функции DATE() позволяет получить результат быстрее, когда параметры времени либо отсутствуют, либо не актуальны.
Примечание
В SQL доступно множество функций. Функция DATE () особенно полезна при использовании условия WHERE для сортировки записей по дате. В главе 7 мы более подробно рассмотрим другие функции.
Использование операторов AND и OR с двумя отдельными полями
В этой главе мы применяли операторы только для выбора подмножества одного поля. Например, мы использовали оператор AND с оператором BETWEEN для фильтрации результатов поля Total с двумя различными числовыми значениями. Мы также можем применить операторы AND и OR для указания параметров нескольких полей. В приведенном ниже запросе оператор AND используется вместе с функцией DATE() для поиска всех счетов, оформленных после 02.01.2010, на общую сумму менее $3,00. Результат этого запроса должен удовлетворять одновременно обоим условиям: (DATE(InvoiceDate)>'2010-01-02'ANDTotal<3).
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total
FROM
invoices
WHERE
DATE(InvoiceDate) > '2010-01-02' AND Total < 3
ORDER BY
Total
Рис. 56
Из полученных результатов можно увидеть, что возвращаются только счета, оформленные после 2 января 2010 года, общая сумма которых составляет менее $3.
Примечание
Для поиска дополнительных параметров вы можете добавить дополнительные операторы AND. Как и в случае с оператором IN, можно не ограничиваться только двумя значениями.
Практические задания
• Найдите все счета, которые были выставлены в городе, название которого начинается с буквы P, а общая сумма превышает $2.
Оператор OR
Оператор OR позволяет найти записи, соответствующие любому из заданных вами условий. В следующем запросе выполняется поиск всех счетов, выставленных в городах, названия которых начинаются с буквы P или с буквы D.
Рис. 57
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total
FROM
invoices
WHERE
BillingCity LIKE 'p%' OR BillingCity LIKE 'd%'
ORDER BY
Total
Использование круглых скобок с операторами AND и OR для указания порядка операций
При написании в SQL более длинных условий WHERE, включающих несколько логических операторов, можно определить порядок выполнения операций аналогично правилам базовой арифметики. Возможно, вы встречали аббревиатуру PEMDAS (Parentheses, Exponents, Multiplication, Division, Addition, Subtraction — круглые скобки, экспоненты, умножение, деление, сложение, вычитание) или похожую BEMDAS (Brackets, Exponents, Multiplication, Division, Addition, Subtraction). Первая используется в США, вторая — в странах, где сильно влияние Великобритании. Если не встречали, то не стоит беспокоиться. Способ определения порядка операций очень простой. Но пока рассмотрим работу операторов AND и OR. Допустим, нам необходимо получить все счета на сумму свыше $1,98 из любых городов, названия которых начинаются с буквы P или D. Запрос будет выглядеть следующим образом:
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total
FROM
invoices
WHERE
Total > 1.98 AND BillingCity LIKE 'p%' OR
BillingCity LIKE 'd%'
ORDER BY
Total
Рис. 58
Когда данный запрос выполняется, браузер SQL сначала объединяет два условия по обе стороны от оператора AND, возвращая счета, общая сумма которых превышает $1,98, и названия городов, где они были выставлены, начинаются с буквы P. Затем отдельно обрабатывается условие справа от оператора OR, как если бы оператора AND не существовало. Другими словами, запрос сначала выполняет поиск результатов, где Total>1.98ANDBillingCityLIKE'p%'. Затем выполняется поиск всех результатов, где BillingCityLIKE'd%', а затем возвращаются результаты для обоих условий в порядке возрастания в поле Total.
Если вышеуказанный запрос вы ввели в свой браузер SQL, то заметите, что получены данные, соответствующие значению менее $1,98, но только для городов, начинающихся с буквы D.
Это связано с тем, что порядок операций SQL определен следующим образом: сначала обрабатывается оператор AND, а затем — оператор OR. Это не совсем так, как мы изначально хотели, но есть простой способ обрабатывать наш запрос именно так, как мы планировали, без необходимости прибегать к логическим операторам.
Примечание
В SQL порядок оператора AND соответствует порядку операции умножения, а оператора OR — операции сложения, если не добавлены круглые скобки. При отсутствии круглых скобок оператор AND будет обрабатываться по принципу, аналогичному арифметике: 3*2+1 равно 7, а 3*(2+1) равно 9.
При добавлении круглых скобок, как показано в примере ниже, браузер SQL сначала выполняет поиск данных, удовлетворяющих условиям внутри скобок: (BillingCityLIKE'p%'ORBillingCityLIKE'd%'). Затем только из этих записей, он ищет данные, общая сумма которых превышает $1,98 (Total>1.98).
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total
FROM
invoices
WHERE
Total > 1.98 AND (BillingCity LIKE 'p%' OR
BillingCity LIKE 'd%')
ORDER BY
Total
Рис. 59
Теперь мы переписали запрос так, что все счета, сумма которых превышает $1,98, будут сформированы в городах, начинающихся либо с буквы P, либо с буквы D, что и требовалось изначально.
На мой взгляд,
хотя важно и полезно знать, как SQL обрабатывает логические операторы, целесообразно при использовании нескольких операторов просто добавлять круглые скобки, что упрощает понимание сложной логики кода. Если вам хочется потренироваться, выполните следующие упражнения как со скобками, так и без них, и вы увидите, как это влияет на результат.
Практические задания
• Снова запустите запрос и проанализируйте, имеются ли в столбце Total какие-либо данные, значения которых меньше $1,98.
• Найдите все счета с общей суммой выше $3,00, выставленные в городах, название которых начинается с буквы P или D.