
- •Язык запросов sql
- •Просмотр только определенного столбца таблицы
- •Переупорядочение столбца
- •Удаление избыточных данных
- •Квалифицированный выбор при использовании предложений
- •Использование специальных операторов в условиях.
- •In и between используются также, как и реляционные операторы, чтобы сравнивать значения, которые берутся либо из набора ( для in ) либо из диапазона ( для between ).
- •Работа с нулевыми( null ) значениями
- •Использование not со специальными операторами
- •Обобщение данных с помощью агрегатных функций
- •Включение дубликатов в агрегатные функции
- •Агрегаты построенные на скалярном выражении
- •Предложение group by
- •Предложение having
- •Формирование выводов запросов
- •Упорядочение вывода по номеру столбца
- •Упорядочение с помощью опретора null
Использование специальных операторов в условиях.
В ДОПОЛНЕНИИ К РЕЛЯЦИОННЫМ И БУЛЕВСКИМ операторам SQL использует специальные операторы IN, BETWEEN, LIKE, и IS NULL.
Обсуждение оператора IS NULL будет включать отсутствие данных и значение NULL, которое указывает на то: что данные отсутствуют. Вы также узнаете о разновидностях использования оператора NOT применяющегося с этими операторами.
========== ОПЕРАТОР IN ===============
Оператор IN определяет набор значений, в которое данное значение может или не может быть включено. Если вы хотите найти всех продавцов, которые размещены в Barcelona или в London, вы должны использовать следующий запрос
SELECT *
FROM Salespeople
WHERE city = 'Barcelona'
OR city = 'London';
Имеется и более простой способ получить ту же информацию:
SELECT *
FROM Salespeople
WHERE city IN ( 'Barcelona', 'London' );
IN определяет набор значений с помощью имен членов набора, заключенных в круглые скобки и отделенных запятыми. Он затем проверяет различные значения указанного поля, пытаясь найти совпадение со значениями из набора. Если это случается, то предикат верен. Когда набор содержит значения номеров, а не символов, одиночные кавычки опускаются.
SELECT *
FROM Customers
WHERE cnum IN ( 1001, 1007, 1004 );
=========== ОПЕРАТОР BETWEEN ==========
Оператор BETWEEN похож на оператор IN. В отличие от определения по номерам из набора, как это делает IN, BETWEEN определяет диапазон. Вы должны ввести ключевое слово BETWEEN с начальным значением, ключевое AND и конечное значение. В отличие от IN, BETWEEN чувствителен к порядку, и первое значение в предложении должно быть первым по алфавитному или числовому порядку. Следующий пример будет извлекать из таблицы Продавцов всех продавцов с комиссионными между 0.10 и 0.12:
SELECT *
FROM Salespeople
WHERE comm BETWEEN 0.10 AND 0.12;
Для включенного оператора BETWEEN, значение совпадающее с любым из двух значений границы ( в этом случае, 0.10 и 0.12 ) заставляет предикат быть верным.
SQL не делает непосредственной поддержки невключения BETWEEN. Вы должны или определить ваши граничные значения так, чтобы включающая интерпретация была приемлема, или сделать что-нибудь типа этого:
SELECT *
FROM Salespeople
WHERE ( comm BETWEEN 0.10, AND 0.12 )
AND NOT comm IN ( 0.10, 0.12 );
In и between используются также, как и реляционные операторы, чтобы сравнивать значения, которые берутся либо из набора ( для in ) либо из диапазона ( для between ).
Также, подобно реляционным операторам, BETWEEN может работать с символьными полями в терминах эквивалентов ASCII. Это означает, что вы можете использовать BETWEEN, чтобы выбирать ряд значений из упорядоченных по алфавиту значений.
Этот запрос выбирает всех заказчиков чьи имена попали в определенный алфавитный диапазон:
SELECT *
FROM Customers
WHERE cname BETWEEN 'A' AND 'G';
Обратите Внимание что Grass и Giovanni отсутствуют, даже при включенном BETWEEN. Это происходит из-за того, что BETWEEN сравнивает строки неравной длины. Строка 'G' более короткая, чем строка Giovanni, поэтому BETWEEN выводит 'G' с пробелами. Пробелы предшествуют символам в алфавитном порядке (в большинстве реализаций), поэтому Giovanni не выбирается. То же самое происходит с Grass. Важно помнить это когда вы используете BETWEEN для извлечения значений из алфавитных диапазонов.
============ ОПЕРАТОР LIKE =============
LIKE применим только к полям типа CHAR или VARCHAR, с которыми он используется, чтобы находить подстроки. Т.е. он ищет поле символа, чтобы видеть, совпадает ли с условием часть его строки. В качестве условия он использует групповые символы - специальные символы, которые могут соответствовать чему-нибудь. Имеются два типа групповых символов используемых с LIKE:
символ подчеркивания ( _ ) замещает любой одиночный символ. Например, 'b_t' будет соответствовать словам 'bat' или 'bit', но не будет соответствовать 'brat'.
знак процента (%) замещает последовательность любого числа символов (включая символы нуля). Например '%p%t' будет соответствовать словам 'put', 'posit', или 'opt', но не 'spite'.
[НаборСимволов] - Любой одиночный символ, входящий в список НаборСимволов
[^НаборСимволов] - Любой одиночный символ, не входящий в список НаборСимволов
Синтаксис директивы WHERE с ключевым словом LIKE имеет следующий вид:
SELECT список_столбцов
FROM список_таблиц
WHERE имя_столбца [NOT] LIKE 'строка';
Строка в директиве LIKE, содержащая групповые символы, заключается в одинарные кавычки.
Давайте найдем всех заказчиков чьи имена начинаются с:
SELECT *
FROM Customers
WHERE cname LIKE 'G%';
============================================= |
| cnum cname city rating snum |
| ------ -------- ------ ---- ------ |
| 2002 Giovanni Rome 200 1003 |
| 2004 Grass Berlin 300 1002 |
| |
=============================================
LIKE может быть удобен, если вы ищете значения и не помните, как они точно пишутся. Предположим, что вы неуверенны, как записано по буквам имя одного из ваших продавцов Peal или Peel. Вы можете просто использовать ту часть которую вы знаете и групповые символы чтобы находить все возможные:
SELECT *
FROM Salespeople
WHERE sname LIKE 'P _ _ l %';
Групповой символ ' % ' - в конце строки необходим в большинстве реализаций, если длина поля sname больше чем число символов в имени Peel (потому что некоторые другие значения sname - длиннее чем четыре символа ). В таком случае, значение поля sname, фактически сохраняемое как им Peel, сопровождается рядом пробелов. Следовательно, символ 'l' не будет рассматриваться концом строки. Групповой символ ' % ' - просто соответствует этим пробелам. Это необязательно, если пол sname имеет тип - VARCHAR.
=============== SQL Execution Log ============
| |
| SELECT * |
| FROM Salespeople |
| WHERE sname LIKE ' P 1% '; |
| ==============================================|
| snum sname city comm |
| ------ ---------- ----------- ------- |
| 1001 Peel London 0.12 |
| |
===============================================
А что же Вы будете делать, если вам нужно искать знак процента или знак подчеркивания в строке? В LIKE предикате, вы можете определить любой одиночный символ как символ ESC. Символ ESC используется сразу перед процентом или подчеркиванием в предикате, и означает, что процент или подчеркивание будет интерпретироваться как символ а не как групповой символ. Например, мы могли бы найти sname столбец, где присутствует подчеркивание, следующим образом:
SELECT *
FROM Salespeople
WHERE sname LIKE '%/_%'ESCAPE'/';
С этими данными не будет никакого вывода, потому что мы не включили никакого подчеркивания в имя нашего продавца. Предложение ESCAPE определяет '/ ' как символ ESC. Символ ESC используемый в LIKE строке, сопровождается знаком процента, знаком подчеркивания, или знаком ESCAPE, который будет искаться в столбце, а не обрабатываться как групповой символ. Символ ESC должен быть одиночным символом и применяться только к одиночному символу сразу после него.
В примере выше, символ процента начала и символ процента окончания обрабатываются как групповые символы; только подчеркивание предоставлено само себе.
Как упомянуто выше, символ ESC может также использоваться самостоятельно. Другими словами, если вы будете искать столбец с вашим символом ESC, вы просто вводите его дважды. Во-первых, это будет означать, что символ ESC "берет следующий символ буквально как символ", и, во-вторых, что символ ESC самостоятелен. Имеется предыдущий пример, который пересмотрен, чтобы искать местонахождение строки '_/' в sname столбце:
SELECT *
FROM Salespeople
WHERE sname LIKE ' % /_ / / %'ESCAPE'/';
Снова не будет никакого вывода с такими данными. Строка сравнивается с содержанием любой последовательности символов (%), сопровождаемых символом подчеркивания ( /_ ), символом ESC ( // ), и любой последовательностью символов в конце строки ( % ).