Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯЗЫК SQL.doc
Скачиваний:
17
Добавлен:
16.11.2018
Размер:
903.17 Кб
Скачать

Is null

Предикат IS null применяется для выявления записей, в кото­рых тот или иной столбец не имеет значения. Например, для получения записей о клиентах, для которых не указан адрес, можно использовать следующее выражение:

SELECT Имя, Адрес, Регион FROM Клиенты

WHERE Адрес IS NULL;

Для получения записей, в которых столбец Адрес содержит не­которые определенные значения (т. е. отличные от null), можно использовать аналогичное выражение, но с логическим операто­ром not (не):

SELECT Имя, Адрес, Регион FROM Клиенты

WHERE Адрес IS NOT NULL;

Не следует использовать предикаты сравнения с null, такие как

Адрес = NULL.

Предикаты для вложенных запросов

В выражении where, кроме перечисленных предикатов, могут также использоваться выражения с оператором select.

Любое выражение, начинающееся с оператора select, является запро­сом к базе данных. Если в выражении встречается еще хотя бы один оператор select, то он задает запрос, вложенный в пер­вый. Вложенные запросы также называют подзапросами.

Вложенный запрос является обычным запросом, таким же, как и рассмотренные ранее. Он возвращает таблицу (набор записей), которая, так или иначе, используется для формирования ответа на основной запрос.

Так, например, подзапрос используется, когда для выборки данных в одной таблице необходимо выполнить проверки по другой таблице. Для этой цели подходят пере­численные далее специальные предикаты.

ALL, SOME, ANY

Предикаты all (все), soМe (некоторый), any (любой) в действи­тельности представляют собой кванторы, известные в математи­ческой логике как кванторы всеобщности и существования. all — квантор всеобщности, a some и any, являющиеся синони­мами в SQL, — кванторы существования. Заметим, что в пере­воде на русский слово any следовало бы понимать как квантор всеобщности ("любой" означает "все"), однако в английском языке есть различные варианты значений этого слова.

Применение ключевого слова all следует понимать как "для всех" или "для каждого". Ключевые слова some и any следует по­нимать как "хотя бы какой-нибудь один".

Как бы то ни было, в языке SQL ключевые слова some и any имеют одинаковый смысл, отличающийся от all.

Примечание

Выражения с ключевыми словами all, some (any) соответствуют логическим выражениям с кванторами и, как таковые, могут назы­ваться предикатами.

EXISTS

Обработка данных часто состоит из нескольких этапов. Так, снача­ла производится некоторая выборка данных, а затем выполняются какие-то манипуляции с ней.

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

Таким об­разом, полезно знать, содержит ли ответ на запрос какие-либо дан­ные. Для этого предназначен предикат exists (существует).

Он становится истинным только тогда, кода результатная таблица, по­лученная в ответ на запрос, содержит хотя бы одну запись.

UNIQUE

Предикат unique (уникальный) имеет такой же смысл, как и exists, но при этом для его истинности требуется, чтобы все записи в результатной таблице не только существовали, но и были уникальны (т. е. не повторялись).

DISTINCT

Предикат distinct (отличающийся, особый) почти такой же, как и unique. Отличие этих предикатов обнаруживается приме­нительно к значениям null.

Так, если в результатной таблице все записи уникальны (предикат unique истинен), то и предикат distinct тоже истинен (т. е. если все записи уникальны, то они и отличающиеся).

С другой стороны, если в результатной табли­це имеются хотя бы две неопределенные записи, то предикат distinct ложен, хотя предикат unique истинен.

OVERLAPS

Предикат overlaps (перекрывает) используется для определе­ния, перекрываются ли два интервала времени.

Интервал време­ни можно задать двумя способами: в виде начального и конеч­ного моментов или в виде начального момента и длительности.

