Выполнение сложных sql-запросов. оператор для наборов данных intersect пример сравнения блоков данных

INTERSECT и EXCEPT операторы Transact-SQL – описание и примеры использования | Info-Comp.ru

Продолжаем изучать язык SQL и в частности его расширение Transact-SQL и сегодня мы затронем тему таких операторов объединения набора данных как INTERSECT и EXCEPT, мы узнаем, что это за операторы и как их можно использовать.

Язык Transact-SQL мы изучаем уже достаточно давно и посветили ему немало статей, но такие операторы как INTERSECT и EXCEPT мы не рассматривали, хотя если говорить в принципе об объединениях, то мы изучали такие конструкции как UNION и UNION ALL, а также рассматривали простые объединения JOIN. Поэтому сегодня давайте узнаем, что делают такие полезные, но малоизвестные операторы Transact-SQL как INTERSECT и EXCEPT.

Примечание! Все примеры мы будем делать в Management Studio SQL Server 2014 Express, также если кому интересно как можно обновиться с 2008 SQL сервера до 2014, то это мы рассматривали вот здесь.

Исходные данные для примеров

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

Таблица 1

Ее данные

Таблица 2

И ее данные

Оператор INTERSECT

INTERSECT (пересечение) – это оператор Transact-SQL, который выводит одинаковые строки из первого, второго и последующих наборов данных. Другими словами он выведет только те строки, которые есть как в первом результирующем наборе, так и во втором (третьем и так далее) т.е. происходит пересечение этих строк.

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

Также как и у операторов UNION у INTERSECT есть правила, например то, что количество полей во всех результирующих наборах должно быть одинаковым, также как и их тип данных.

Пример

Давайте узнаем, какие данные у нас есть и в таблице test_table и в таблице test_table_two т.е. совпадения, для этого пишем простой SQL запрос:

Как видите, у нас в обеих таблицах есть «Принтер» с суммой 100 и сканер с суммой 150.

Оператор EXCEPT

EXCEPT (разность) — это оператор Transact-SQL, который выводит только те данные из первого набора строк, которых нет во втором наборе.

Здесь те же правила что и у оператора INTERSECT, т.е. количество столбцов (и их тип) должно быть одинаковым.

EXCEPT полезен тогда когда необходимо сравнить две таблицы и вывести только те строки первой таблице, которых нет в другой таблице.

Пример

Давайте посмотрим, какие строки есть только в первой таблице

Как видите, во второй таблице нет строки, у которой tip «Монитор» а сумма 200, если помните, то у нас во второй таблице монитор с суммой 250.

А теперь давайте поменяем наши таблицы местами и посмотрим на результат

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

Вот в принципе и вся основа этих операторов, надеюсь, данная статья помогла Вам в решение тех или иных задач, начинающим программистам рекомендую почитать мою книгу «Путь программиста T-SQL», в ней я подробно, с большим количеством примеров, рассказываю про другие полезные возможности языка Transact-SQL, удачи!

Using Parenthesis

You can build complicated queries using these operators.  In fact, there’s nothing stopping you from combining one or more of these operators into a super query.  When this is done, be sure to use parenthesis “()” to control which operators are evaluated first.

It may not be apparent to you or another SQL reader that,

Evaluates as

When there is no parenthesis, the order of evaluation is:

  1. INTERSECT
  2. EXCEPT and UNION are evaluated Left to Right

Can you remember this?

My recommendation is to just use parenthesis and make it clear.  Tricky is kewl, but you’ll get burned down the road when you misread your own code – trust me on this one…

Out of the three queries, the UNION operator is irreplaceable.  There is no other way to combine results from two queries into a single result without using UNION.

On the other hand, as you saw earlier, both EXCEPT and INTERSECT’s results can be reproduced using OUTER and INNER JOINS respectively.  In fact, you’ll find that the JOIN version of the queries runs more efficiently than EXCEPT and INTERSECT do and is more versatile as you can include fields from the left table that aren’t in the right.

For instance

Isn’t valid, since the number of columns in both queries doesn’t match, whereas,

Is valid.

Оператор SELECT

Кроме того, оператор SELECT можно использовать для извлечения строк, вычисленных без ссылки на какую-либо таблицу. Например, чтобы вычислить, чему равно 2*2, нужно просто написать
Mysql> SELECT 2*2;

