Условные выражения с оператором CASE
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

 

В обычных языках программирования имеются операторы условного перехода, которые позволяют управлять вычислительным процессом. В языке SQL таким оператором является CASE. Этот оператор возвращает значение и, следовательно, может использоваться в выражениях. Он имеет две основные формы.

 

Оператор CASE со значениями

 

Оператор CASE со значениями имеет следующий синтаксис:

CASE проверяемое_значение

WHEN значение1 THEN результат1

WHEN значение2 THEN результат2

...

WHEN значениеN THEN результатN

ELSE результатX

END

В случае, когда проверяемое_значение равно значение1, оператор CASE возвращает значение результат1, указанное после ключевого слова THEN. В противном случае проверяемое_значение сравнивается с значение2, и если они равны, то возвращается значение результат2. В противном случае проверяемое_значение сравнивается со следующим значением, указанным после ключевого слова WHEN и т.д. Если проверяемое_значение не равно ни одному из таких значений, то возвращается значение результатХ, указанное после ключевого слова ELSE.

Ключевое слово ELSE не является обязательным. Если оно отсутствует и ни одно из значений, подлежащих сравнению, не равно проверяемому значению, то оператор CASE возвращает NULL.

Например, вместо номера издания в виде числа выведем номер издания в виде текстовой строки:

SELECT isbn,

CASE edition

    WHEN 1 THEN 'first'

    WHEN 2 THEN 'second'

    WHEN 3 THEN 'third'

    ELSE 'large then 3'

END AS edition_num

FROM editions;

 

Оператор CASE с условием поиска

 

Вторая форма оператора CASE предполагает его использование при поиске в таблице тех записей, которые удовлетворяют определенному условию:

CASE

WHEN условие1 THEN результат1

WHEN условие2 THEN результат2

...

WHEN условиеN THEN результатN

ELSE результатX

END

Оператор CASE проверяет, истинно ли условие1 для первой записи в таблице. Если да, то CASE возвращает значение результат1. В противном случае для данной записи проверяется условие2. Если оно истинно, то возвращается значение результат2 и т.д. Если ни одно из условий не выполняется, то возвращается значение результатХ, указанное после ключевого слова ELSE.

Ключевое слово ELSE не является обязательным. Если оно отсутствует и ни одно из условий не выполняется, оператор CASE возвращает NULL. После того как оператор, содержащий CASE, выполнится для первой записи, происходит переход к следующей записи. Так продолжается до тех пор, пока не будет обработан весь набор записей.

Например, вместо номера издания в виде числа выведем номер издания в виде текстовой строки:

SELECT isbn,

CASE

    WHEN edition = 1 THEN 'first'

    WHEN edition = 2 THEN 'second'

    WHEN edition = 3 THEN 'third'

    ELSE 'large then 3'

END AS edition_num

FROM editions;

 

Функция COALESCE

 

В ряде случаев, особенно в запросах на обновление данных (оператор UPDATE), удобно использовать вместо громоздкого оператора CASE более компактную функцию COALESCE.

Функция COALESCE(значение1, значение2, ..., значениеN) принимает список значений, которые могут быть как определенными, так и неопределенными (NULL). Функция возвращает первое определенное значение из списка. Если все значения окажутся неопределенными, функция возвращает NULL.

Например, заменим все NULL-значения поля location на значение 'не определено':

SELECT id, subject,

coalesce(location, 'не определено')

FROM subjects;

 

 



Лабораторная работа 2

 

Подключиться к базе данных booktown и выполнить следующие запросы:

1. Все сведения о книгах.

2. Все сведения об изданиях книг.

3. Код и название всех книг.

4. ISBN, номер издания, дата издания и тип обложки для всех изданий.

5. Неповторяющиеся коды издательств, выпускавших книги.

6. Неповторяющиеся коды тем, по которым написаны книги.

7. Для каждого кода ISBN получить прибыль магазина в случае продажи всех имеющихся в наличии экземпляров.

8. Названия всех книг, упорядоченные по алфавиту.

9. Фамилии и имена всех покупателей, отсортированные по алфавиту (если есть однофамильцы, то они должны быть отсортированы по именам).

10. Список всех ISBN с указанием розничной цены, упорядоченный от самых дорогих к самым дешевым.

11. Код ISBN и затраты магазина на закупку соответствующих имеющихся в наличии книг. Упорядочить по стоимости закупки (всех имеющихся экземпляров).

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

13. Код ISBN и имеющееся количество для десяти книг, в наибольшем количестве имеющихся на складе.

14. Все данные о последних пяти покупках.

15. Все данные о первых семи покупках, не считая трех самых первых (т.е. следующие семь после первых трех).

16. Самая дорогая цена (розничная) книги.

17. Самая малая разница между ценой закупки и ценой продажи.

18. Код ISBN и название типа обложки («твердая» / «мягкая») для всех изданий. Упорядочить по названию типа обложки.

19. Код ISBN, цена закупки, цена продажи, величина наценки, процент наценки и класс всех книг. Если цена продажи более, чем на 10 % превышает цену закупки, то класс – «VIP», иначе – «эконом». Упорядочить по убыванию процента наценки.

 



УТОЧНЕНИЕ ЗАПРОСА

 

Секция WHERE

 

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

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

FROM списокТаблиц;

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

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

