Предикат в sql это: Предикаты — SQL Server | Microsoft Learn

EXISTS SQL и проверка существования набора значений

Навигация по уроку

  • Назначение предиката SQL EXISTS
  • Наиболее простые запросы с предикатом SQL EXISTS
  • Различия предикатов EXISTS и IN
  • Запросы с предикатом EXISTS и дополнительными условиями
  • Запросы с предикатом EXISTS к двум таблицам
  • Предикат EXISTS в соединениях более двух таблиц

Связанные темы

  • Оператор SELECT
  • Реляционная алгебра и её операции
  • Аналогии между INTERSECT и EXISTS, EXCEPT и NOT EXISTS: более сложные примеры
НазадСодержаниеВперёд>>>

Предикат языка SQL EXISTS выполняет логическую задачу. В запросах SQL этот предикат используется в выражениях вида

EXISTS (SELECT * FROM ИМЯ_ТАБЛИЦЫ. ..).

Это выражение возвращает истину, когда по запросу найдена одна или более строк, соответствующих условию, и ложь, когда не найдено ни одной строки.

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

Для NOT EXISTS всё наоборот. Выражение

NOT EXISTS (SELECT * FROM ИМЯ_ТАБЛИЦЫ…)

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

Если вы хотите выполнить запросы к базе данных из этого урока на MS SQL Server, но эта СУБД не установлена на вашем компьютере, то ее можно установить, пользуясь инструкцией по этой ссылке.

В примерах работаем с базой данных библиотеки и ее таблицами «Книга в пользовании» (BOOKINUSE) и «Пользователь» (USER).

Пока нам потребуется лишь таблица «Книга в пользовании» (BOOKINUSE).

Скрипт для создания базы данных библиотеки, её таблиц и заполения таблиц данными — в файле по этой ссылке.

AuthorTitlePubyearInv_NoCustomer_ID
ТолстойВойна и мир20052865
ЧеховВишневый сад20001731
ЧеховИзбранные рассказы201119120
ЧеховВишневый сад1991565
Ильф и ПетровДвенадцать стульев1985331
МаяковскийПоэмы19832120
ПастернакДоктор Живаго200669120
ТолстойВоскресенье20067747
ТолстойАнна Каренина19897205
ПушкинКапитанская дочка20042547
ГогольПьесы20078147
ЧеховИзбранные рассказы19874205
ПушкинСочинения, т. 11984647
ПастернакИзбранное200013718
ПушкинСочинения, т.219848205
NULLНаука и жизнь 9 2018201912718
ЧеховРанние рассказы2001 17131

Пример 1. Определить ID пользователей, которым выданы книги Толстого, которым также выданы книги Чехова. Во внешнем запросе отбираются данные о пользователях, которым выданы книги Толстого, а предикат EXISTS задаёт дополнительное условие, которое проверяется в во внутреннем запросе — пользователи, которым выданы книги Чехова. Дополнительным условием во внутреннем запросе является совпадение идентификаторов пользователей из внешнего и внутреннего запросов: Customer_ID=tols_user.Customer_id. Запрос будет следующим:

SELECT Customer_ID FROM Bookinuse AS tols_user WHERE Author=’Толстой’ AND EXISTS (SELECT Customer_ID FROM Bookinuse WHERE Author=’Чехов’ AND Customer_ID=tols_user. Customer_id)

Этот запрос вернёт следующий результат:

Customer_ID
65
205
  • Аналогии между INTERSECT и EXISTS, EXCEPT и NOT EXISTS: более сложные примеры

Далее — пример использования NOT EXISTS в запросе, решающем похожую задачу.

Пример 2. Определить ID пользователей, которым выданы книги Чехова, и которым при этом не выданы книги Ильфа и Петрова. Конструкция запроса аналогична конструкции из предыдущего примера с той разницей, что дополнительное условие задаётся предикатом NOT EXISTS. Запрос будет следующим:

