loading..
Русский    English
11:22
листать

Предикаты I стр. 3

Предикат в предложении WHERE выполняет реляционную операцию ограничения, т.е. строки, появляющиеся на выходе предложения FROM ограничиваются теми, для которых предикат дает значение TRUE.

Если cond1 и cond2 являются простыми условиями, то ограничение по предикату

cond1 AND cond2

эквивалентно пересечению ограничений по каждому из предикатов.

Ограничение по предикату

cond1 OR cond2

эквивалентно объединению ограничений по каждому из предикатов, а ограничение по предикату

NOT cond1

эквивалентно взятию разности, когда от исходного отношения вычитается ограничение по предикату cond1.

Обратимся к примерам.

Получить информацию о моделях ПК производителя A.

Здесь

cond1: maker = 'A' ,

cond2: type = 'pc'.

cond1 AND cond2

Консоль
Выполнить
  1. SELECT * FROM product
  2. WHERE maker = 'A' AND type = 'pc';

Пересечение

Консоль
Выполнить
  1. SELECT * FROM product
  2. WHERE maker = 'A'
  3. INTERSECT
  4. SELECT * FROM product
  5. WHERE type = 'pc';

Получить информацию о моделях производителей A и B.

Здесь

cond1: maker = 'A' ,

cond2: maker = 'B'.

cond1 OR cond2

Консоль
Выполнить
  1. SELECT * FROM product
  2. WHERE maker = 'A' OR maker = 'B';

Объединение

Консоль
Выполнить
  1. SELECT * FROM product
  2. WHERE maker = 'A'
  3. UNION
  4. SELECT * FROM product
  5. WHERE maker = 'B';

В свою очередь, условия condX могут не быть простыми. Например,

Получить информацию о моделях ПК производителей A и B.

Решение

Консоль
Выполнить
  1. SELECT * FROM product
  2. WHERE (maker = 'A' OR maker = 'B') AND type = 'pc';
можно выразить через пересечение

Консоль
Выполнить
  1. SELECT * FROM product
  2. WHERE maker = 'A' OR maker = 'B'
  3. INTERSECT
  4. SELECT * FROM product
  5. WHERE  type = 'pc';
а его эквивалентную форму

Консоль
Выполнить
  1. SELECT * FROM product
  2. WHERE (maker = 'A' AND type = 'pc')
  3.     OR (maker = 'B' AND type = 'pc');
через объединение

Консоль
Выполнить
  1. SELECT * FROM product
  2. WHERE maker = 'A' AND type = 'pc'
  3. UNION
  4. SELECT * FROM product
  5. WHERE maker = 'B' AND type = 'pc';

Найти модели, которые не являются ПК

Здесь

cond1: type = 'pc'

NOT cond1

Консоль
Выполнить
  1. SELECT * FROM product
  2. WHERE NOT type = 'pc';

Разность

Консоль
Выполнить
  1. SELECT * FROM product
  2. EXCEPT
  3. SELECT * FROM product WHERE type = 'pc';

Несколько слов о производительности

Если на столбцах, по которым выполняется ограничение нет индексов, при выполнении запроса будет выполнено сканирование таблицы. В первых вариантах решений такое сканирование будет выполнено один раз, в то время как в решениях на основе объединения, пересечения и разности запросов таблица сканируется дважды, плюс будет выполнена операция, сравнивающая наборы строк, возвращаемые каждым из запросов (например, Nested Loops). Это делает запрос менее производительным, хотя, возможно, существуют оптимизаторы, способные построить один и тот же план в двух сравниваемых нами случаях.

Bookmark and Share
Страницы: 1 2 3
Развернуть всё
Свернуть всё

Содержание:

Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
месяц назад
https://exchangesumo.com/obmen/PRRUB-YAMRUB/
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.