Упрощенно структуру оператора SELECT можно представить следующим образом:
SELECT select_выражение1, select_выражение2,

Квадратные скобки означают, что использование находящегося в них оператора необязательно, вертикальная черта | означает перечисление возможных вариантов. После ключевого слова ORDER BY указывают имя столбца, число (целое беззнаковое) или формулу и способ упорядочения (по возрастанию – ASC, или по убыванию – DESC). По умолчанию используется упорядочение по возрастанию.

Когда в select_выражении мы пишем «*», это значит выбрать все столбцы. Кроме «*» в select_выражения могут использоваться функции типа max, min и avg.

Пример 10.4. Выбрать из таблицы Persons все данные, для которых поле first_name имеет значение «Александр»:

Пример 10.4. Использование оператора SELECT

Выбрать название и описание (title, description) артефакта под номером 10:

Пример с одним выражением

Давайте рассмотрим пример оператора EXCEPT в SQL Server (Transact-SQL), который возвращает одно поле с тем же типом данных.
Например:

Transact-SQL

SELECT product_id
FROM products
EXCEPT
SELECT product_id
FROM inventory;

SELECT
product_id

FROM
products

SELECT
product_id

FROM
inventory
;

Этот пример оператора EXCEPT возвращает все значения product_id
, которые находятся в таблице products
, а не в таблице inventory
. Это означает, что если значение product_id
существует в таблице products
и также существует в таблице inventory
, значение product_id
не будет отображаться в результатах запроса EXCEPT.

Разность множеств: оператор SQL EXCEPT и его альтернативы

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

Пример 3. Вывести список продуктов, которые имеются в мазазине
Solnyshko, и отсутствуют в магазине Veterok. Пишем следующий запрос с использованием оператора SQL EXCEPT:

SELECT ProdName
FROM Solnyshko
EXCEPT
SELECT ProdName
FROM Veterok

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

ProdName
мясо
сахар

Во многих диалектах SQL, например, MySQL, оператор EXCEPT отсутствует. Наиболее простой альтернативный
способ реализации разности множеств связан с использованием
предиката EXISTS с отрицанием NOT, то есть NOT EXISTS.
В качестве альтернативы им можно пользоваться и в MS SQL Server.

Пример 4. Вывести список продуктов, которые имеются в мазазине
SOLNYSHKO, и отсутствуют в магазине VETEROK. Использовать предикат SQL NOT EXISTS. Пишем следующий запрос:

SELECT ProdName
FROM Solnyshko
AS name_soln
WHERE NOT EXISTS (SELECT
ProdName FROM Veterok WHERE
ProdName=name_soln.ProdName)

Результатом выполнения запроса будет та же таблица, что и в примере 2:

ProdName
мясо
сахар

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

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

Назад Вперёд>>>

Ключевые слова

Включаются дублирующиеся строки из всех результирующих наборов.

DISTINCT

Дублирующиеся строки удаляются из всех результирующих наборов перед сравнением, проводимым оператором INTERSECT. Столбцы с пустыми (NULL) значениями считаются дублирующимися. Если не указано ни ключевое слово ALL, ни DISTINCT, то по умолчанию подразумевается DISTINCT.

CORRESPONDING

Указывается, что возвращаться будут только те столбцы, которые имеют в обоих запросах одно имя, даже если в обоих запросах используется обобщающий символ (*).

Указывается, что возвращаться будут только названные столбцы, даже если запросы обнаруживают другие столбцы с соответствующими именами. Это предложение должно использоваться вместе с ключевым словом CORRESPONDING.

Пример с несколькими выражениями

Затем давайте рассмотрим пример запроса EXCEPT в SQL Server (Transact-SQL), который возвращает более одного столбца.
Например:

Transact-SQL

В этом примере запрос EXCEPT возвращает записи в таблице contacts
с именем contact_id
, last_name
и first_name
, которое не соответствует значению employee_id
, last_name
и first_name
в таблице employees
.

  • указывая соединяемые таблицы (в том числе подзапросы) во фразе FROM
    оператора SELECT
    . Сначала выполняется соединение таблиц, а уже потом к полученному множеству применяются указанные фразой WHERE
    условия, определяемое фразой GROUP BY
    агрегирование, упорядочивание данных и т.п.;
  • определяя объединение результирующих наборов, полученных при обработке оператора SELECT
    . В этом случае два оператора SELECT
    соединяются фразой UNION

    , INTERSECT

    , EXCEPT

    или CORRESPONDING
    .

UNION-объединение

Фраза UNION

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

Стандарт не накладывает никаких ограничений на упорядочивание строк в результирующем наборе. Так, некоторые СУБД сначала выводят результат первого запроса, а затем — результат второго запроса. СУБД Oracle автоматически сортирует записи по первому указанному столбцу даже в том случае, если для него не создан индекс.

Для того чтобы явно указать требуемый порядок сортировки, следует использовать фразу ORDER BY
. При этом можно использовать как имя столбца, так и его номер (рис. 4.3).

Рис.
4.3.

Фраза UNION

ALL
выполняет объединение двух подзапросов аналогично фразе UNION
со следующими исключениями:

  • совпадающие строки не удаляются из формируемого результирующего набора;
  • объединяемые запросы выводятся в результирующем наборе последовательно без упорядочивания.

При объединении более двух запросов для изменения порядка выполнения операции объединения можно использовать скобки (рис. 4.4).

Рис.
4.4.

INTERSECT-объединение

Фраза INTERSECT

позволяет выбрать только те строки, которые присутствуют в каждом объединяемом результирующем наборе. На рис. 4.5 приведен пример объединения запросов как пересекающихся множеств.

Рис.
4.5.

EXCEPT-объединение

Фраза EXCEPT

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

Фразы INTERSECT

и EXCEPT

должны поддерживаться только при полном уровне соответствия стандарту SQL-92. Так, некоторые СУБД вместо фразы

На уроке будет рассмотрена тема использования операций объединения, пересечения и разности запросов. Разобраны примеры того, как используется SQL запрос Union, Exists, а также использование ключевых слов SOME, ANY и All. Рассмотрены строковые функции

Над множеством можно выполнять операции объединения, разности и декартова произведения. Те же операции можно использовать и в sql запросах (выполнять операции с запросами).

Использование оператора UNION требует выполнения нескольких условий:

  1. количество выходных столбцов каждого из запросов должно быть одинаковым;
  2. выходные столбцы каждого из запросов должны быть сравнимы между собой по типам данных (в порядке их очередности);
  3. в итоговом наборе используются имена столбцов, заданные в первом запросе;
  4. ORDER BY может быть использовано только в конце составного запроса, так как оно применяетя к результату объединения.

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

Решение:

1
2
3
4
5
6

SELECT
`Номер`
,
`Цена`

FROM
pc
UNION

SELECT
`Номер`
,
`Цена`

FROM
notebook
ORDER
BY
`Цена`

SELECT `Номер` , `Цена`
FROM pc
UNION
SELECT `Номер` , `Цена`
FROM notebook
ORDER BY `Цена`

Результат:

Рассмотрим более сложный пример с объединением inner join:

Пример:
Найти тип продукции, номер и цену компьютеров и ноутбуков

Решение:

1
2
3
4
5
6
7
8

SELECT
product.
`Тип`
,
pc.
`Номер`
,
`Цена`

FROM
pc
INNER
JOIN
product ON
pc.
`Номер`
=
product.
`Номер`

UNION

SELECT
product.
`Тип`
,
notebook.
`Номер`
,
`Цена`

FROM
notebook
INNER
JOIN
product ON
notebook.
`Номер`
=
product.
`Номер`

ORDER
BY
`Цена`

SELECT product.`Тип` , pc.`Номер` , `Цена`
FROM pc
INNER JOIN product ON pc.`Номер` = product.`Номер`
UNION
SELECT product.`Тип` , notebook.`Номер` , `Цена`
FROM notebook
INNER JOIN product ON notebook.`Номер` = product.`Номер`
ORDER BY `Цена`

Результат:

SQL Union 1.
Найти производителя, номер и цену всех ноутбуков и принтеров

SQL Union 2.
Найти номера и цены всех продуктов, выпущенных производителем Россия

Данные

Скрипты и таблица с данными

CREATE TABLE goods(id bigint NOT NULL,
name character varying(127) NOT NULL,
description character varying(255) NOT NULL,
price numeric(16,2) NOT NULL,
articul character varying(20) NOT NULL,
act_time timestamp NOT NULL,
availability boolean NOT NULL,
CONSTRAINT pk_goods PRIMARY KEY (id));
INSERT INTO goods (id, name, description, price, articul, act_time, availability) VALUES (1, «Тапочки», «Мягкие», 100.00, «TR-75», {ts «2017-01-01 01:01:01.01»}, TRUE);
INSERT INTO goods (id, name, description, price, articul, act_time, availability) VALUES (2, «Подушка», «Белая», 200.00, «PR-75», {ts «2017-01-02 02:02:02.02»}, TRUE);
INSERT INTO goods (id, name, description, price, articul, act_time, availability) VALUES (3, «Одеяло», «Пуховое», 300.00, «ZR-75», {ts «2017-01-03 03:03:03.03»}, TRUE);
INSERT INTO goods (id, name, description, price, articul, act_time, availability) VALUES (4, «Наволочка», «Серая», 400.00, «AR-75», {ts «2017-01-04 04:04:04.04»}, FALSE);
INSERT INTO goods (id, name, description, price, articul, act_time, availability) VALUES (5, «Простынка», «Шелковая», 500.00, «BR-75», {ts «2017-01-05 05:05:05.05»}, FALSE);

Запросы

1. Двойные кавычки

Смогли бы Вы привести пример sql-запроса c использованием двойных
кавычек?

Пример с двойными кавычками

SELECT name «Имя товара» FROM goods

иной

2. Псевдо таблица. SQL-92

Псевдо таблица

SELECT mock.nickname «Прозвище», (CASE WHEN mock.huff THEN «Да» ELSE «Нет» END) «Обижается?» FROM (SELECT name AS nickname, availability AS huff FROM goods) mock

В нашем примере mock — это псевдо таблица (иногда называют виртуальной таблицей). Естественно, предназначены они вовсе не для того, чтобы переврать истинный смысл. Пример такой.

3. Конструктор блока данных. SQL-92

Пример конструктора блока данных

SELECT name «Имя товара», price «Цена» FROM (VALUES («Тапочки», 100.00), («Подушка», 200.00)) AS goods(name, price)

Имя товара Цена
Тапочки 100.00
Подушка 200.00

В секции FROM
используется ключевой слово VALUES
, за которым в скобках данные, строка за строкой. Суть в том, что мы вообще не выбираем данные из какой-то таблицы, а просто создаем их налету, «называем» таблицей, именуем колонки и далее используем по своему усмотрению. Эта штука оказалось крайне полезной при тестировании разных кейсов sql-запроса, когда данных для некоторых таблиц нет (в Вашей локальной БД), а писать insert лень или иногда очень сложно, ввиду связанности таблиц и ограничений.

6. Сравнение блоков данных. SQL-92

Пример сравнения блоков данных

SELECT * FROM goods WHERE (name, price, availability) = («Наволочка», 400.00, FALSE)
— или его аналог
SELECT * FROM goods WHERE name = «Наволочка» AND price = 400.00 AND availability = FALSE

Как видно из примера, сравнение блоков данных аналогично сравнению поэлементно значение_1
_block_1 = значение_1
_block_2, значение_2
_block_1 = значение_2
_block_2, значение_3
_block_1 = значение_3
_block_2
с использованием AND
между ними.

8. Операторы работы с запросами/под запросами. SQL-92

UNION
UNION ALL
EXCEPT
INTERSECT

Пример с EXCEPT

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

DB2

Платформа DB2 поддерживает ключевые слова INTERSECT и INTERSECT ALL стандарта ANSI плюс дополнительное предложение VALUES.

{инструкция._SELECT_7 | VALUES (выраж7 )} INTERSECT

] {инструкция_SCJ_2 | VALUES {выраж2 )} INTERSECT

Хотя инструкция INTERSECT DISTINCT не поддерживается, функциональным эквивалентом является INTERSECT. Предложение CORRESPONDING не поддерживается.

