Главная » Информационные системы » Управление данными » ОПЕРАЦИИ СРАВНЕНИЯ ЯЗЫКА SQL

ОПЕРАЦИИ СРАВНЕНИЯ ЯЗЫКА SQL

Операции сравнения

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

Что же может быть элементом сравнения? Элементом сравнения может выступать:

  • значение поля
  • литерал
  • арифметическое выражение
  • агрегирующая функция
  • другая встроенная функция
  • значение (значения), возвращаемые подзапросом.

При сравнении литералов конечные пробелы игнорируются. Так, предложение WHERE first_name = 'Петр ' будет иметь тот же результат, что и предложение WHERE first_name = 'Петр'.

SELECT first_name, last_name, dept_no
FROM employee
WHERE job_code = Admin

получить список сотрудников (и номера их отделов), занимающих должность администраторов

FIRST_NAMELAST_NAMEDEPT_NO
TerriLeev000
AnnBennet120
Sue AnneO'Brien670
KellyBrown600
SELECT first_name, last_name, dept_no,
job_country
FROM employee
WHERE job_country <> USA

получить список сотрудников (а также номера их отделов и страну), работающих вне США

FIRST_NAMELAST_NAMEDEPT_NOJOB_COUNTRY
AnnBennet120England
RogerReeves120England
WillieStansbury120England
ClaudiaSutherland140Canada
YukiIchida115Japan
TakashiYamamoto115Japan
RobertoFerrari125Italy
JacquesGlon123France
PierreOsborne121Switzerland

BETWEEN

Предикат BETWEEN задает диапазон значений, для которого выражение принимает значение true. Разрешено также использовать конструкцию NOT BETWEEN.

SELECT first_name, last_name, salary
FROM employee
WHERE salary BETWEEN 20000 AND 30000

получить список сотрудников, годовая зарплата которых больше 20000 и меньше 30000

FIRST_NAMELAST_NAMESALARY
AnnBennet22935.00
KellyBrown27000.00

Тот же запрос с использованием операторов сравнения будет выглядеть следующим образом:

SELECT first_name, last_name, salary
FROM employee
WHERE salary >= 20000
AND salary <= 30000

получить список сотрудников, годовая зарплата которых больше 20000 и меньше 30000

FIRST_NAMELAST_NAMESALARY
AnnBennet22935.00
KellyBrown27000.00

Запрос с предикатом BETWEEN может иметь следующий вид:

SELECT first_name, last_name, salary
FROM employee
WHERE last_name BETWEEN Nelson AND Osborne

получить список сотрудников, фамилии которых начинаются с Nelson и заканчиваются Osborne

FIRST_NAMELAST_NAMESALARY
RobertNelson105900.00
CarolNordstrom42742.50
Sue AnneO'Brien31275.00
PierreOsborne110000.00

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

SELECT first_name, last_name, salary
FROM employee
WHERE last_name BETWEEN Nel AND Osb

получить список сотрудников, фамилии которых находятся между Nel и Osb

FIRST_NAMELAST_NAMESALARY
RobertNelson105900.00
CarolNordstrom42742.50
Sue AnneO'Brien31275.00

В данном примере значений Nel и Osb в базе данных нет. Однако, все сотрудники, входящие в диапазон, в нижней части которого начало фамилий совпадает с Nel (т.е. выполняется условие больше или равно), а в верхней части фамилия не более Osb (т.е. выполняется условие меньше или равно - а именно O, Os, Osb), попадут в выборку. Отметим, что при выборке с использованием предиката BETWEEN поле, на которое накладывается диапазон, считается упорядоченным по возрастанию.

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

SELECT first_name, last_name, hire_date
FROM employee
WHERE hire_date NOT BETWEEN 1-JAN-1989 AND 31-DEC-1993

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

FIRST_NAMELAST_NAMEHIRE_DATE
RobertNelson28-DEC-1988
BruceYoung28-DEC-1988
PierreOsborne3-JAN-1994
JohnMontgomery30-MAR-1994
MarkGuckenheimer2-MAY-1994

IN