SELECT Customer_ID FROM Bookinuse AS cheh_user WHERE Author=’Чехов’ AND NOT EXISTS (SELECT Customer_ID FROM Bookinuse WHERE Author=’Ильф и Петров’ AND Customer_ID=cheh_user.Customer_id)

Этот запрос вернёт следующий результат:

User_ID
120
65
205

Написать запрос SQL с предикатом EXISTS самостоятельно, а затем посмотреть решение

Пример 3. Определить автора (авторов), книги которого выданы пользователю с ID 120, а также с ID 18.

Правильное решение и ответ.

При первом взгляде на запросы с предикатом EXISTS может возникнуть впечатление, что он идентичен предикату IN. Это не так. Хотя они очень похожи. Предикат IN ведет поиск значений из диапазона, заданного в его аргументе, и если такие значения есть, то выбираются все строки, соответствующие этому диапазону. Результат же действия предиката EXISTS представляет собой ответ «да» или «нет» на вопрос о том, есть ли вообще какие-либо значения, соответствующие указанным в аргументе. Кроме того, перед предикатом IN указывается имя столбца, по которому следует искать строки, соответствующие значениям в диапазоне. Разберём пример, показывающий отличие предиката EXISTS от предиката IN, и задачу, решаемую с помощью предиката IN.

Пример 4. Определить ID пользователей, которым выданы книги авторов, книги которых выданы пользователю с ID 31. Запрос будет следующим:

SELECT Customer_ID FROM Bookinuse WHERE Author IN (SELECT Author FROM Bookinuse WHERE Customer_ID=31)

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

User_ID
120
65
205

Внутренний запрос (после IN) выбирает авторов: Чехов; Ильф и Петров. Внешний запрос выбирает всех пользователей, которым выданы книги этих авторов. Видим, что, в отличие от предиката EXISTS, предикат IN предваряется именем столбца, в данном случае — Author.

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

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

Пример 5. Определить ID пользователей, которым выдана хотя бы одна книга Пастернака, и которым при этом выдано более 2 книг. Пишем следующий запрос, в котором первое условие задаётся предикатом EXISTS со вложенным запросом, а второе условие с оператором HAVING всегда должно следовать после вложенного запроса:

SELECT Customer_ID FROM Bookinuse AS pas_user WHERE EXISTS (SELECT Customer_ID FROM Bookinuse WHERE Author=’Пастернак’ AND Customer_ID=pas_user.Customer_ID) GROUP BY Customer_ID HAVING COUNT(Title) > 2

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

User_ID
120

Как видно из таблицы BOOKINUSE, книга Пастернака выдана также пользователю с ID 18, но ему выдана всего одна книга и он не попадает в выборку. Если применить к подобному запросу ещё раз функцию COUNT, но уже для подсчёта выбранных строк (потренируйтесь в этом самостоятельно), то можно получить сведения о том, сколько пользователей, читающих книги Пастернака, при этом читают также книги других авторов. Это уже из сферы анализа данных.

  • Аналогии между INTERSECT и EXISTS, EXCEPT и NOT EXISTS: более сложные примеры

Запросы с предикатом EXISTS могут извлекать данные из более чем одной таблицы. Многие задачи можно с тем же результатом решить с помощью оператора JOIN, но в ряде случаев использование EXISTS позволяет составить менее громоздкий запрос. Использовать EXISTS предпочительнее в тех случаях, когда в результирующую таблицу попадут столбцы лишь из одной таблицы.

В следующем примере из той же базы данных помимо таблицы BOOKINUSE потребуется также таблица «Пользователь» (CUSTOMER).

Customer_IDSurname
18Зотов
31Перов
47Васин
65Тихонов
120Краснов
205Климов

Пример 6. Определить авторов, книги которых выданы пользователю по фамилии Краснов. Пишем следующий запрос, в котором предикатом EXISTS задано единственное условие:

SELECT DISTINCT Author FROM Bookinuse bk WHERE EXISTS (SELECT * FROM Customer cs WHERE cs.Customer_ID=bk.Customer_ID AND Surname=’Краснов’)

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

Author
Чехов
Маяковский
Пастернак

