WHERE сумма_заказа BETWEEN 100 AND 750




строковый (символьный):

1. • CHARACTER (ИЛИ CHAR);

2. • CHARACTER VARYING (ИЛИ VARCHAR))

3. • CHARACTER LARGE ОВJЕСТ (ИЛИ CLOB);

ЧИСЛОВОЙ:

точные числовые типы:

1. INTEGER;

2. SMALLINT;

3. BIGINT;

4. NUMERIC;

5. DECIMAL;

приблизительные числовые типы:

1. REAL;

2. DOUBLE PRECISION;

3. FLOAT;

логический (булевский) — BOOLEAN;

даты-времени:

1. • DATE;

2. • TIME WITHOUT TIME ZONE;

3. • TIME WITH TIME ZONE;

4. TIMESTAMP WITHOUT TIME ZONE;

5. TIMESTAMP WITH TIME ZONE;

интервальный.

Интервалы

1. YEAR — год;

2. MONTH — месяц;

3. DAY — день;

4. HOUR — час;

5. MINUTE — минута;

6. SECOND — секунда.

Кроме того, существуют особые типы:

Row (запись),

ARRAY (массив) и

MULTISET (мультимножество).

В следующем примере на основе типа ROW создается тип addr, а затем он назначается столбцу Адре с при создании таблицы клиенты.

CREATE ROW TYPE addr

(PostCode VARCHAR (9),

City VARCHAR (30),

Street VARCHAR (30),

House VARCHAR (10));

CREATE TABLE клиенты

( ID_клиента INTEGER PRIMARY KEY,

Имя VARCHAR (2 5),

Адрес addr,

Телефон VARCHAR (15) );

 

Пример, в котором каждая ячейка столбца телефон может содержать до трех номеров телефона:

CREATE TABLE Клиенты (

ID_клиента INTEGER PRIMARY KEY,

Имя VARCHAR (2 5),

Адрес addr,

Телефон VARCHAR (15) ARRAY [3]);

 

Следующее SQL-выражение добавляет в таблицу клиенты новую запись и вводит в нее значения столбцов:

INSERT INTO Клиенты (Имя, Телефон)

VALUES ('Петров Петр Петрович', ('444-4444', '123-4567',

'777-8899'));

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

(User Defined Types, UDT)

 

Отдельные типы

Синтаксис создания отдельного типа данных такой:

CREATE DISTINCT TYPE имяТипа AS определенныйТип;

Определим в качестве примера тип MONEY для хранения денежных сумм. С этой целью можно воспользоваться уже определенным

числовым типом DECIMAL:

CREATE DISTINCT TYPE MONEY AS DECIMAL (9,2);

По аналогии с типом MONEY можно создать типы данных для различных валют, чтобы исключить возможность сравнения их просто как обычных чисел:

CREATE DISTINCT TYPE EURO AS DECIMAL (9,2);

CREATE DISTINCT TYPE USD AS DECIMAL (9,2);

CREATE DISTINCT TYPE RU AS DECIMAL (9,2);

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

UPDATE Прайс_лист SET Цена_RU = k * Цена_USD

Здесь k — коэффициент конвертации.

Но поскольку столбцы цена_USD и цена_RU имеют различные типы, то необходимо выполнить такое выражение:

UPDATE Прайс_лист

