Рис. 41
Примечание
Для создания более сложных запросов операторы разных типов можно комбинировать. Это позволяет получать данные в зависимости от определенного диапазона или создавать уникальные условия. Рассмотрим наиболее распространенные операторы.
В следующем примере мы рассмотрим, как арифметические операторы используются вместе с условием SELECT для увеличения значения поля Total из таблицы invoices базы данных sTunes. Арифметические операции полезны, когда необходимо считать налоги, надбавки и др.
SELECT
Total AS [Original Amount],
Total + 10 AS [Addition Operator],
Total — 10 AS [Subtraction Operator],
Total / 10 AS [Division Operator],
Total * 10 AS [Multiplication Operator],
Total % 10 AS [Modulo Operator]
FROM
invoices
ORDER BY
Total DESC
Рис. 42
Практические задания
• Используя приведенный выше пример запроса, отобразите поле Total из таблицы invoices с добавленным налогом в размере 15 %.
Фильтрация данных (WHERE)
Помимо условия SELECT операторы чаще всего используются в условии WHERE. С помощью WHERE мы можем добавлять к нашим запросам определенные условия, например ограничивать результаты наших запросов в соответствии с необходимыми задачами. Некоторые распространенные типы данных, которые мы можем фильтровать, содержат числа, текст и даты. Для фильтрации данных мы будем использовать WHERE вместе с операторами.
Рассмотрим следующий пример. Предположим, что отдел продаж компании sTunes хочет знать, сколько клиентов купили две песни стоимостью по $0,99 каждая. Как ответить на этот вопрос? В главе 3 в разделе «Контрольные вопросы» мы показывали таблицу tracks. Из нее мы знаем, что наша компания продает отдельные песни по цене $0,99 и $1,99 (рис. 43).
Если мы проанализируем таблицу invoices (рис. 44), то увидим общую стоимость заказов в поле Total.
Если бы нам понадобилось узнать количество клиентов, которые приобрели всего две песни по $0,99, мы бы отобразили в таблице invoices запись на общую сумму $1,98 — за две песни.
Рис. 43
Рис. 44
Используя инструменты, которые вы изучили в предыдущей главе, можно написать запрос, который осуществляет выборку всех счетов, а затем упорядочивает их по общей сумме, но для этого необходимо выполнить расчет вручную. Но можно и вставить условие WHERE между условиями FROM и ORDERBY для поиска только тех счетов, которые равны $1,98. Вместе с итоговой суммой добавим несколько других полей, таких как дата выставления счета и адрес, что поможет нам идентифицировать каждый счет. Получим следующий запрос:
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total
FROM
invoices
WHERE
Total = 1.98
ORDER BY
InvoiceDate
Рис. 45
Примечание
Условие WHERE всегда следует после условия FROM, но всегда находится перед ORDER BY. В приведенном выше примере условие WHERE добавлено для возврата всех счетов на сумму $1,98. Знак = — это оператор сравнения.
Практические задания
Используя операторы сравнения, напишите следующие запросы:
• запрос, возвращающий все счета, превышающие значение $1,98;
• запрос, возвращающий все счета, которые больше или равны $1,98;
• запрос, возвращающий все счета, кроме $1,98.
Другой полезный вид операторов — логические. Используя логические операторы, вы можете создавать более сложные и конкретные запросы, которые трудно выполнить с помощью операторов сравнения. Предположим, что вас попросили узнать, какое количество счетов имеется в определенном диапазоне, например от $1,98 до $5.
В данном случае целесообразно использовать оператор BETWEEN. Оператор BETWEEN задает диапазон для проверки условия. Для определения необходимого диапазона значений вместе с оператором BETWEEN используется оператор AND. Рассмотрим следующий запрос, который возвращает счета, находящиеся в диапазоне от $1,98 до $5,00.
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total
FROM
invoices
WHERE
Total BETWEEN 1.98 AND 5.00
ORDER BY
InvoiceDate
Проанализируем первые десять результатов этого запроса (рис. 46). Итоговые суммы счетов находятся в диапазоне от $1,98 до $5. Оператор BETWEEN включает
Рис. 46
в диапазон и параметры, которые вы ему зададите. Другими словами, здесь он будет включать любые значения между 1,98 и 5,00 и равные этим значениям. Для достижения того же результата, используя условие WHERE и операторы сравнения, вы можете написать следующее: Total>=1.98ANDTotal<=5.00. Однако в данном случае гораздо проще использовать оператор BETWEEN.
Примечание
Хотя в предыдущем примере мы используем оператор AND вместе с BETWEEN, оператор AND имеет более широкое применение в качестве логического оператора. Его мы рассмотрим позже.
Практические задания
• Используя предыдущий запрос, выполните сортировку по полю Total. Выясните, какая сумма счета в этом наборе данных максимальная.
Еще один очень важный оператор SQL — оператор IN. Он позволяет определить, совпадает ли значение в условии WHERE с какими-то значениями в списке. В предыдущем примере оператор BETWEEN возвращал каждое значение в нашей таблице invoices, находящееся в диапазоне от 1,98 до 5,00. Оператор IN позволяет нам находить указанные значения в наборе данных. Значения разделены запятой и заключены в круглые скобки. Следующий запрос возвращает только суммы счетов-фактур, равные $1,98 или $3,96 (рис. 47).
SELECT
InvoiceDate,
BillingAddress,
BillingCity,
Total
FROM
invoices
WHERE
Total IN (1.98, 3.96)
ORDER BY
InvoiceDate
Примечание
С помощью оператора = мы можем добавить только одно значение. С помощью оператора IN мы можем добавить сколько угодно значений, разделенных запятыми. Также мы можем использовать оператор IN с текстом (описано в следующем разделе).
Рис. 47
Практические задания
• Сколько записей возвращает указанный выше запрос?
• Напишите запрос, в котором перечислены все счета на сумму $13,86, $18,86 и $21,86.
Фильтрация строк
Мы также можем использовать операторы для возврата определенного текста подобно тому, как мы делали с числами. Рассмотрим пример с использованием операторов сравнения. Ответим на следующий вопрос: сколько счетов было выставлено в городе Тусон (Tucson)?
Для этого необходимо структурировать наш оператор SELECT. Следующий запрос возвращает все счета, выставленные в городе Тусон:
SELECT
InvoiceDate,
BillingAddress,
BillingCity,