Как и в случае использования оператора JOIN, в случаях более одной таблицы следует использовать псевдонимы таблиц для проверки соответствия значений ключей, соединяющих таблицы. В нашем примере псевдонимы таблиц — bk и us, а ключ, соединяющий таблицы — User_ID.

Примеры запросов к базе данных «Библиотека» есть также в уроках по операторам GROUP BY, IN и функциям CONCAT, COALESCE.

  • Аналогии между INTERSECT и EXISTS, EXCEPT и NOT EXISTS: более сложные примеры

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

Работаем с базой данных «Недвижимость». Скрипт для создания этой базы данных, её таблиц и заполения таблиц данными — в файле по этой ссылке.

Таблица Deal содержит данные о сделках. Для наших заданий в этой таблице будет важен столбец Type с данными о типе сделки — продажа или аренда. Таблица Object содержит данные об объектах. В этой таблице нам понадобятся значения столбцов Rooms (число комнат) и LogBalc, содержащего данные о наличии лоджии или балкона в булевом формате: 1 (да) или 0 (нет). Таблицы Client, Manager и Owner содержат данные соответственно о клиентах, менеджерах фирмы и собственниках объектов недвижимости. В этих таблицах FName и LName соответственно имя и фамилия.

Пример 7. Определить клиентов, купивших или взявших в аренду объекты, у которых нет лоджии или балкона. Пишем следующий запрос, в котором предикатом EXISTS задано обращение к результату соединения двух таблиц:

SELECT cl. * FROM Client cl WHERE EXISTS (SELECT 1 FROM Deal de JOIN Object ob ON ob.Obj_ID=de.Object_ID WHERE de.Client_ID=cl.Client_ID AND ob.LogBalc=0)

Так как из таблицы Client столбцы выбираются при помощи оператора «звёздочка», то будут выведены все столбцы этой таблицы, в которой будет столько строк, сколько насчитывается клиентов, соответствующих условию, заданному предикатом EXISTS. Из таблиц, к соединению которых обращается вложенный запрос, нам не требуется выводить ни одного столбца. Поэтому для экономии машинного времени извлекается лишь один столбец. Для этого после слова SELECT прописана единица. Этот же приём применён и в запросах в следующих примерах.

Написать запрос SQL с предикатом EXISTS самостоятельно, а затем посмотреть решение

Пример 3. Определить менеджеров, которые провели сделки с объектами с числом комнат больше 2.

Правильное решение.

Продолжаем писать вместе запросы SQL с предикатом EXISTS

Пример 9. Определить собственников объектов, которые были взяты в аренду. Пишем следующий запрос, в котором предикатом EXISTS также задано обращение к результату соединения двух таблиц:

SELECT ow.* FROM Owner ow WHERE EXISTS (SELECT 1 FROM Object ob JOIN Deal de ON de.Object_ID=ob.Obj_ID WHERE ow.Owner_ID=ob.Owner_ID AND de.Type=’rent’)

Как и в предыдущем примере, из таблицы, к которой обращён внешний запрос, будут выведены все поля.

Пример 10. Определить число собственников, с объектами которых провёл менеджер Савельев. Пишем запрос, в котором внешний запрос обращается к соединению трёх таблиц, а предикатом EXISTS задано обращение лишь к одной таблице:

SELECT COUNT(*) FROM Object ob JOIN Deal de ON de.Object_ID=ob.Obj_ID JOIN Owner ow ON ob. Owner_ID=ow.Owner_ID WHERE EXISTS (SELECT 1 FROM Manager ma WHERE de.Manager_ID=ma.Manager_ID AND ma.LName=’Савельев’)

Все запросы проверены на существующей базе данных. Успешного использования!

Примеры запросов к базе данных «Недвижимость» есть также в уроках по операторам GROUP BY и IN.

  • Аналогии между INTERSECT и EXISTS, EXCEPT и NOT EXISTS: более сложные примеры

Поделиться с друзьями

НазадСодержаниеВперёд>>>

Замечательная функция SQL: количественные предикаты сравнения (ЛЮБОЙ, ВСЕ)

Вы когда-нибудь задумывались о сценарии использования ANY ( также SOME ) и ALL ключевых слов SQL?

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

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

8.7  <quantifiedcomparison predicate>

 

Function

 

    Specify a quantified comparison.

 

Format

 

    <quantifiedcomparison predicate> ::=

        <rowvalue constructor> <compop>

            <quantifier> <tablesubquery>

 

    <quantifier> ::= <all> | <some>

    <all> ::= ALL

    <some> ::= SOME | ANY

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

1

2

3

4

5

42 = ANY(SELECTage FROMperson)

 

42 > ALL(SELECTage FROMperson)

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

1

2

3

4

5

42 IN(SELECTage FROMperson)

 

42 > (SELECTMAX(age) FROMperson)

Фактически, вы использовали <in predicate> или предикате больше, чем <scalar subquery> и статистическую функцию.

Предикат IN

Это не совпадение, что вы могли использовать <in predicate> же, как вышеупомянутый <quantified comparison predicate> используя ANY . На самом деле, <in predicate> указывается так:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

8. 4 <inpredicate>

 

Syntax Rules

 

2) Let RVC be the <rowvalue constructor> and let IPV

   be the <inpredicate value>.

 

3) The expression

 

     RVC NOT IN IPV

 

   is equivalent to

 

     NOT ( RVC IN IPV )

 

4) The expression

 

     RVC IN IPV

 

   is equivalent to

 

     RVC = ANY IPV

Точно! Разве SQL не красив? Обратите внимание, что неявные последствия 3) приводят к очень специфическому поведению предиката NOT IN отношению к NULL , о котором мало кто знает.

Теперь это становится потрясающим

Пока что в этом <quantified comparison predicate> нет ничего необычного. Все предыдущие примеры можно эмулировать с помощью «более идиоматического» или, скажем, «более повседневного» SQL.

Но истинное удивление <quantified comparison predicate> появляется только при использовании в сочетании с <row value expression> где строки имеют степень / арность более одного:

1

2

3

4

5

6

(42, 'John') = ANY(SELECTage, first_name FROMperson)

 

(55, 150000.00) > ALL(SELECTage, wage FROMperson)

Посмотрите вышеупомянутые запросы в действии на PostgreSQL в этом SQLFiddle .

На данный момент стоит упомянуть, что на самом деле немногие базы данных поддерживают…

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

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

Эмулируя эти предикаты с помощью jOOQ

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

1

2

3

4

5

6

7

8

(42, 'John') = ANY(SELECTage, first_name FROMperson)

 

EXISTS (

  SELECT1 FROMperson

  WHEREage = 42 ANDfirst_name = 'John'

)

Как насчет другого предиката?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

(55, 150000. 00) > ALL(SELECTage, wage FROMperson)

 

(55, 150000.00) > (

  SELECTage, wage FROMperson

  ORDERBY1 DESC, 2 DESC

  LIMIT 1

)

 

NOTEXISTS (

  SELECT1 FROMperson

  WHERE(55 < age)

  OR    (55 = age AND150000. 00 <= wage)

)

Понятно, что предикат EXISTS можно использовать практически во всех базах данных, чтобы имитировать то, что мы видели раньше. Если вам просто нужно это для эмуляции одним выстрелом, приведенных выше примеров будет достаточно. Однако, если вы хотите более формально использовать <row value expression> и <quantified comparison predicate> , вам лучше получить правильное преобразование SQL.

Читайте дальше о преобразовании SQL в этой статье здесь.

Ссылка: Замечательная функция SQL: количественные предикаты сравнения (ЛЮБОЙ, ВСЕ) от нашего партнера по JCG Лукаса Эдера из блога JAVA, SQL и JOOQ .

Предикат в СУБД | Система управления базами данных

 Рассмотрите пример таблицы «emp»