SET CAST(Цена_RU AS DECIMAL (9,2) = k * CAST(Цена_USD

AS DECIMAL (9,2));

Структурированные типы

При создании структурированного типа СУБД автоматически создает для него три функции:

· функцию-конструктор с именем, совпадающим с именем создаваемого типа;

· функцию-мутатор, с помощью которой можно изменить значение атрибута создаваемого типа;

· функцию-наблюдатель, позволяющую узнать значение атрибута создаваемого типа.

.

Рассмотрим пример, в котором создаются некий тип и его подтип данных, таблица со столбцом созданного типа, а также блок операторов SQL, которые производят изменения данных в таблице. Вначале создадим тип данных Book, содержащий сведения (атрибуты) о книгах, затем создадим его подтип myBooks, который наследует атрибуты своего супертипа Books.

CREATE TYPE Books AS

Title CHAR (50),

Author CHAR (20),

Publisher CHAR (20),

Year INTEGER,

Volume INTEGER,

N0T FINAL;

Здесь в типе Books (книги) определяются атрибуты (имена и типы данных):

Title (наименование), Author (автор), Publisher (издательство), Year (год издания), Volume (количество страниц). Ключевые слова N0T FINAL (не конец) означают, что данный тип имеет хотя бы один подтип.

Определим подтип myBooks для хранения данных, например, о моих любимых книгах:

CREATE TYPE myBooks UNDER Books FINAL;

По-русски это выглядит как:

СОЗДАТЬ ТИП myBooks ПОД Books ЗАКОНЧИТЬ;

 

Создадим таблицу, которая использует тип myBooks

CREATE TABLE Книги

(

Книга myBooks,

Цена NUMERIC (6,2)

);

Теперь добавим новые записи в созданную таблицу книги.

BEGlN

DECLARE х myBooks; /* объявление переменной х типа myBooks*/

SET х = myBooks(); /* Вьполняем функцию-конструктор */ /* Вызов функций-мутаторов */

SET х = х.Title('HTML, скрипты и стили');

SET х = х.Author('Дунаев Вадим');

SET х = х.Publisher('БХВ-Петербург');

SET х =х.Year(2005);

SET х.Volume(832);

/* Добавление новой записи с установкой значений столбцов */ INSERT INTO книги (х, 350.50);

END;

Здесь ключевые слова BEGIN (начало) и END (конец)

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

SELECT * FROM Клиенты WHERE ИМЯ IS NULL;

Преобразование типов

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

· строковые CHARACTER и CHARACTER VARYING;

· все числовые типы;

· дата, время, дата-время и соответствующие интервалы. Соответствующие типы не обязательно приводить друг к другу. Приведение значения одного типа к другому осуществляется

с помощью функции CAST ():

CAST (выражение AS тип);

Например:

CAST ('1234.52' AS NUMERIC (9, 2));

CAST ('2005-10-03 ' AS DATE);

CAST (CURRENT TIMESTAMP (2) AS CHAR (20));

 

· SELECT 'Цена: ' || CAST (Цена AS CHAR(5)) FROM Продажи;

· В последнем примере пара вертикальных черт означает операцию конкатенации строк.

 

Основное SQL-выражение для выборки данных

· Чтобы выбрать из таблицы базы данных требуемые записи, следует, по крайней мере, указать столбцы и имя этой таблицы. Это требование было бы естественно сформулировать так:

ВЫБРАТЬ такие-то столбцы ИЗ такой-то таблицы;

· Разумеется, вам может потребоваться выбрать не все записи таблицы, а лишь те, которые отвечают некоторому условию. На практике именно так и бывает. Отложим пока рассмотрение формирования условий отбора записей, а сконцентрируем внимание на выборке всех записей из заданной таблицы.

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

SELECT списокСтолбцов FROM списокТаблиц;

Операторы SELECT (выбрать) и FROM (из) в SQL-выражении,

Примечание

Так, например, если исходная таблица R содержит столбцы A1, A2,...,An (другими словами, таблица представляет некоторое отношение R(A1, А2,..., An) над атрибутами (А1, А2,..., An), то оператор:

SELECT A1, A2, Ak FROM R;

реализует проекцию R[A1, А2, Аk] этого отношения на атрибуты А1, А2, Ak (k= 1, 2,..., n).

 

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

SELECT * FROM имяТаблицы;

Основное SQL-выражение может быть дополнено другими операторами, уточняющими запрос. Чаще всего употребляется оператор WHERE (где), с помощью которого можно задать условие выборки записей (строк таблицы). Таким образом, если выражение SELECT задает столбцы таблицы, указанной в операторе FROM то выражение WHERE определяет записи (строки) из этой таблицы. Выражение, определяющее запрос на выборку данных, находящихся в некоторой таблице, имеет следующий вид:

SELECT * FROM имяТаблицы WHERE условиеПоиска;

Условие, указанное в выражении WHERE, принимает одно из двух логических значений: true (ИСТИНА) или false (ЛОЖЬ).

Ключевые слова: ALL(все), DISTINCT(отличающиеся)

Например:

SELECT ClientName AS Клиент, Address AS Адрес FROM Клиенты;

 

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

SELECT Tl.Имя, Т2.Адрес FROM Клиенты Т1, Контакты T2;

 

Уточнения запроса

Основное SQL-выражение для выборки данных, имеет вид:

SELECT списокСталбцов FROM списокТаблиц;

Для уточнения запроса на выборку данных служит ряд дополнительных операторов:

· WHERE (где) — указывает записи, которые должны войти в результатную таблицу (фильтр записей);

· GROUP BY (группировать по) — группирует записи по значениям определенных столбцов;

· HAVING (имеющие, при условии) — указывает группы записей, которые должны войти в результатную таблицу (фильтр групп);

· ORDER BY (сортировать по) — сортирует (упорядочивает). Таким образом, запрос данных из таблицы с применением всех перечисленных операторов уточнения запроса имеет следующий вид:

SELECT списокСтолбцов

FROM имяТаблицы

WHERE условиеПоиска

GROUP BY столбец группировки

HAVING условиеПоиска

ORDER BY условиеСортировки;

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

1. FROM — выбирает таблицу из базы данных; если указано несколько таблиц, то выполняется их декартово произведение и результирующая таблица передается для обработки следующему оператору.

2. WHERE — из таблицы выбираются записи, отвечающие условию поиска, и отбрасываются все остальные.

3. GROUP BY — создаются группы записей, отобранных с помощью оператора WHERE (если он присутствует в SQL-выражении); каждая группа соответствует какому-нибудь значению столбца группирования. Столбец группирования может быть любым столбцом таблицы, заданной в операторе FROM, а не только тем, который указан в SELECT.

4. HAVING — обрабатывает каждую из созданных групп записей, оставляя только те из них, которые удовлетворяют условию поиска; этот оператор используется только вместе с оператором GROUP BY.

5. SELECT — выбирает из таблицы, полученной в результате применения перечисленных операторов, только указанные столбцы.

6. ORDER BY — сортирует записи таблицы. При этом в условии сортировки можно обращаться лишь к тем столбцам, которые указаны в операторе SELECT.

 

Для этой цели подойдет следующее SQL-выражение:

SELECT Имя, Адрес FROM Клиенты WHERE Сумма заказа > 500;

ВЫБРАТЬ СТОЛБЦЫимя, Адрес ИЗ ТАБЛИЦЫклиенты ГДЕ Сумма заказа > 500;

 

Выбираются только те записи, в которых Сумма заказа превышает 500, и они группируются по значениям столбцов Регион, Имя и Адрес. Это означает, что в результатной таблице записи, имеющие одинаковые значения в столбце Регион, будут расположены рядом друг с другом. Наконец, все записи в результатной таблице упорядочиваются по значениям столбца Имя.

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

WHERE Сумма заказа > 500

GROUP BY Регион, Имя, Адрес

ORDER BY Имя;

Оператор WHERE

Условия поиска в операторе WHERE (где) являются логическими выражениями, т. е. принимающими одно из двух возможных зна-. чений — true (ИСТИНА) или false (ЛОЖЬ). Например, выражение Сумма заказа > 500 является истинным (имеет значение

true), если в текущей записи таблицы значение столбца Сумма заказа превышает 500. В противном случае это выражение— ложно (имеет значение false). Одно и то же логическое выражение может быть истинным для одних записей и ложным для других. Вообще говоря, в SQL логические выражения могут принимать еще и неопределенное значение. Эго происходит тогда, когда в выражении некоторые элементы имеют значение NULL. Таким образом, в SQL мы имеем дело не с классической двузначной, а с трехзначной логикой.

Напомню, что выражение, следующее за оператором WHERE, возвращает одно из трех значений: true, false или NULL. При выполнении запроса (SQL-выражения) логическое выражение WHERE применяется ко всем записям исходной таблицы. Если оно истинно для данной записи исходной таблицы, то эта запись выбирается и будет представлена в результатной таблице; в против- ном случае запись не попадет в результатную таблицу.

При составлении логических выражений используются специальные ключевые слова и символы операций сравнения, которые называют предикатами. Например, в выражении Сумма_заказа > 500 применен предикат сравнения(>).

Наиболее часто используются предикаты сравнения, такие как (=), (<), (>), (<>), (<=) и (>=). Однако имеются и другие. Далее приведен список всех предикатов:

· предикаты сравнения: (=), (<), (>), (<>), (<=), (>=);

· BETWEEN;

· IN, NOT IN;

· LIKE, NOT LIKE;

· IS NULL;

· ALL, SOME, ANY;

· EXISTS;

· UNIQUE;

· DISTINCT;

· OVERLAPS;

· MATCH;

· SIMILAR

Предикаты сравнения

Предикаты сравнения, называемые также операторами сравнения, перечислены ниже.

Символ Описание
= Равно
<> Не равно
< Меньше
<= Меньше или равно (не больше)
> Больше
>= Больше или равно (не меньше)

 

BETWEEN

Предикат BETWEEN (между) позволяет задать выражение проверки вхождения какого-либо значения в диапазон, определяемый граничными значениями. Например:

WHERE сумма_заказа BETWEEN 100 AND 750

Здесь ключевое слово AND представляет собой логический союз И. Граничные значения (в примере это 100 и 750) входят в диапазон. Причем первое граничное значение должно быть не больше второго.

Эквивалентным приведенному является выражение с предикатами сравнения:

WHERE Сумма заказа >= 100 AND Сумма заказа <= 750

Кроме данных числового типа, в выражениях с BEETWEEN МОЖНО использовать данные следующих типов: символьные, битовые, даты-времени, Так например, чтобы выбрать записи, в которых имена клиентов находятся в диапазоне от А до Ж, можно использовать такое выражение:

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

WHERE Имя BETWEEN 'А' AND 'Ж';


IN и NOT IN

Предикаты IN (в) и NOT IN (не в) применяются для проверки вхождения какого-либо значения в заданный список значений. Например, для выборки записей о клиентах из некоторых регионов можно использовать такое выражение:

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

WHERE Регион IN ('Северо-запад', 'Ставропольский край', 'Иркутская область');

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

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

WHERE Регион NOT IN (' Москва', 'Санкт-Петербург');

 

LIKE и NOT LIKE

Предикаты LIKE (похожий) и NOT LIKE (не похожий) применяются для проверки частичного соответствия символьных строк. Например, столбец телефон в некоторой таблице содержит полные номера телефонов, а вам требуется выбрать лишь те записи, в которых номера телефонов начинаются с 348 или содержат такое сочетание цифр.

Критерий частичного соответствия задается с помощью двух символов-масок: знака процента (%) и подчеркивания (_). Знак процента означает любой набор символов, в том числе и пустой, а символ подчеркивания - любой одиночный символ.

Например, чтобы выбрать записи о клиентах, у которых номера телефонов начинаются с 348, можно использовать такое выражение:

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

WHERE Телефон LIKE '348%';

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

SELECT Имя, Адрес, Телефон

FROM Клиенты WHERE Адрес LIKE '%Санкт-Петербург% ';

Если вы хотите исключить всех клиентов, проживающих в Москве, то воспользуйтесь таким выражением:

SELECT Имя, Адрес, Телефон FROM Клиенты WHERE Адрес NOT LIKE '%Москва%';

Возможно, вам потребуется выбрать записи, содержащие символы процента и/или подчеркивания. Тогда необходимо, чтобы такие символы воспринимались интерпретатором SQL не как символы-маски. Чтобы знак процента или подчеркивания воспринимался буквально, перед ним необходимо указать специальный управляющий символ. Этот символ можно определить произвольно, лишь бы он не встречался в качестве элемента данных. В следующем примере показано, как это можно сделать:

SELECT Имя, Адрес, Процент скидки FROM Клиенты WHERE Процент скидки LIKE '20#%'

ESCAPE ' # ';

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

 

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

Предикаты АLL (все), SOME (некоторый), ANY (любой) в действительности представляют собой кванторы, известные в математической логике как кванторы всеобщности и существования. ALL — квантор всеобщности, а SOME и ANY, являющиеся синонимами в SQL, — кванторы существования. Заметим, что в переводе на русский слово ANY следовало бы понимать как квантор всеобщности ("любой" означает "все"), однако в английском языке есть различные варианты значений этого слова.

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

В языке SQL ключевые слова SOME и ANY имеют одинаковый смысл, отличающийся от ALL.

 

EXISTS

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

 

UNIQUE

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

DISTINCT

Предикат DISTINCT (отличающийся, особый) почти такой же, как и UNIQUE. Отличие этих предикатов обнаруживается применительно к значениям NULL. Так, если в результатной таблице все записи уникальны (предикат UNIQUE истинен), то и предикат DISTINCT тоже истинен (т. е. если все записи уникальны, то они и отличающиеся). С другой стороны, если в результатной таблице имеются хотя бы две неопределенные записи, то предикат DISTINCT ложен, хотя предикат UNIQUE истинен.

 

OVERLAPS

Предикат OVERLAPS (перекрывает) используется для определения, перекрываются ли два интервала времени. Интервал времени можно задать двумя способами: в виде начального и конечного моментов или в виде начального момента и длительности. Далее приведены примеры задания интервала времени:

· (TIME '12: 25: 30’, TIME '14: 30: 00') — интервал заданный начальным и конечным моментами;

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

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

(TIME '12:25:30', TIME '14:30:00') OVERLAPS (TIME '12:45:00', INTERVAL '2' HOUR)

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

 

MATCH

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

.

SIMILAR

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

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

WHERE:

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

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: