Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

УП СУБД ч1

.pdf
Скачиваний:
18
Добавлен:
11.06.2015
Размер:
1 Мб
Скачать
☆

Следующие два одинаковых по значению запроса ил­ люстрируют­ использование логического оператора NOT.

SELECT item, price, quantity, customer_address

FROM acceptedorders

(8.9)

WHERE item != ‘Book’;

SELECT item, price, quantity, customer_address

FROM acceptedorders

(8.10)

WHERE NOT item = ‘Book’;

 

 

 

 

ITEM

PRICE

QUANTITY

CUSTOMER_ADDRESS

 

 

 

 

Watch

199.99

1

Green str. 2

Pizza

5.5

3

Pall Mall, 3

PS3

400

1

Pall Mall, 3

Pizza

5.5

3

Docks

DVD Disk

6.35

2

Docks

Рис. 8.6. Значения запросов 8.9 и 8.10

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

SELECT * FROM Адрес WHERE

 

( Улица

= ‘Садовая’ AND Дом = ‘10’ )

 

OR ( Улица = ‘Лесная’ AND Дом = ‘2’ )

(8.11)

ORDER BY Улица, Дом

SELECT * FROM Адрес WHERE NOT

 

(( Улица

= ‘Садовая’ AND Дом = ‘10’ )

 

OR ( Улица = ‘Лесная’ AND Дом = ‘2’ ))

(8.12)

ORDER BY Улица, Дом

Этот запрос может быть преобразован в эквивалентную запись без использования оператора NOT; обратите внимание на то, что в этом случае операторы AND и OR и «=» и «!=» взаимно заменяются с сохранением порядка вычисления (для этого в текстах всех запросов сохранены скобки).

81

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

SELECT * FROM Адрес WHERE

 

( Улица

!= ‘Садовая’ OR Дом != ‘10’ )

 

AND ( Улица != ‘Лесная’ OR Дом != ‘2’ )

(8.13)

ORDER BY Улица, Дом

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

Приведем пример селекции по значениям типа дата:

SELECT item, price, quantity, customer_adress

 

FROM acceptedorders

 

(8.14)

WHERE order_date < TO_DATE( ‘05-AUG-08’ );

 

 

 

 

ITEM

PRICE

QUANTITY

CUSTOMER_ADRESS

Watch

199.99

1

Green str. 2

 

DVD Disk

6.35

2

Docks

 

Pizza

5.5

3

Pall Mall, 3

 

PS3

400

1

Pall Mall, 3

 

Pizza

5.5

3

Docks

 

 

Рис. 8.7. Значение запроса 8.14

 

Рассмотрим теперь следующий запрос:

 

SELECT item, price, quantity, customer_address

(8.15)

FROM acceptedorders WHERE item = ‘BOOK’;

При исполнении данного запроса будет выдано сообщение «no data found», означающее, что значение запроса – пустое множество. Это означает не то, что запрос неверный, а то, что в момент исполнения запроса в таблице нет записей, удовлетворяющих используемому условию селекции. В данном случае следует иметь в виду, что при сравнении строк имеет значение регистр символов; следующий запрос реализует сравнение значений поля item вне зависимости от регистра:

SELECT item, price, quantity, customer_address

 

FROM acceptedorders

(8.16)

WHERE UPPER(item) = ‘BOOK’ ;

82

ITEM

PRICE

QUANTITY

CUSTOMER_ADDRESS

Book

12.5

1

Pall Mall, 3

Book

12.5

2

Green str. 2

Рис. 8.8. Значение запроса 8.16

Условие в запросе 8.16 может быть сформулировано и следующим способом:

LOWER(item) = ‘book’

Предикат LIKE предназначен для проверки вхождения последовательности символов в строку при помощи шаблона, в который могут входить специальные символы: 1) обозначающий несколько символов – «%»; 2) обозначающий один символ – «_». Например, запрос 8.10 выбирает записи, в которых в значении поля customer_address встречается комбинация символов ‘all’.

SELECT item, price, quantity, customer_address

 

 

FROM acceptedorders

 

(8.17)

 

WHERE customer_address LIKE ‘%all%’;

 

 

 

 

 

ITEM

 

PRICE

QUANTITY

CUSTOMER_ADDRESS

Book

 

12.5

1

Pall Mall, 3

 

Pizza

 

5.5

3

Pall Mall, 3

 

PS3

 

400

1

Pall Mall, 3

 

Рис. 8.9. Значение запроса 8.17

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

взначении поля customer_address в любой позиции присутствует символ «r» или в значении поля item в третьей позиции встречается символ «3».

SELECT item, price, quantity, customer_address

 

 

FROM acceptedorders

 

 

 

WHERE customer_address LIKE ‘%r%’

(8.18)

 

 

OR item LIKE ‘__3%’;

 

 

 

 

 

ITEM

 

PRICE

QUANTITY

CUSTOMER_ADdRESS

Watch

 

199.99

1

Green str. 2

 

PS3

 

400

1

Pall Mall, 3

 

Book

 

12.5

2

Green str. 2

 

Рис. 8.10. Значение запроса 4.18

83

Предикат BETWEEN предназначен для селекции по границам диапазона; типы значений выражений в правой части предиката BETWEEN должны быть совместимы с типом выражения в левой части. Этот предикат применяется как к численным значениям (запрос 8.19), так и к символьным (8.20); последний пример определяет заказы с первой буквой адреса, попадающей в диапазон от ‘C’ до ‘L’.

SELECT item, price, quantity, customer_address

 

FROM acceptedorders

 

 

(8.19)

WHERE price BETWEEN 10 AND 200

 

 

 

 

 

 

 

ITEM

 

PRICE

 

QUANTITY

 

CUSTOMER_ADDRESS

Watch

199.99

1

Green str. 2

 

Book

12.5

1

Pall Mall, 3

 

Book

12.5

2

Green str. 2

 

 

 

Рис. 8.11. Значение запроса 8.19

 

SELECT item, price, quantity, customer_address

 

FROM acceptedorders

 

 

 

WHERE SUBSTR(customer_address, 1, 1 )

(8.20)

 

 

BETWEEN ‘C’ AND ‘L’

 

 

 

 

 

 

 

ITEM

 

PRICE

 

QUANTITY

 

CUSTOMER_ADDRESS

Watch

 

199.99

 

1

 

Green str. 2

 

Pizza

 

5.5

 

3

 

Docks

 

Book

 

12.5

 

2

 

Green str. 2

 

DVD Disk

 

6.35

 

2

 

Docks

 

Рис. 8.12. Значение запроса 8.20

Весьма полезным является предикат IN, имеющий следующий синтаксис:

выражение IN списочное_выражение

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

SELECT item, price, quantity, customer_address

 

FROM acceptedorders

(8.21)

WHERE item IN (‘Watch’, ‘PS3’, ‘Book’ );

84

ITEM

PRICE

QUANTITY

CUSTOMER_ADDRESS

Watch

199.99

1

Green str. 2

Book

12.5

1

Pall Mall, 3

PS3

400

1

Pall Mall, 3

Book

12.5

2

Green str. 2

Рис. 8.13. Значение запроса 8.21

Существуют также предикаты NOT LIKE, NOT IN и NOT BETWEEN.

Выводы

•для спецификации условий селекции записей исходной таблицы используется логическое выражение, указываемое после слова WHERE в SELECT-запросе;

•логическое выражение может включать помимо арифметических и строковых операций и функций операции сравнения ( <, >, =, <> или !=, >=, <= ), логические операции AND, OR и NOT и специальные предикаты;

•при использовании предложения WHERE в запросе для каждой записи исходной таблицы проверяется заданное условие; если условие выполняется, данная запись используется для формирования результирующего множества запроса;

•предикат LIKE предназначен для проверки вхождения последовательности символов в строку при помощи шаблона;

•предикат BETWEEN предназначен для селекции записей по границам диапазона;

•предикат IN предназначен для проверки равенства значения с каким-либо элементом списка.

Вопросы для контроля

1. Опишите структуру логических выражений, используемых в языке SQL.

85

2.Укажите приоритеты выполнения операций сравнения, логических и арифметических операций в выражениях.

3.Объясните правила формирования результирующего множества SELECT-запроса при использовании операций селекции (конструкции WHERE).

4.Постройте таблицы истинности для логических операций AND, OR и NOT.

5.Запишите выражения, соответствующие предикатам IN и BETWEEN при помощи логических операций и операций сравнения (используйте какой-нибудь конкретный пример).

86

Раздел 9. Язык Oracle SQL. Операция группировки и агрегатные функции. Множественные операции