Кроме того, типы данных LONG VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK и структурные типы не применяются в предложении INTERSECT, но их можно использовать в предложении INTERSECT ALL.

Если в результирующем наборе данных есть столбец, имеющий одно и то же имя во всех инструкциях SELECT, то это имя используется в качестве окончательного имени для столбца, возвращаемого инструкцией. Если же в запросах для столбца используются разные имена, то платформа DB2 сгенерирует для результирующего столбца новое имя. После этого становится непригодным для использования в предложениях ORDER BY и FOR UPDATE.

Если в одном запросе используется несколько операторов для работы с наборами данных, то первым выполняется тот, который заключен в скобки. После этого порядок выполнения будет слева направо. Тем не менее все операторы INTERSECT выполняются до операторов UNION и EXCEPT, например:

SELECT
empno
FROM employee
WHERE workdept LIKE «E%»
INTERSECT (SELECT empno
FROM emp_act
WHERE projno IN («IF1000», «IF2000», «AD3110»)
UNION
VALUES
(«AA0001»),
(«AB0002»),
(«AC0003»))

В приведенном выше примере из таблицы employee извлекаются идентификаторы (ID) всех служащих, работающих в департаменте, название которого начинается с «Е». Однако идентификаторы извлекаются только в том случае, если они также существуют в таблице учетных записей служащих с именем emp_act и участвуют в проектах IF1000, IF200″ и AD3110.

DB2

Платформа DB2 поддерживает ключевые слова INTERSECT и INTERSECT ALL стандарта ANSI плюс дополнительное предложение VALUES.

{инструкция._SELECT_7 | VALUES (выраж7 )} INTERSECT

] {инструкция_SCJ_2 | VALUES {выраж2 )} INTERSECT

Хотя инструкция INTERSECT DISTINCT не поддерживается, функциональным эквивалентом является INTERSECT. Предложение CORRESPONDING не поддерживается.

Кроме того, типы данных LONG VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK и структурные типы не применяются в предложении INTERSECT, но их можно использовать в предложении INTERSECT ALL.

Если в результирующем наборе данных есть столбец, имеющий одно и то же имя во всех инструкциях SELECT, то это имя используется в качестве окончательного имени для столбца, возвращаемого инструкцией. Если же в запросах для столбца используются разные имена, то платформа DB2 сгенерирует для результирующего столбца новое имя. После этого становится непригодным для использования в предложениях ORDER BY и FOR UPDATE.

Если в одном запросе используется несколько операторов для работы с наборами данных, то первым выполняется тот, который заключен в скобки. После этого порядок выполнения будет слева направо. Тем не менее все операторы INTERSECT выполняются до операторов UNION и EXCEPT, например:

SELECT
empno
FROM employee
WHERE workdept LIKE «E%»
INTERSECT (SELECT empno
FROM emp_act
WHERE projno IN («IF1000», «IF2000», «AD3110»)
UNION
VALUES
(«AA0001»),
(«AB0002»),
(«AC0003»))

В приведенном выше примере из таблицы employee извлекаются идентификаторы (ID) всех служащих, работающих в департаменте, название которого начинается с «Е». Однако идентификаторы извлекаются только в том случае, если они также существуют в таблице учетных записей служащих с именем emp_act и участвуют в проектах IF1000, IF200″ и AD3110.

This SQL tutorial explains how to use the SQL INTERSECT operator
with syntax and examples.

Using Set Operators

Set operators are used like this:

It uses two (or more) SELECT queries, with a set operator in the middle.

There are a few things to keep in mind though.

When selecting your columns, the number of columns needs to match between queries, and the data type of each column needs to be compatible.

So, if you select three columns in the first query, you need to select three columns in the second query. The data types also need to be compatible, so if you select a number and two character types in the first query, you need to do the same in the second query.

Also, if you want to order your results, the ORDER BY must go at the end of the last query. You can’t add ORDER BY inside each SELECT query before the set operator.

Sample Data

Our sample data for this article uses a customer and employee table.

Customer

first_name last_name
Stephen Jones
Mark Smith
Denise King
Paula Johnson
Richard Archer

Employee

first_name last_name
Christina Jones
Michael McDonald
Paula Johnson
Stephen Jones
Richard Smith

Each of our query examples in this article will use this data.