Далее приведены примеры задания интервала времени:

  • (time 42:25:30', time ' 14: з0:00') — интервал, заданный начальным и конечным моментами;

  • (TIME 42:45:00', INTERVAL '2' HOUR) — интервал, заданный начальным моментом и длительностью в часах.

Выражение с предикатом overlaps можно записать, например, так:

(TIME 42:25:30', TIME 44:30:00') OVERLAPS (TIME 42:45:00', INTERVAL '2' HOUR)

Поскольку временные интервалы в данном примере пересекают­ся, то предикат overlaps возвращает значение true.

MATCH

Предикат match применяется для проверки сохранения ссылоч­ной целостности при модификации данных, т. е. при добавле­нии, изменении и удалении записей.

SIMILAR

Предикат similar (подобный) применяется для проверки час­тичного соответствия символьных строк. Эту же задачу можно решить и с помощью предиката like, однако в ряде случаев similar более эффективен.

Предположим, что в некоторой таблице имеется столбец ОС, со­держащий названия операционных систем. Нужно выбрать записи, соответствующие Windows NT, Windows XP и Windows 98. Тогда в выражении запроса можно использовать такой оператор where:

WHERE ОС SIMILAR TO '(Windows (NT|XP|98))';

Предикат впервые появился в SQL: 1999.

Оператор GROUP BY

Оператор group by (группировать по) служит для группировки записей по значениям одного или нескольких столбцов. Если в SQL-выражении используется оператор where, задающий фильтр записей, то оператор group by находится и выполняется после него.

Для определения, какие записи должны войти в группы, служит оператор having, используемый совместно с group by. Если оператор having не применяется, то груп­пировке подлежат все записи, отфильтрованные оператором where.

Если where не используется, то группируются все записи исходной таблицы.

Допустим, что на основе таблицы о клиентах тре­буется сгруппировать данные о суммах заказов клиентов по ре­гионам. Для этого можно воспользоваться следующим SQL-выражением:

SELECT Регион, Сумма_заказа FROM Клиенты

GROUP BY Регион;

Чтобы получить таблицу, в которой суммы заказов подытожены по регионам, потребуется использовать итоговую функцию sum () и группировку по регионам:

SELECT Регион, SUМ(Сумма_заказа) FROM Клиенты

GROUP BY Регион;

Здесь в выражении select указаны обычный столбец таблицы клиенты и итоговая функция sum (), вычисляющая сумму значе­ний столбца Сумма_заказа.

Поскольку группировка задана по столбцу Регион, то функция sum (Сумма_заказа) вычисляет сум­мы значений столбца Сумма_заказа для каждого значения столбца Регион.

Оператор grodp by собирает записи в группы и упорядочивает (сортирует) группы по алфавиту (точнее, по ASCII-кодам симво­лов).

Это обстоятельство следует иметь в виду перед тем, как принять решение об использовании оператора сортировки order by.

Оператор НАVING

Оператор having (имеющие, при условии) обычно применяется совместно с оператором группировки group by и задает фильтр записей в группах. Правила его формирования такие же, что и для оператора where.

Предположим, что из таблицы Клиенты требуется выбрать дан­ные о регионах и суммах заказов, сгруппированные по регионам и такие, в которых сумма заказа превышает 500. Иначе говоря, требуется сгруппировать данные с ограничением записей, вхо­дящих в группы. Запрос, выполняющий это задание, имеет вид:

SELECT Регион, Сумма_заказа FROM Клиенты

GROUP BY Регион, Сумма_заказа

HAVING Сумма_заказа > 500;

Если в SQL-выражении оператора group by нет, то оператор having применяется ко всем записям, возвращаемым операто­ром where. Если же отсутствует и where, то having действует на все записи таблицы.

Оператор ORDER BY

Оператор order by (сортировать по) применяется для упорядо­чивания (сортировки) записей. Если он используется в запросе, то в самом конце запроса.

Этот оператор сортирует строки всей таблицы или отдельных ее групп (в случае применения операто­ра group by). Если в выражении запроса оператора group by нет, то оператор order by рассматривает все записи таблицы как одну группу.

Вслед за ключевым словом order by указывается столбец, по значениям которого следует произвести сортировку. После име­ни столбца можно указать ключевое слово, задающее порядок (режим) сортировки:

  • asc по возрастанию (ascending). Это значение принято по умолчанию, поэтому если необходима сортировка, например, в алфавитном порядке, то специально указывать порядок не требуется;

  • descпо убыванию (descending).

Если в выражении order by указаны несколько столбцов, сорти­ровки, то сначала записи упорядочиваются по значениям пер­вого столбца, затем для каждого значения первого столбца запи­си упорядочиваются по значениям второго столбца и т. д.

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

В следующем примере данные исходной таблицы клиенты сортируются по регионам и по именам клиентов. При этом сортировка по именам клиентов производится по убыва­нию, т. е. в порядке, противоположном алфавитному.

SELECT * FROM Клиенты

ORDER BY Регион, Имя DESC;

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

Логические выражения в операторах where и having могут быть сложными, т. е. состоять из двух и более простых выражений, соединенных между собой логическими операторами (союзами) and и/или or.

Оператор and выполняет роль логического союза И, а оператор or — союза ИЛИ.

Так, если х и у — два логиче­ских выражения, то составное выражение х and у принимает-значение true (ИСТИНА) только тогда, когда х и у одновре­менно истинны; в противном случае выражение х and у при­нимает значение false (ЛОЖЬ).

Выражение х or у истинно, если хотя бы одно из выражений, х или у, истинно; если х и у одновременно ложны, то составное выражение х or у ложно.

Логический оператор not применяется к одному выражению (возможно и к сложному), расположенному справа от него. Этот оператор меняет значение выражения на противоположное. Так, если выражение х имеет значение true, то выражение not x име­ет значение false, и, наоборот, если х ложно, то not x истинно.

Предположим, из таблицы клиенты требуется вы­брать записи о клиентах из Москвы и Северо-запада. Соответст­вующий запрос имеет вид:

SELECT Регион, Имя, Сумма_заказа FROM Клиенты

WHERE Регион='Москва' OR Регион='Северо-запад';

Обратите внимание, что здесь используется логический оператор or (ИЛИ), а не and (И), поскольку нам нужны клиенты, прожи­вающие или в Москве, или на Северо-западе. Если бы вместо оператора or мы применили and, то получили бы пустую табли­цу, т. к. в исходной таблице нет ни одной записи, в которой один и тот же столбец имел бы различные значения.

Следующее SQL-выражение эквивалентно рассмотренному ра­нее. Оно основано на применении оператора in:

SELECT Регион, Имя, Сумма_заказа FROM Клиенты

WHERE Регион IN ('Москва', 'Северо-запад');

Если требуется получить данные о всех клиентах, которые не проживают ни в Москве, ни на Северо-западе, то можно ис­пользовать такое SQL-выражение:

SELECT Регион, Имя, Сумма_заказа FROM Клиенты

WHERE NOT (Регион='Москва' OR Регион='Северо-запад');

Это выражение эквивалентно следующим двум:

SELECT Регион, Имя, Сумма__заказа FROM Клиенты

WHERE Регион О 'Москва' AND Регион о 'Северо-запад';

и:

SELECT Регион, Имя, Сумма_заказа FROM Клиенты

WHERE Регион NOT IN ('Москва', 'Северо-запад');

Вычисления

В выражениях SQL-запросов нередко требуется выполнить пред­варительную обработку данных. С этой целью используются специальные функции и выражения.

Итоговые функции

Довольно часто требуется узнать, сколько записей соответствует тому или иному запросу, какова сумма значений некоторого чи­слового столбца, его максимальное, минимальное и среднее зна­чения. Для этого служат так. называемые итоговые (статистиче­ские, агрегатные) функции.

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

Далее приведен список итоговых функций.

count (параметр) — возвращает количество записей, указан­ных в параметре. Если требуется получить количество всех записей, то в качестве параметра следует указать символ звез­дочки (*). Если в качестве параметра указать имя столбца, то функция вернет количество записей, в которых этот столбец имеет значения, отличные от null. Чтобы узнать, сколько различных значений содержит столбец, перед его именем следует указать ключевое слово distinct.

Например:

SELECT COUNT(*) FROM Клиенты;

SELECT COUNT(Сумма_заказа) FROM Клиенты;

SELECT COUNT (DISTINCT Сумма_ заказа) FROM Клиенты;

sum (параметр) — возвращает сумму значений указанного в параметре столбца. Параметр может представлять собой и выражение, содержащее имя столбца.

Например:

SELECT sum (Сумма_заказа) FROM Клиенты;

Данное SQL-выражение возвращает таблицу, состоящую из одного столбца и одной записи и содержащую сумму всех определенных значений столбца Сумма_заказа из таблицы Клиенты.

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

Если текущий обменный курс ра­вен, например, 27,8, то получить требуемый результат можно с помощью выражения:

SELECT sum (Сумма_заказа*27.8) FROM Клиенты;

avg (параметр) — возвращает среднее арифметическое всех значений указанного в параметре столбца. Параметр может представлять собой выражение, содержащее имя столбца.

Например:

SELECT avg (Сумма_заказа) FROM Клиенты;

SELECT avg (Сумма_заказа*27.8) FROM Клиенты

WHERE Регион <> 'Северо_запад';

мах (параметр) — возвращает максимальное значение в столб­це, указанном в параметре. Параметр может также представ­лять собой выражение, содержащее имя столбца.

Например:

SELECT МАХ(Сумма_заказа) FROM Клиенты;

SELECT МАХ(Сумма_заказа*27.8) FROM Клиенты

WHERE Регион <> 'Северо_запад';

min (параметр) — возвращает минимальное значение в столб­це, указанном в параметре. Параметр может представлять со­бой выражение, содержащее имя столбца.

Например:

SELECT MIN(Сумма_заказа) FROM Клиенты;

SELECT MIN (Сумма_заказа*27.8) FROM Клиенты

WHERE Ре­гион <> 'Северо_запад';

На практике нередко требуется получить итоговую таблицу, со­держащую суммарные, усредненные, максимальные и минималь­ные значения числовых столбцов. Для этого следует использовать группировку (group by) и итоговые функции:

SELECT Регион, sum (Сумма_заказа) FROM Клиенты

GROUP BY Регион;

Результатная таблица для данного запроса содержит имена регионов и итоговые (общие) суммы заказов всех клиентов из соответствующих регионов. Теперь рассмотрим запрос на получение всех итоговых данных по регионам:

SELECT Регион, sum (Сумма_заказа), AVG(Сумма_заказа), МАХ(Сумма_заказа) , MIN(Сумма_заказа)

FROM Клиенты

GROUP BY Регион;

При использовании итоговых функций в списке столбцов в опе­раторе select заголовки соответствующих им столбцов в резуль­татной таблице имеют вид Expr1001, Ехрг1002 и т. д. (или что-нибудь аналогичное, в зависимости от реализации SQL). Однако заголовки для значений итоговых функций и других столбцов вы можете задавать по своему усмотрению. Для этого достаточно после столбца в операторе select указать выражение вида:

AS заголовок столбца

Ключевое слово as (как) означает, что в результатной таблице соответствующий столбец должен иметь заголовок, указанный после as. Назначаемый заголовок еще называют псевдонимом.

В следующем примере задаются псевдонимы для всех вычисляемых столбцов:

SELECT Регион,sum (Сумма_заказа) AS [Общая сумма заказа],

avg (Сумма_заказа) AS [Средняя сумма заказа],

МАХ(Сумма заказа) AS Максимум,

MIN (Сумма_заказа) AS Минимум

FROM Клиенты

GROUP BY Регион;

Псевдонимы, состоящие из нескольких слов, разделенных про­белами, заключаются в квадратные скобки. Итоговые функции можно использовать в выражениях select и having, но их нельзя применять в выpaжeни where. Оператор having аналогичен оператору where, но в отличие от where он отбирает записи в группах.

Допустим, требуется определить, в каких регионах более одного клиента. С этой целью можно воспользоваться таким запросом:

SELECT Регион, Count(*)

FROM Клиенты

GROUP BY Регион HAVING COUNT(*) > 1;

Функции обработки значений

При работе с данными часто приходится их обрабатывать (пре­образовывать к нужному виду): выделить в строке некоторую подстроку, удалить ведущие и заключительные пробелы, округ­лить число, вычислить квадратный корень, определить текущее время и т. п. В SQL имеются следующие три типа функций:

  • строковые функции;

  • числовые функции;

  • функции даты-времени.