В данном разделе рассматриваются средства языка SQL Oracle для группировки записей и использование агрегатных функций, а также множественные операции.

9.1. Операций группировки

Рассмотрим таблицу Students со сведениями о студентах, годе обучения и названии группы.

NAME

 

YEAR

CLASS

John

1

 

1

Pole

1

 

2

Mike

1

 

1

Dane

1

 

2

Fred

2

 

3

Ken

2

 

1

George

2

 

1

Polie

2

 

2

Jane

2

 

3

I

3

 

3

Ada

3

 

2

Cate

3

 

1

Tom

3

 

2

Рис. 9.1. Таблица Students

К результирующему множеству, специфицированному SELECT-запросом, можно применить операцию группировки, записываемой при помощи конструкции GROUP BY

список выражений.

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

87

няться по одному полю (запрос 9.1) и по группе полей (запрос 9.2):

SELECT year FROM Students GROUP BY year;

(9.1)

 

 

 

 

 

 

 

 

 

YEAR

 

 

 

 

 

1

 

 

 

 

 

 

2

 

 

 

 

 

 

3

 

 

 

 

Рис. 9.2. Значение запроса 9.1

 

SELECT year, class FROM Students

(9.2)

GROUP BY year, class;

 

 

 

 

 

 

 

 

 

YEAR

CLASS

 

 

 

1

 

1

 

 

 

 

1

 

2

 

 

 

 

2

 

1

 

 

 

 

2

 

2

 

 

 

 

2

 

3

 

 

 

 

3

 

1

 

 

 

 

3

 

2

 

 

 

 

3

 

3

 

 

 

Рис. 9.3. Значение запроса 9.2

Подобные запросы эквивалентны запросам с использованием DISTINCT:

SELECT DISTINCT year, class FROM Students;

(9.3)

При использовании группировки каждое выражение после SELECT обязательно должно присутствовать и в списке выражений после GROUP BY. Однако выражения, по которым выполняется группировка, не обязательно должны присутствовать в группе выражений в списке SELECT. В приводимых далее двух запросах первый является некорректным по указанной выше причине, а второй – правильным, и его нельзя переписать с использованием DISTINCT:

SELECT year, class FROM Students GROUP BY year;

(9.4)

SELECT year FROM Students GROUP BY year, class;

(9.5)

88

YEAR

1

1

2

2

2

3

3

3

Рис. 9.4. Значение запроса 9.5

9.2.Агрегатные функции

Взапросах с группировкой можно использовать агрегатные функции. Наиболее распространенные агрегатные функции приведены в таблице 5.

 

Таблица 5

Агрегатные функции

 

 

COUNT(выражение)

количество строк в группе

MIN(выражение)

минимальное значение выражения

 

среди строк в группе

MAX(выражение)

максимальное значение выражения

 

среди строк в группе

AVG(выражение)

среднее значение

STDDEV(выражение)

стандартное отклонение

VARIANCE(выражение)

дисперсия

SUM(выражение)

сумма всех значений выражений

 

в группе

Агрегатные функции вычисляются по всем записям каждой группы после группировки строк результирующего множества и до удаления дубликатов из групп. Агрегатные функции – единственный вид выражений, которые могут использоваться в списке SELECT без их указания в списке GROUP BY и не могут использоваться в выражениях для группировки в списке выражений GROUP BY.

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

89

SELECT year, COUNT(*) FROM Students

(9.6)

GROUP BY year;

YEAR COUNT(*)

14

25

34

Рис. 9.5. Значение запроса 9.6

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

SELECT year, class, COUNT(*) FROM Students

GROUP BY year, class;

(9.7)

 

 

 

 

 

 

YEAR

CLASS

COUNT(*)

 

 

2

1

2

 

 

2

3

2

 

 

1

2

2

 

 

3

1

1

 

 

1

1

2

 

 

3

3

1

 

 

2

2

1

 

 

3

2

2

 

Рис. 9.6. Значение запроса 9.7

Функции MIN и MAX целесообразно использовать применительно к выражениям, которые не использовались при группировке. Следующий запрос определяет для каждого клиента цены самого дорогого и самого дешевого из заказов.

SELECT customer_name,

 

MAX( price*quantity ) “самый дорогой”,

 

MIN( price*quantity ) “самый дешевый”

 

FROM acceptedorders

(9.8)

GROUP BY customer_name

90