Оператор CREATE SEQUENCE

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

  • применение свойства ограничивается указанной таблицей;

  • новое значение столбца нельзя получить иным способом, кроме как применив его;

  • свойство IDENTITY можно указать только при создании столбца.

По этим причинам в SQL Server 2012 вводятся последовательности, которые обладают той же семантикой, что и свойство IDENTITY, но при этом не имеют ранее перечисленных недостатков. В данном контексте последовательностью называется функциональность базы данных, позволяющая указывать значения счетчика для разных объектов базы данных, таких как столбцы и переменные.

Последовательности создаются с помощью инструкции CREATE SEQUENCE. Инструкция CREATE SEQUENCE определена в стандарте SQL и поддерживается другими реляционными системами баз данных, такими как IBM DB2 и Oracle.

В пример ниже показано создание последовательности в SQL Server:

В примере выше значения последовательности Sequence1 создаются автоматически системой, начиная со значения 1 с шагом 5 для каждого последующего значения. Таким образом, в предложении START указывается начальное значение, а в предложении INCREMENT — шаг. (Шаг может быть как положительным, так и отрицательным.)

В следующих двух, необязательных, предложениях MINVALUE и MAXVALUE указываются минимальное и максимальное значение объекта последовательности

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

Основной особенностью последовательностей является их независимость от таблиц, т.е. их можно использовать с любыми объектами базы данных, такими как столбцы таблицы или переменные. (Это свойство положительно влияет на хранение и, соответственно, на производительность. Определенную последовательность хранить не требуется; сохраняется только ее последнее значение.)

Новые значения последовательности создаются с помощью выражения NEXT VALUE FOR, применение которого показано в примере ниже:

С помощью выражения NEXT VALUE FOR можно присвоить результат последовательности переменной или ячейке столбца. В примере ниже показано использование этого выражения для присвоения результатов столбцу:

В примере выше сначала создается таблица Product, состоящая из четырех столбцов. Далее, две инструкции INSERT вставляют в эту таблицу две строки. Первые две ячейки первого столбца будут иметь значения 11 и 16.

В примере ниже показано использование представления каталога sys.sequences для просмотра текущего значения последовательности, не используя его:

Обычно выражение NEXT VALUE FOR применяется в инструкции INSERT, чтобы система вставляла созданные значения. Это выражение также можно использовать, как часть многострочного запроса с помощью предложения OVER.

Для изменения свойства существующей последовательности применяется инструкция ALTER SEQUENCE. Одно из наиболее важных применений этой инструкции связано с параметром RESTART WITH, который переустанавливает указанную последовательность. В примере ниже показано использование инструкции ALTER SEQUENCE для переустановки почти всех свойств последовательности Sequence1:

Удаляется последовательность с помощью инструкции DROP SEQUENCE.

Ключевые слова SQL SOME | ANY и ALL

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

Решение: 

Исходные данные таблиц:

Таблица product:
Таблица pc:

Решение:

1
2
3
4
5
6
7
SELECT DISTINCT Производитель
FROM product
WHERE Тип =  "Компьютер"
AND NOT Номер = ANY(
 SELECT Номер
 FROM pc
)

Результат:

В примере предикат вернет в том случае значение TRUE, когда Номер из основного запроса найдется в списке Номеров таблицы (возвращаемом подзапросом). Кроме того, используется . Результирующий набор будет состоять из одного столбца — Производитель. Чтобы один производитель не выводился несколько раз, введено служебное слово .
Теперь рассмотрим использование ключевого слова ALL:

Пример: Найти номера и цены ноутбуков, стоимость которых превышает стоимость любого компьютера

Решение: 

1
2
3
4
5
6
7
SELECT DISTINCT Номер, Цена
FROM notebook
WHERE Цена > 
ALL (
  SELECT цена
  FROM pc
)

Результат:

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

Пример: Найти номера и цены компьютеров, стоимость которых превышает минимальную стоимость ноутбуков. Решение: 

Решение: 

1
2
3
4
5
SELECT DISTINCT  `Номер` ,  `Цена` 
FROM  `pc` 
WHERE  `Цена` > ( 
  SELECT MIN(`Цена`) 
  FROM notebook)

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

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Вадлейд
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: