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).Скрипт для создания базы данных библиотеки, её таблиц и заполения таблиц данными — в файле по этой ссылке.
Author | Title | Pubyear | Inv_No | Customer_ID |
Толстой | Война и мир | 2005 | 28 | 65 |
Чехов | Вишневый сад | 2000 | 17 | 31 |
Чехов | Избранные рассказы | 2011 | 19 | 120 |
Чехов | Вишневый сад | 1991 | 5 | 65 |
Ильф и Петров | Двенадцать стульев | 1985 | 3 | 31 |
Маяковский | Поэмы | 1983 | 2 | 120 |
Пастернак | Доктор Живаго | 2006 | 69 | 120 |
Толстой | Воскресенье | 2006 | 77 | 47 |
Толстой | Анна Каренина | 1989 | 7 | 205 |
Пушкин | Капитанская дочка | 2004 | 25 | 47 |
Гоголь | Пьесы | 2007 | 81 | 47 |
Чехов | Избранные рассказы | 1987 | 4 | 205 |
Пушкин | Сочинения, т. 1 | 1984 | 6 | 47 |
Пастернак | Избранное | 2000 | 137 | 18 |
Пушкин | Сочинения, т.2 | 1984 | 8 | 205 |
NULL | Наука и жизнь 9 2018 | 2019 | 127 | 18 |
Чехов | Ранние рассказы | 2001 | 171 | 31 |
Пример 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_ID | Surname |
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 |
|
Интуитивно понятно, что такой количественный предикат сравнения можно использовать как таковой:
1 2 3 4 5 |
|
Давайте продолжим с полезными. Заметьте, что вы, вероятно, написали вышеупомянутые запросы с другим синтаксисом, как таковой:
1 2 3 4 5 |
|
Фактически, вы использовали <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 |
|
Точно! Разве SQL не красив? Обратите внимание, что неявные последствия 3)
приводят к очень специфическому поведению предиката NOT IN
отношению к NULL
, о котором мало кто знает.
Теперь это становится потрясающим
Пока что в этом <quantified comparison predicate>
нет ничего необычного. Все предыдущие примеры можно эмулировать с помощью «более идиоматического» или, скажем, «более повседневного» SQL.
Но истинное удивление <quantified comparison predicate>
появляется только при использовании в сочетании с <row value expression>
где строки имеют степень / арность более одного:
1 2 3 4 5 6 |
|
Посмотрите вышеупомянутые запросы в действии на PostgreSQL в этом SQLFiddle .
На данный момент стоит упомянуть, что на самом деле немногие базы данных поддерживают…
- выражения значения строки, или …
- количественные предикаты сравнения с выражениями значений строк
Даже если это указано в SQL-92 , похоже, что большинству баз данных все еще не хватает времени для реализации этой функции 22 года спустя.
Эмулируя эти предикаты с помощью jOOQ
Но, к счастью, есть jOOQ, чтобы подражать этим функциям для вас. Даже если вы не используете jOOQ в своем проекте, следующие шаги преобразования SQL могут быть полезны, если вы хотите выразить вышеуказанные предикаты. Давайте посмотрим, как это можно сделать в MySQL:
1 2 3 4 5 6 7 8 |
|
Как насчет другого предиката?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 |
|
Понятно, что предикат 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, чтобы найти имя и профессия всех сотрудников, которые зарабатывают больше, чем все руководители:
ВЫБЕРИТЕ ФАМИЛИЯ, РАБОТА ОТ СОТРУДНИКОВ ГДЕ ЗАРПЛАТА > ВСЕ ( ВЫБЕРИТЕ ЗАРПЛАТА ОТ СОТРУДНИКОВ ГДЕ РАБОТА='МЕНЕДЖЕР')
- выражение > ЛЮБОЙ (полный выбор)
- Предикат истинен, если выражение больше хотя бы одного из значения, возвращаемые полной выборкой.