Например, получим список всех книг о компьютерных технологиях. У этих книг поле subject_id равно 4. Соответственно в секцию WHERE включается оператор =, который проверяет это условие:

SELECT *

FROM books

WHERE subject_id = 4;

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

Секция WHERE может содержать несколько условий, объединенных логическими операторами (например, AND или OR) и возвращающими одно логическое значение.

Например, получим все записи для книг о компьютерах, которые, кроме того, что они о компьютерах, написаны Марком Лутцем. Запрос уточняется объединением двух условий при помощи логического оператора AND:

SELECT title

FROM books

WHERE subject_id = 4 AND author_id = 7805;

Первое условие проверяет, что книга посвящена компьютерным технологиям (поле subject_id равно 4), а второе – что автором книги является Марк Лутц (поле author_id равно 7805). Объединение условий уменьшает объем итогового набора.

Получим все книги, посвященные компьютерным технологиям или искусству; в этом случае два условия объединяются логическим оператором OR.

SELECT title

FROM books

WHERE subject_id = 4 OR subject_id = 0;

Прежнее первое условие (книги по компьютерной тематике) объединяется со вторым условием: книги по искусству (поле subject_id равно 0). В результате объем итогового набора увеличивается, каждая его запись удовлетворяет хотя бы одному из этих условий.

Количество условий, объединяемых в секции WHERE, не ограничено, хотя при наличии двух и более условий обычно задается порядок выполнения сравнений при помощи круглых скобок.

 

Предикаты

 

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

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

· between;

· in, not in;

· like, not like;

· is null;

· all, some, any;

· exists;

· unique;

· distinct;

· overlaps;

· match;

· similar.

 

Between

 

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

WHERE cost between 100 and 150

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

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

WHERE cost >= 100 and cost <= 150

Кроме данных числового типа, в выражениях с between можно использовать данные следующих типов: символьные, битовые, даты-времени. Например, чтобы выбрать записи, в которых фамилии авторов находятся в диапазоне от A до G, можно использовать такое выражение:

SELECT first_name, last_name

FROM authors

WHERE last_name between 'A' and 'G';

 

IN и NOT IN

 

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

SELECT title, author_id

FROM books

WHERE subject_id IN (7805, 0);

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

SELECT title, author_id

FROM books

WHERE subject_id NOT IN (7805, 0);

 

LIKE и NOT LIKE

 

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

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

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

SELECT isbn, edition, publication

FROM edition

WHERE isbn LIKE '044%';

Если требуется выбрать записи о книгах про Python, то для этого подойдет следующее выражение:

SELECT title, author_id

FROM books

WHERE title LIKE '%Python%';

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

SELECT title, author_id

FROM books

WHERE title NOT LIKE '%Python%';

 

SIMILAR

 

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

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

WHERE ОС SIMILAR TO 'Windows (XP|Vista|7)';

 

IS NULL

 

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

SELECT id, subject

FROM subjects

WHERE location IS NULL;

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

SELECT id, subject

FROM subjects

WHERE location IS NOT NULL;

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

 

OVERLAPS

 

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

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

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

Предикаты для вложенных запросов ALL, SOME, ANY, EXISTS, UNIQUE, DISTINCT будут рассмотрены в разделе "Сложные запросы".

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

 

 




Лабораторная работа 3

 

Выполнить следующие запросы к базе данных booktown:

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

2. Вся информация об издании книг с типом h в порядке их публикации.

3. Информация об изданиях книг до XXI века.

4. Информация об имеющихся книгах на складе (stock). Отсортировать по убыванию количества, отсутствующие книги не выводить.

5. Код ISBN и отпускная цена для книг с отпускной ценой в диапазоне от 20 до 30 в порядке возрастания цены.

6. Список покупателей, которых зовут Jean.

7. Код ISBN, имеющееся количество и отпускная цена для книг, имеющихся на складе в количестве, не меньшем 50, или с отпускной ценой, меньшей 20.

8. Код ISBN, тип обложки и дата издания для книг в мягкой (бумажной) обложке, изданных в период с 1990 по 2010 гг. Упорядочить по дате издания.

9. Код ISBN, номер издания и дата издания для книг, изданных впервые или в XXI веке.

10. Названия книг, написанных автором с кодом 1809 по теме с кодом 15.

11. Код ISBN и дата покупки для покупок в период с 10-го по 15 августа 2001 года. Отсортировать по дате покупки.

12. Названия книг и коды авторов для книг, написанных авторами с кодами 1809, 7805, 1212, 15990 и 25041. Упорядочить по коду автора.

13. Названия книг и коды авторов для книг, написанных авторами, чьи номера не 1809, 7805, 1212, 15990 и 25041. Упорядочить по коду автора.

14. Название темы и отдел для тем, расположенных в отделах Main St, Black Raven Dr, Productivity Ave и Creativity St. Отсортировать по названию темы.

15. Фамилия и имя авторов, имена которых начинаются на Marg.

16. Названия книг, в которых присутствует предлог in.

17. Названия книг, в которых присутствует The или the.

18. Названия книг, в которых нет ни The, ни the.

19. Фамилии авторов, чьи имена не известны.

20. Код темы, название темы и отдел для тем с кодом, большим 10, и известным отделом.



МНОГОТАБЛИЧНЫЕ ЗАПРОСЫ

 

Дата: 2019-02-19, просмотров: 341.