Виктор Гольцман - MySQL 5.0. Библиотека программиста стр 25.

Шрифт
Фон

Для каждого клиента, то есть строки таблицы Customers, вложенный запрос выдает даты заказов этого клиента. Если дата "2007-12-12" есть среди этих дат, то строка таблицы Customers включается в результат запроса. Таким образом, запрос выводит информацию о тех клиентах, которые сделали заказ 12 декабря 2007 г. Результат этого запроса представлен в табл. 3.11.

Вложенный запрос, результат которого обрабатывается с помощью оператора IN, может возвращать несколько столбцов, но в этом случае и значение слева от оператора должно быть составным с таким же количеством компонентов (составные значения мы рассмотрели в пункте "Оператор х IN (<Список значений>)".

Далее мы разберем ключевые слова ANY и SOME.

ANY, SOME Ключевое слово ANY ("какой-либо") используется совместно с операторами сравнения, описанными в подразделе "Операторы сравнения". При использовании ANY результат сравнения будет верным, если он верен хотя бы для одного из значений, выданных подзапросом. Другими словами, результатом вычисления выражения

x <Оператор сравнения> ANY (<Вложенный запрос>)

может быть одно из следующих значений:

• 1 (TRUE) – если среди выданных подзапросом значений есть хотя бы одно значение y, для которого выполнено условие x <Оператор сравнения> y ;

• 0 (FALSE) – если среди выданных подзапросом значений нет ни одного такого значения y, для которого выражение x <Оператор сравнения> y истинно (TRUE) или не определено (NULL), в том числе, если подзапрос возвращает пустой результат;

• NULL – если среди выданных подзапросом значений нет ни одного такого значения y, для которого выражение x <Оператор сравнения> y истинно TRUE), но в то же время есть одно или несколько значений y, для которых это выражение не определено (NULL).

Например, вывести информацию о клиентах, которые сделали хотя бы один заказ на сумму более 5000, можно с помощью запроса

SELECT * FROM Customers WHERE 5000 < ANY (SELECT amount FROM Orders WHERE Customers.id = customer_id);

Для каждого клиента вложенный подзапрос получает из таблицы Orders (Заказы) суммы заказов (столбец amount) этого клиента. Затем эти суммы сравниваются с величиной 5000, и запись о клиенте попадет в результат запроса, если хотя бы одна из этих сумм превышает 5000. Таким образом, запрос возвращает результат, представленный в табл. 3.11. Отметим, что вложенный запрос может быть только правым операндом для оператора сравнения: например, рассмотренный выше запрос нельзя переписать в виде

SELECT * FROM Customers WHERE

ANY (SELECT amount FROM Orders

WHERE Customers.id = customer_id)

> 5000;

Ключевое слово SOME является синонимом ключевого слова ANY. Далее мы рассмотрим ключевое слово ALL. ALL Ключевое слово ALL ("все"), как и ANY, используется совместно с операторами сравнения, описанными в подразделе "Операторы сравнения". При использовании ALL результат сравнения будет верным, если он верен для всех значений, выданных подзапросом. Другими словами, результатом вычисления выражения

x <Оператор сравнения> ALL <Вложенный запрос>

может быть одно из следующих значений:

• 1 (TRUE) – если условие х <Оператор сравнения> у выполнено для всех у, выданных подзапросом, а также в случае, если подзапрос возвращает пустой результат;

• 0 (FALSE) – если среди выданных подзапросом значений есть такое значение у, для которого выражение х <Оператор сравнения> у ложно (FALSE);

• NULL – в остальных случаях.

Например, запрос

SELECT * FROM Customers WHERE 5000 < ALL (SELECT amount FROM Orders WHERE Customers.id = customer_id);

выведет информацию не только о тех клиентах, у которых в каждом из заказов сумма превышает 5000, но и о тех, кто не сделал ни одного заказа, ведь в последнем случае результат запроса окажется пустым и условие отбора во внешнем запросе будет выполнено. Таким образом, запрос возвращает результат, представленный в табл. 3.15. Чтобы исключить клиентов, для которых нет зарегистрированных заказов, можно ввести дополнительное условие отбора, например

SELECT * FROM Customers

WHERE 5000 < ALL

(SELECT amount FROM Orders

WHERE Customers.id = customer_id)

AND EXISTS

(SELECT amount FROM Orders

WHERE Customers.id = customer_id);

Как и при использовании ключевого слова ANY, в запросе с ключевым словом ANY вложенный запрос может быть только правым операндом для оператора сравнения.

Итак, вы рассмотрели операторы сравнения и научились применять их для обработки результатов вложенных запросов. Теперь перейдем к изучению логических операторов, с помощью которых можно создавать составные условия отбора.

