Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metodichka_SQL.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
406 Кб
Скачать
☆

Выборка строк (конструкция where)

В приведенных выше примерах в результате выполнения операторов SELECT выбирались все строки указанной таблицы. Однако очень часто требуется тем или иным образом ограничить набор строк, помещаемых в результирующую таблицу запроса. Это достигается с помощью указания в запросе конструкции WHERE. Она состоит из ключевого слова WHERE, за которым следует перечень условий поиска, определяющих те строки, которые должны быть выбраны при выполнении запроса. Существует пять основных типов условий поиска (или предикатов, если пользоваться терминологией ISO).

•Сравнение. Сравниваются результаты вычисления одного выражения с результатами вычисления другого выражения.

•Диапазон. Проверяется, попадает ли результат вычисления выражения в заданный диапазон значений.

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

•Соответствие шаблону. Проверяется, отвечает ли некоторое строковое значение заданному шаблону.

•Значение NULL. Проверяется, содержит ли данный столбец NULL (неопределенное значение).

Пример 5. Условие поиска путем сравнения. Перечислите весь персонал с размером заработной платы больше 10 000 фунтов стерлингов в год.

SELECT staffNo, fName, lName, position, salary

FROM Staff

WHERE salary > 10000

В этом запросе используются таблица Staff и предикат salary>10000. При выполнении запроса будет создана новая таблица, содержащая только те строки таблицы Staff, в которых значение столбца salary больше 10000 фунтов стерлингов. Результаты выполнения запроса представлены в табл. 13.

Результат выполнения запроса Таблица 13.

staffNo

fName

lName

position

salary

SL21

John

White

Manager

30000.00

SG37

Ann

Beech

Assistant

12000.00

SG14

David

Ford

Supervisor

18000.00

SG5

Susan

Brand

Manager

24000.00

В языке SQL можно использовать простые операции сравнения, перечисленные в табл. 14.

Операции сравнения Таблица 14

Знак операции

Назначение

=

Равно

<>

Не равно (стандарт ISO)

!=

Не равно (используется в некоторых диалектах)

<

Меньше

>

Больше

<=

Меньше или равно

>=

Больше или равно

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

• Выражение вычисляется слева направо.

• Первыми вычисляются подвыражения в скобках.

• Операции NOT выполняются перед операциями AND и OR.

• Операции AND выполняются перед операциями OR.

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

Пример 6. Сложные условия поиска

Перечислите адреса всех отделений компании в Лондоне и Глазго.

SELECT *

FROM Branch

WHERE city = 'London' OR city = 'Glasgow'

В этом примере для выборки сведений об отделениях компании, находящихся в Лондоне (city = 'London') или Глазго (city = 'Glasgow'), в конструкции WHERE используется логический оператор OR. Результаты выполнения запроса представлены в табл. 15.

Результат выполнения запроса Таблица 15

branchNo

street

city

postcode

В005

22 Deer Rd

London

SW14EH

В003

163 Main St

Glasgow

G1l9QX

В002

56 Clover Dr

London

NW106EU

Пример 7. Использование диапазонов (BETWEEN/NOT BETWEEN) в условиях поиска. Перечислите весь персонал с годовой зарплатой от 20 000 до 30 000 фунтов стерлингов.

SELECT staffNo, fName, lName, position, salary

FROM Staff

WHERE salary BETWEEN 20000 AND 30000

Наличие ключевого слова BETWEEN требует задания границ диапазона значений. В данном случае результаты проверки будут положительными для всех работников компании с годовой заработной платой от 20000 до 30000 фунтов стерлингов включительно. Результаты выполнения запроса представлены в табл. 16.

Результаты выполнений запроса Таблица 16

staffNo

fName

lName

position

salary

SL21

John

White

Manager

30000.0

SG5

Susan

Brand

Manager

24000.00

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

SELECT staffNo, fName, lName, position, salary

FROM Staff

WHERE salary >= 20000 AND salary <= 30000

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

Пример 8. Условия поиска с проверкой принадлежности к множеству (IN/NOT IN). Составьте список всех руководителей и их заместителей.

SELECT staffNo, fName, lName, position

FROM Staff

WHERE position IN ('Manager', 'Supervisor')

Проверка принадлежности к множеству обеспечивается с помощью ключевого слова IN. При этом проверяется, соответствует ли результат вычисления выражения одному из значений в предоставленном списке — в нашем случае это строки 'Manager' и 'Supervisor'. Результаты выполнения запроса представлены в табл. 17.

Таблица 17

Результат выполнения запроса

staffNo

fName

lName

position

SL21

John

White

Manager

SG14

David

Ford

Supervisor

SG5

Susan

Brand

Manager

Существует также версия такой проверки, имеющая противоположный смысл (NOT IN), которая используется для отбора любых значений, кроме тех, которые указаны в представленном списке. Как и оператор BETWEEN, оператор IN незначительно повышает выразительную мощность языка SQL – тот же самый запрос может быть представлен следующим образом:

SELECT staffNo, fName, lName, position

FROM Staff

WHERE position = 'Manager' OR position = 'Supervisor'

Однако использование оператора IN представляет собой более эффективный способ записи условий поиска, особенно если набор допустимых значений достаточно велик.

Пример 9. Условия поиска с указанием шаблонов (LIKE/NOT LIKE). Найдите всех владельцев недвижимости, в адресах которых содержится строка 'Glasgow'.

При выполнении данного запроса необходимо организовать поиск строки 'Glasgow', которая может находиться в любом месте значений столбца address таблицы PrivateOwner. В языке SQL существуют два специальных символа шаблона, используемых при проверке символьных значений.

• %. Символ процента представляет любую последовательность из нуля или более символов (поэтому часто именуется также подстановочным символом).

• _. Символ подчеркивания представляет любой отдельный символ.

Все остальные символы в шаблоне представляют сами себя.

• address LIKE 'H%'. Этот шаблон означает, что первый символ значения обязательно должен быть символом Н, а все остальные символы не представляют интереса и не проверяются.

• address LIKE 'H___ '. (3 символа) Этот шаблон означает, что значение должно иметь длину, равную строго четырем символам, причем первым символом обязательно должен быть символ Н.

• address LIKE ' %е'. Этот шаблон определяет любую последовательность символов длиной не менее одного символа, причем последним символом обязательно должен быть символ е.

• address LIKE '%Glasgow%'. Этот шаблон означает, что нас интересует любая последовательность символов, включающая подстроку Glasgow.

• address NOT LIKE ' H%'. Этот шаблон указывает, что требуются любые строки, которые не начинаются с символа Н.

Если требуемая строка должна включать также служебный символ, обычно применяемый в качестве символа подстановки, то следует определить с помощью конструкции ESCAPE "маскирующий" символ, который указывает, что следующий за ним символ больше не имеет специального значения, и поместить его перед символом подстановки. Например, для проверки значений на соответствие литеральной строке '45%' можно воспользоваться таким предикатом:

LIKE '45#%' ESCAPE '#'

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

SELECT ownerNo, fName, lName, address, telNo

FROM PrivateOwner

WHERE address LIKE '%Glasgow%'

Результаты выполнения этого запроса представлены в табл.18.

Таблица 18

Результат выполнения запроса из примера 9

ownerNo

fName

lName

address

telNo

С087

Carol

Parrel

6 Achray St, Glasgow G32 9DX

0141-357-7419

С040

Tina

Murphy

63 Well St, Glasgow G42

0141-943-1728

С093

Топу

Shaw

12 Park PI, Glasgow G4 OQR

0141-225-7025

Пример 10. Использование значения NULL в условиях поиска (IS NULL/IS NOT NULL). Составьте список всех посещений сдаваемого в аренду объекта с номером PG4, по которым не было предоставлено комментариев.

Просматривая таблицу Viewing (см. табл. 6), можно заметить, что в ней есть сведения о двух осмотрах сдаваемого в аренду объекта с учетным номером 'PG4', причем по одному из них комментарии представлены, а по другому - нет. На основании этого простого примера можно прийти к заключению, что вторую из этих записей можно выбрать с помощью одного из следующих условий поиска:

(propertyNo = ' PG4 ' AND comment = ' ' )

ИЛИ

(propertyNo = 'PG4' AND comment <> 'too remote1 )

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

SELECT clientNo, viewDate

FROM Viewing

WHERE propertyNo = 'PG4' AND comment IS NULL;

Результаты выполнения запроса представлены в табл. 19.

Таблица 19

clientNo

date

CR56

26-Мау-01

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]