EMPNO ЭНАМЯ РАБОТА МГР ДАТА ПРИЕМА САЛ СВЯЗЬ НОМЕР ОТДЕЛА
7839 КОРОЛЬ ПРЕЗИДЕНТ 17 ноября 1981 г. 5000 10
7698 БЛЕЙК МЕНЕДЖЕР 7839 01 МАЯ 81 2850 500 30
7782 КЛАРК МЕНЕДЖЕР 7839 09-JUN-81 2450 500 10
7566 ДЖОНС МЕНЕДЖЕР 7839 02 апреля-81 2975 20
7788 СКОТТ АНАЛИТИК 7566 19 апреля-87 3000 20
7902 ФОРД АНАЛИТИК 7566 03 декабря 81 3000 20
7369 СМИТ КЛАСС 7902 17 декабря 80 800 500 20

Предикат, в котором пункт

 select * from emp
  , где   [должность = 'МЕНЕДЖЕР']; 

O/P

 Выбрано 3 ряда.  

ЭМПНО ЭНАМЯ РАБОТА МГР ДАТА ПРИЕМА САЛ СВЯЗЬ НОМЕР ОТДЕЛА
7698 БЛЕЙК МЕНЕДЖЕР 7839 01 МАЯ 81 2850 30
7782 КЛАРК МЕНЕДЖЕР 7839 09-JUN-81 2450 10
7566 ДЖОНС МЕНЕДЖЕР 7839 02 апреля-81 2975 20

В нашей emp таблице есть три менеджера , поэтому отображаются только три записи, потому что условие верно только для этих трех строк, т. е. когда задание является менеджер.

Предикат в предложении ‘IN’

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

Пример
 select empno,job,sal,hiredate
из эмп
где [имя   в   («СКОТТ», «ФОРД», «СМИТ», «ДЖОНС»)]; 

О/П

 4 выбранных ряда 

EMPNO РАБОТА САЛ ДАТА ПРИЕМА
7566 МЕНЕДЖЕР 2975 02 апреля-81
7788 АНАЛИТИК 3000 19 апреля-87
7902 АНАЛИТИК 3000 03 декабря 81
7369 СЛУЖАЩАЯ 800 17 декабря 80

Отображаются записи всех тех сотрудников, которые указаны в списке в пункте .

Предикат в ‘BETWEEN CAUSE

Используется для выполнения сравнения данных и манипулирования ими в диапазоне значений присутствующих в таблице базы данных

Пример
 select empno,job,sal,hiredate
из эмп
где [сал   между   800 и 2900]; 

О/П

 3 выбранных ряда 

EMPNO РАБОТА САЛ ДАТА ПРИЕМА
7698 МЕНЕДЖЕР 2850 01 МАЯ 81
7782 МЕНЕДЖЕР 2450 09-JUN-81
7369 КЛАСС 800 17 декабря 80

  • Извлекаются сведения о тех сотрудниках, чья зарплата находится в диапазоне от 800 до 2900 евро, а также учитываются указанные значения, включая диапазон
  • .
  • В случае между оператором сначала указывается более низкое значение, а затем более высокое значение и оператор и между этими более высокими и более низкими значениями.

Предикат в предложении LIKE

Оператор like является оператором сопоставления с шаблоном, который возвращает те записи, которые соответствуют указанному шаблону данных

Пример
 выберите empno,ename,hiredate,sal,job
из эмп
где [ename   как   'S%']; 

О/П

 2 выбранных ряда 

EMPNO ЭНАМЯ ДАТА ПРИЕМА САЛ РАБОТА
7788 СКОТТ 19 апреля-87 3000 АНАЛИТИК
7369 СМИТ 17 декабря 80 800 КЛАСС

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

Предикат  в предложении IS NULL

Все операции с нулевыми значениями, присутствующими в таблице, должны выполняться с использованием этого оператора is null , мы не можем сравнивать нулевое значение с помощью оператора присваивания (=)

 select * from эмп
где [comm   равно нулю]   

О/П

 4 выбранных ряда 