Логические операторы

Логические операторы позволяют построить сложное условие отбора на основе операторов сравнения. Операнды логических операторов рассматриваются как логические значения: TRUE, FALSE и NULL. При этом число 0 и нулевая дата и/или время ("0000-00-00 00:00:00") считаются ложными значениями (FALSE), а отличные от нуля числа и даты – истинными значениями (TRUE) (более подробно об этом рассказывалось в пункте "Оператор х IS у, где у – TRUE, FALSE, UNKNOWN или NULL"). Начнем с изучения оператора AND.

Оператор x AND y

Оператор AND ("и") возвращает следующие значения:

• 1 (TRUE) – если оба операнда – истинные значения;

• 0 (FALSE) – если один или оба операнда – ложные значения;

• NULL – в остальных случаях.

Иными словами, если вы соединили два условия отбора с помощью оператора AND, то составное условие выполняется только тогда, когда выполняются одновременно оба составляющих условия.

Например, запрос

SELECT * FROM Customers WHERE name LIKE \'ООО%\' AND rating>1000;

не выводит ни одной строки. В таблице Customers (Клиенты) есть имена, начинающиеся с "ООО", и рейтинги, превышающие 1000, но ни одна из строк не удовлетворяет обоим этим условиям одновременно.

Пара символов && является синонимом оператора AND. Следующий оператор, который мы рассмотрим, – это оператор OR.

Оператор x OR y

Оператор OR ("или") возвращает следующие значения:

• 1 (TRUE) – если один или оба операнда – истинные значения;

• 0 (FALSE) – если оба операнда – ложные значения;

• NULL – в остальных случаях.

Иными словами, если вы соединили два условия отбора с помощью оператора OR, то составное условие выполняется, если выполняется хотя бы одно из составляющих условий.

Например, запрос

SELECT * FROM Customers WHERE name LIKE \'ООО%\' OR rating>1000;

выводит строки таблицы Customers (Клиенты), в которых имя начинается с "ООО", а также строки, в которых рейтинг больше 1000 (см. табл. 3.6). Пара символов | |является синонимом оператора OR. Следующий оператор, который мы рассмотрим, – это оператор XOR. Оператор x XOR y

Оператор XOR ("исключающее или") возвращает следующие значения:

• 1 (TRUE) – если один из операндов – истинное значение, а другой – ложное;

• 0 (FALSE) – если оба операнда либо истинные значения, либо ложные;

• NULL – если хотя бы один из операндов равен NULL.

Иными словами, если вы соединили два условия отбора с помощью оператора XOR, то составное условие выполняется, если выполняется ровно одно из составляющих условий.

Например, запрос

SELECT * FROM Customers WHERE name LIKE \'ООО%\' XOR rating>500;

выводит строки таблицы Customers, в которых имя начинается с "ООО", а также те строки, в которых рейтинг больше 500, за исключением тех строк, в которых эти условия выполняются одновременно (см. табл. 3.15). Наконец, рассмотрим последний логический оператор – NOT. Оператор NOT x

Оператор NOT ("не", то есть "отрицание") возвращает следующие значения:

• 1 (TRUE) – если операнд – ложное значение;

• 0 (FALSE) – если операнд – истинное значение;

• NULL – если операнд равен NULL.

Иными словами, условие отбора, созданное с помощью оператора NOT, выполняется, если исходное условие не выполнено и не равно NULL.

Например, запрос

SELECT * FROM Customers WHERE NOT (name LIKE \'ООО%\' OR rating>1000);

выводит те строки таблицы Customers, для которых условие name LIKE \'ООО% OR rating>10 0 0 не выполнено и которые, следовательно, не были выведены запросом из пункта "Оператор х OR у". Таким образом, запрос возвращает результат, представленный в табл. 3.1.

Завершая изучение операторов и функций проверки условий, обсудим еще несколько функций, используемых для сравнения различных величин. Эти функции отличаются от операторов, рассмотренных в подразделе "Операторы сравнения", тем, что возвращаемое ими значение не обязательно логическое.

Операторы и функции, основанные на сравнении

В этом подразделе я кратко расскажу об операторах и функциях, которые, как и операторы из подраздела "Операторы сравнения", сравнивают две или несколько величин, однако возвращают не логическое значение (TRUE, FALSE или NULL), а один из своих аргументов (или порядковый номер аргумента). Рассмотрим эти функции.

• LEAST( a 1, a 2,…, an )

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке

Скачать книгу

Если нет возможности читать онлайн, скачайте книгу файлом для электронной книжки и читайте офлайн.

fb2.zip txt txt.zip rtf.zip a4.pdf a6.pdf mobi.prc epub