Предикат IN проверяет, входит ли заданное значение, предшествующее ключевому слову IN (например, значение столбца или функция от него) в указанный в скобках список. Если заданное проверяемое значение равно какому-либо элементу в списке, то предикат принимает значение true. Разрешено также использовать конструкцию NOT IN.

SELECT first_name, last_name, job_code
FROM employee
WHERE job_code IN (VP, Admin, Finan)

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

FIRST_NAMELAST_NAMEJOB_CODE
RobertNelsonVP
TerriLeeAdmin
StewartHallFinan
AnnBennetAdmin
Sue AnneO'BrienAdmin
Mary S.MacDonaldVP
KellyBrownAdmin

А вот пример запроса, использующего предикат NOT IN:

SELECT first_name, last_name, job_country
FROM employee
WHERE job_country NOT IN
(USA, Japan, England)

получить список сотрудников, работающих не в США, не в Японии и не в Великобритании

FIRST_NAMELAST_NAMEJOB_COUNTRY
ClaudiaSutherlandCanada
RobertoFerrariItaly
JacquesGlonFrance
PierreOsborneSwitzerland

LIKE

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

  • % - замещает любое количество символов (в том числе и 0),
  • _ - замещает только один символ.

Разрешено также использовать конструкцию NOT LIKE.

SELECT first_name, last_name
FROM employee
WHERE last_name LIKE F%

получить список сотрудников, фамилии которых начинаются с буквы F

FIRST_NAMELAST_NAME
PhilForest
PeteFisher
RobertoFerrari
SELECT first_name, last_name
FROM employee
WHERE first_name LIKE %er

получить список сотрудников, имена которых заканчиваются буквами er FIRST_NAMERogerRogerWalter

LAST_NAME
De Souza
Reeves
Steadman

А такой запрос позволяет решить проблему произношения (и написания) имени:

SELECT first_name, last_name
FROM employee
WHERE first_name LIKE Jacq_es

найти сотрудника(ов), в имени которого неизвестно произношение буквы перед окончанием es FIRST_NAMEJacques

LAST_NAME
Glon

Что делать, если требуется найти строку, которая содержит указанные выше специальные символы (%, _) в качестве информационных символов? Есть выход! Для этого с помощью ключевого слова ESCAPEнужно определить так называемый escape-символ, который, будучи поставленным перед символом % или _, укажет, что этот символ является информационным. Escape-символ не может быть символом \ (обратная косая черта) и, вообще говоря, должен представлять собой символ, никогда не появляющийся в упоминаемом столбце как информационный символ. Часто для этих целей используются символы @ и ~.

SELECT first_name, last_name
FROM employee
WHERE first_name LIKE %@_% ESCAPE @

получить список сотрудников, в имени которых содержится _ (знак подчеркивания)

CONTAINING

Предикат CONTAINING аналогичен предикату LIKE, за исключением того, что он не чувствителен к регистру букв. Разрешено также использовать конструкцию NOT CONTAINING.

SELECT first_name, last_name
FROM employee
WHERE last_name CONTAINING ne

получить список сотрудников, фамилии которых содержат буквы ne, Ne, NE, nE

FIRST_NAMELAST_NAME
RobertNelson
AnnBennet
PierreOsborne

IS NULL

В SQL-запросах NULL означает, что значение столбца неизвестно. Поисковые условия, в которых значение столбца сравнивается с NULL, всегда принимают значение unknown (и, соответственно, приводят к ошибке), в противоположность true или false, т.е.

WHERE dept_no = NULL

или даже

WHERE NULL = NULL.

Предикат IS NULL принимает значение true только тогда, когда выражение слева от ключевых слов IS NULL имеет значение null (пусто, не определено). Разрешено также использовать конструкцию IS NOT NULL, которая означает не пусто, имеет какое-либо значение.

SELECT department, mngr_no
FROM department
WHERE mngr_no IS NULL

получить список отделов, в которых еще не назначены начальники

DEPARTMENTMNGR_NO
Marketing 
Software Products Div. 
Software Development 
Field Office: Singapore 

Предикаты EXIST, ANY, ALL, SOME, SINGULAR мы рассмотрим в разделе, рассказывающем о подзапросах.


Друзья! Приглашаем вас к обсуждению. Если у вас есть своё мнение, напишите нам в комментарии.

Поделиться
Дисциплины