SQLГлава 5. Использование специальных операторов в условиях
В дополнение к реляционным и булевым операциям, обсуждённым в Главе 4, SQL использует специальные операторы: Оператор IN
Оператор SELECT * FROM Salespeople WHERE city = 'Barcelona' OR city = 'London'; Имеется и более простой способ получить ту же информацию: SELECT * FROM Salespeople WHERE city IN ('Barcelona', 'London'); Вывод для этого запроса показан на Рисунке 5.2. =============== SQL Execution Log ============ | | | SELECT * | | FROM Salespeople | | WHERE city = 'Barcelona' | | OR city = 'London'; | |===============================================| | snum sname city comm | | ------ ---------- ----------- ------- | | 1001 Peel London 0.12 | | 1004 Motika London 0.11 | | 1007 Rifkin Barcelona 0.15 | =============================================== Рисунок 5.1 Нахождение продавцов в Барселоне и Лондоне =============== SQL Execution Log ============ | | | SELECT * | | FROM Salespeople | | WHERE city IN ('Barcelona', 'London'; | |===============================================| | snum sname city comm | | ------ ---------- ----------- ------- | | 1001 Peel London 0.12 | | 1004 Motika London 0.11 | | 1007 Rifkin Barcelona 0.15 | =============================================== Рисунок 5.2 SELECT использует IN
Как видите, SELECT * FROM Customers WHERE snum IN (1001, 1007, 1004); =============== SQL Execution Log ============ | SELECT * | | FROM Customers | | WHERE snum IN ( 1001, 1007, 1004 ); | | ============================================= | | snum cname city rating snum | | ------ -------- ------ ---- ------ | | 2001 Hoffman London 100 1001 | | 2006 Clemens London 100 1001 | | 2008 Cisneros San Jose 300 1007 | | 2007 Pereira Rome 100 1004 | =============================================== Рисунок 5.3 SELECT использует IN с номерами Оператор BETWEEN
Оператор SELECT * FROM Salespeople WHERE comm BETWEEN .10 AND .12;
Для оператора =============== SQL Execution Log ============ | SELECT * | | FROM Salespeople | | WHERE comm BETWEEN .10 AND .12; | |===============================================| | snum sname city comm | | ------ ---------- ----------- ------- | | 1001 Peel London 0.12 | | 1004 Motika London 0.11 | | 1003 Axelrod New York 0.10 | =============================================== Рисунок 5.4 SELECT с BETWEEN
SQL не делает непосредственной поддержки невключения граничных значений SELECT * FROM Salespeople WHERE (comm BETWEEN .10, AND .12) AND NOT comm IN (.10, .12); Вывод для этого запроса показан на Рисунке 5.5. =============== SQL Execution Log ============ | | | SELECT * | | FROM Salespeople | | WHERE (comm BETWEEN .10 AND .12) | | AND NOT comm IN (.10 .12); | | ==============================================| | snum sname city comm | | ------ ---------- ----------- ------- | | 1004 Motika London 0.11 | =============================================== Рисунок 5.5 Сделать BETWEEN с невключением По общему признанию, это немного неуклюже, но зато показывает, как эти новые операторы могут комбинироваться с булевыми операциями, чтобы производить более сложные предикаты.
В основном вы используете
Также, подобно реляционным операциям, Этот запрос выбирает всех заказчиков, чьи имена попали в определенный алфавитный диапазон: SELECT * FROM Customers WHERE cname BETWEEN 'A' AND 'G'; Вывод для этого запроса показан на Рисунке 5.6. =============== SQL Execution Log ============ | | | SELECT * | | FROM Customers | | WHERE cname BETWEEN 'A' AND 'G'; | | ============================================= | | cnum cname city rating snum | | ------ -------- ------ ---- ------ | | 2006 Clemens London 100 1001 | | 2008 Cisneros San Jose 300 1007 | =============================================== Рисунок 5.6 Использование BETWEEN в алфавитных порядках
Обратите внимание, что Оператор LIKE
Имеются два типа шаблонов, используемых с LIKE:
Давайте найдём всех заказчиков, чьи имена начинаются с SELECT FROM Customers WHERE cname LIKE 'G%'; =============== SQL Execution Log ============ | | | SELECT * | | FROM Customers | | WHERE cname LIKE 'G'; | |===============================================| | cnum cname city rating snum | | ------ -------- ------ ---- ------ | | 2002 Giovanni Rome 200 1003 | | 2004 Grass Berlin 300 1002 | =============================================== Рисунок 5.7 SELECT использует LIKE с %
LIKE может быть удобен, если вы ищете имя или другое значение и если вы не помните, как они точно пишутся. Предположим, что вы не уверены, как записано по буквам имя одного из ваших продавцов — SELECT * FROM Salespeople WHERE sname LIKE 'P__l%';
Группа символов подчёркивания, каждый из которых представляет один символ, добавит только два символа к уже существующим =============== SQL Execution Log ============ | | | SELECT * | | FROM Salespeople | | WHERE sname LIKE 'P__l%'; | |===============================================| | snum sname city comm | | ------ ---------- ----------- ------- | | 1001 Peel London 0.12 | =============================================== Рисунок 5.8 SELECT использует LIKE с подчёркиванием (_)
А что вы будете делать, если вам нужно искать символ процента или символ подчёркивания в строке? В SELECT * FROM Salespeople WHERE sname LIKE '%/_%' ESCAPE '/';
С этими данными не будет никакого вывода, потому что мы не включили никакого подчёркивания в имя нашего продавца. Ключевое слово
Символ В примере выше, символ процента начала и символ процента окончания обрабатываются как групповые символы; только подчёркивание представлено как сам символ.
Как упомянуто выше, символ
Вот предыдущий пример, который пересмотрен, чтобы найти местонахождение строки SELECT * FROM Salespeople WHERE sname LIKE '%/_//%' ESCAPE '/'; Снова не будет никакого вывода с такими данными. Строка сравнивается с содержанием любой последовательности символов ( % ), сопровождаемых символом подчёркивания ( /_ ), символом ESC ( // ) и любой последовательностью символов в конце строки ( % ). Работа со значениями NULL
Часто в таблице будут записи, которые не имеют никаких значений поля, например, потому что информация не завершена, или потому что это поле просто не заполнялось. SQL учитывает такой вариант, позволяя вам вводить значение
Это отличается от просто назначения полю значения нуль или пробела, которые база данных будет обрабатывать так же, как и любое другое значение. Точно так же как
Предположим, что вы получили нового заказчика, который ещё не был назначен продавцу. Чем ждать продавца, к которому его нужно назначить, вы можете ввести заказчика в базу данных теперь же, так что он не потеряется при перестановке. Вы можете ввести строку для заказчика со значением Оператор IS NULL
Так как
Следовательно, выражение типа
Часто вы должны отличать неверно и неизвестно между строками, содержащими значения столбцов, которые не соответствуют условию предиката и которые содержат Найдём все записи в нашей таблице Заказчиков с SELECT * ROM Customers WHERE city IS NULL;
Здесь не будет никакого вывода, потому что мы не имеем никаких значений Использование NOT со специальными операторамиОперанды могут непосредственно предшествовать булеву
Это противоположно реляционным операциям, когда оператор SELECT * FROM Customers WHERE city NOT NULL;
При отсутствии значений SELECT * FROM Customers WHERE NOT city IS NULL; что также приемлемо. Мы можем также использовать SELECT * FROM Salespeople WHERE city NOT IN ('London', 'San Jose'); А вот другой способ подобного же выражения: SELECT * FROM Salespeople WHERE NOT city IN ('London', ' San Jose'); Вывод для этого запроса показан на Рисунке 5.9.
Таким же способом вы можете использовать =============== SQL Execution Log ============ | | | SELECT * | | FROM Salespeople | | WHERE сity NOT IN ('London', 'San Jose';) | |===============================================| | snum sname city comm | | ------ ---------- ----------- ------- | | 1003 Rifkin Barcelona 0.15 | | 1007 Axelrod New York 0.10 | =============================================== Рисунок 5.9 Использование NOT с IN Резюме
Теперь вы можете создавать предикаты в терминах связей, специально определённых в SQL. Вы можете искать значения в определённом диапазоне (
Вы также изучили кое-что о том, как SQL поступает при отсутствии данных (а это реально), используя Теперь, когда вы имеете в вашем распоряжении весь набор стандартных математических и специальных операторов/операций, вы можете переходить к специальным функциям SQL, которые работают на всех группах значений, а не просто на одиночном значении, что важно. Это уже тема Главы 6. Работа с SQL
См. ответы вПриложении A. |
||