EMPNO ЭНАМЯ РАБОТА МГР ДАТА ПРИЕМА САЛ СВЯЗЬ НОМЕР ОТДЕЛА
7839 КОРОЛЬ ПРЕЗИДЕНТ 17 ноября 1981 г. 5000 10
7566 ДЖОНС МЕНЕДЖЕР 7839 02 апреля-81 2975 20
7788 СКОТТ АНАЛИТИК 7566 19 апреля-87 3000 20
7902 ФОРД АНАЛИТИК 7566 03 декабря 81 3000 20

Отображаются сведения о тех сотрудниках, у которых значение комиссии равно Null.

Предикат в предложении NOT

Оператор Not является оператором отрицания, который используется вместе с , как, between, is null, в операторах , It выполняет обратное действие всех этих операторов

Пример
 выберите * из emp
где [сал   НЕ между   800 и 2900]; 

О/П

 4 выбранных ряда 

EMPNO ЭНАМЯ ЗАДАНИЕ МГР ДАТА ПРИЕМА САЛ СВЯЗЬ НОМЕР ОТДЕЛА
7839 КОРОЛЬ ПРЕЗИДЕНТ 17 ноября 1981 г. 5000 10
7566 ДЖОНС МЕНЕДЖЕР 7839 02 апреля-81 2975 20
7788 СКОТТ АНАЛИТИК 7566 19 апреля-87 3000 20
7902 ФОРД АНАЛИТИК 7566 03 декабря 81 3000 20

Отображаются сведения о тех сотрудниках, чья зарплата не попадает в диапазон от 800 до 2900.

Начало работы с SQL

Начало работы с SQL

Предикаты позволяют создавать условия таким образом, чтобы строки, удовлетворяющие этим условиям, обрабатываются. Обсуждаются базовые предикаты в разделе «Выбор строк». В этом разделе обсуждаются IN, BETWEEN, LIKE, EXISTS и количественные предикаты. раздел.

Использование предиката IN

Используйте предикат IN для сравнения значения с несколькими другими значениями. Для пример:

  ВЫБЕРИТЕ  ИМЯ
          ОТ  ПЕРСОНАЛ
          ГДЕ  ОТДЕЛ  В  (20, 15)
 

Этот пример эквивалентен:

  ВЫБЕРИТЕ  ИМЯ
          ОТ  ПЕРСОНАЛА
          ГДЕ  ОТДЕЛ = 20  ИЛИ  ОТДЕЛ = 15
 

Вы можете использовать операторы IN и NOT IN, когда подзапрос возвращает набор ценности. Например, следующий запрос выводит фамилии сотрудников ответственный за проекты MA2100 и OP2012:

  ВЫБЕРИТЕ  ФАМИЛИЯ
          ОТ  СОТРУДНИКОВ
          ГДЕ  ЭМПНО  В 
           (  ВЫБОР  ОТВЕТ
                 ИЗ ПРОЕКТА 
                 ГДЕ  PROJNO = 'MA2100'
                 ИЛИ  PROJNO = 'OP2012')
 

Подзапрос выполняется один раз, и результирующий список заменяется непосредственно в запрос внешнего уровня. Например, приведенный выше подзапрос выбирает номера сотрудников 10 и 330, запрос внешнего уровня оценивается так, как будто его Предложение WHERE было:

  ГДЕ  ЭМПНО  В  (10, 330)
 

Список значений, возвращаемых подзапросом, может содержать ноль, одно или более ценности.

Использование предиката BETWEEN

Используйте предикат BETWEEN для сравнения значения с диапазоном значений. диапазон включен, и он рассматривает два выражения в МЕЖДУ предикат для сравнения.

В следующем примере находят имена сотрудников, которые зарабатывают между 10 000 и 20 000 долл. США:

  ВЫБЕРИТЕ  ФАМИЛИЯ
          ОТ  СОТРУДНИКОВ
          ГДЕ  ЗАРПЛАТА  МЕЖДУ  10000  И  20000
 

Это эквивалентно:

  ВЫБЕРИТЕ  ФАМИЛИЯ
          ОТ  СОТРУДНИКОВ
          ГДЕ  ЗАРПЛАТА >= 10000  И  ЗАРПЛАТА <= 20000
 

Следующий пример находит имена сотрудников, которые зарабатывают менее 10 000 долларов США или более 20 000 долларов США:

  ВЫБЕРИТЕ  ФАМИЛИЯ
       ОТ  СОТРУДНИКОВ
       ГДЕ  ЗАРПЛАТА  НЕ МЕЖДУ  10000  И  20000
 

Использование предиката LIKE

Используйте предикат LIKE для поиска строк с определенными шаблонами. Шаблон задается с помощью знаков процента и подчеркивания.

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

В следующем примере выбираются имена сотрудников длиной семь букв. на букву «С»:

  ВЫБЕРИТЕ  ИМЯ
       ОТ  ПЕРСОНАЛА
       ГДЕ  ИМЯ  НРАВИТСЯ  'S_ _ _ _ _ _'
 

В следующем примере выбираются имена сотрудников, которые не начинаются с буквы':

  ВЫБЕРИТЕ  ИМЯ
       ОТ  ПЕРСОНАЛА
       ГДЕ  ИМЯ  НЕ КАК  'S%'
 

Использование предиката EXISTS

Вы можете использовать подзапрос для проверки существования строки, которая удовлетворяет некоторому условию. В этом случае подзапрос связан с запрос внешнего уровня с помощью предиката EXISTS или NOT EXISTS.

Когда вы связываете подзапрос с внешним запросом с помощью предиката EXISTS, подзапрос не возвращает значение. Скорее, предикат EXISTS истинен, если набор ответов подзапроса содержит одну или несколько строк и false, если он содержит нет рядов.

Предикат EXISTS часто используется со связанными подзапросами. Пример ниже перечислены отделы, которые в настоящее время не имеют записей в ПРОЕКТЕ стол:

  ВЫБЕРИТЕ  НОМЕР ОТДЕЛА, НАЗВАНИЕ ОТДЕЛА
          ОТ  ОТДЕЛ X
          ГДЕ  НЕ СУЩЕСТВУЕТ
                 (  ВЫБЕРИТЕ  *
                       ИЗ ПРОЕКТА 
                       ГДЕ  DEPTNO = X.DEPTNO)
          ЗАКАЗАТЬ ПО ТЕЛЕФОНУ  DEPTNO
 

Вы можете соединить предикаты EXISTS и NOT EXISTS с другими предикатами с помощью используя AND и OR в предложении WHERE запроса внешнего уровня.

Количественные предикаты

Количественный предикат сравнивает значение с набором значений. Если fullselect возвращает более одного значения, вы должны изменить сравнение операторы в вашем предикате, присоединив суффикс ALL, ANY или SOME. Эти суффиксы определяют, как набор возвращаемых значений должен обрабатываться в предикат внешнего уровня. В качестве примера используется оператор сравнения > (оператор сравнения примечания ниже относятся и к другим операторам):

выражение > ВСЕ (полный выбор)
Предикат истинен, если выражение больше каждого отдельного значение, возвращаемое полной выборкой. Если полная выборка не возвращает никаких значений, предикат истинен. Результат ложный, если указанное отношение ложно по крайней мере для одного значения. Обратите внимание, что количественный предикат <>ALL эквивалентно предикату NOT IN.

В следующем примере используется подзапрос и сравнение > ALL, чтобы найти имя и профессия всех сотрудников, которые зарабатывают больше, чем все руководители:

  ВЫБЕРИТЕ  ФАМИЛИЯ, РАБОТА
          ОТ  СОТРУДНИКОВ
          ГДЕ  ЗАРПЛАТА >   ВСЕ 
        (  ВЫБЕРИТЕ  ЗАРПЛАТА
              ОТ  СОТРУДНИКОВ
              ГДЕ  РАБОТА='МЕНЕДЖЕР')
 
выражение > ЛЮБОЙ (полный выбор)
Предикат истинен, если выражение больше хотя бы одного из значения, возвращаемые полной выборкой.
Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *