Чтение онлайн

на главную - закладки

Жанры

Понимание SQL

Грубер Мартин

Шрифт:

Основная причина для формулировки EXISTS как альтернативы ANY и ALL в том что ANY и ALL могут быть несколько неоднозначен, из-за способа использования этого термина в Английском языке, как вы это скоро увидите. С приходом понимания различия способов формулирования данного запроса, вы сможете поработать над процедурами которые сейчас кажутся Вам трудными или неудобными.

КАК ANY МОЖЕТ СТАТЬ НЕОДНОЗНАЧНЫМ

Как подразумевалось выше, ANY не полностью однозначен. Если мы создаем запрос чтобы выбрать заказчиков которые имеют больший рейтинг чем любой заказчик в Риме, мы можем получить вывод который несколько отличался бы от того что мы ожидали (как показано в Таблице 13.5 ):

SELECT *

FROM Customers

WHERE rating > ANY

( SELECT rating

FROM Customers

WHERE city=Rome );

В английском языке, способ которым мы обычно склонны интерпретировать

оценку " больше чем любой (где city=Rome ) ", должен вам сообщить что это значение оценки должно быть выше чем значение оценки в каждом случае где значение city=Rome. Однако это не так, в случае ANY - используемом в SQL . ANY оценивает как верно, если подзапрос находит любое значение которое делает условие верным.

SQL Execution Log

SELECT * FROM Customers WHERE rating > ANY

(SELECT rating FROM Customers WHERE city='Rome');

cnum

cname

city

rating

snum

2002

Giovanni

Rome

200

1003

2003

Liu

San Jose

200

1002

2004

Grass

Berlin

300

1002

2008

Cisneros

San Jose

300

1007

Таблица 13.5 Как оператор "больше чем" (>) интерпретируется ANY

Если мы оценим ANY способом использующим грамматику Английского Языка, то только заказчики с оценкой 300 будут превышать Giovanni, который находится в Риме и имеет оценку 200. Однако, подзапрос ANY также находит Periera в Риме с оценкой 100. Так как все заказчики с оценкой 200 были выше этой, они будут выбраны, даже если имелся другой заказчик из Рима(Giovanni) чья оценка не была выше (фактически, то что один из выбранных заказчиков также находится в Риме несущественно).

Так как подзапрос произвел по крайней мере одно значение которое сделает предикат верным в отношении этих строк, строки были выбраны. Чтобы дать другой пример, предположим что мы должны были выбирать все порядки сумм приоретений которые были больше чем по крайней мере один из порядков на 6-е Октября:

SELECT *

FROM Orders

WHERE amt > ANY

( SELECT amt

FROM Orders

WHERE odate=10/06/1990 );

Вывод для этого запроса показывается в Таблице 13.6.

Даже если самая высокая сумма приобретений в таблице (9891.88) - имелась на 6-е Октября, предыдущая строка имеет более высокое значение суммы чем другая строка на 6-е Октября, которая имела значение суммы=1309.95. Имея реляционный оператор ">=" вместо просто " > ", эта строка будет также выбирана, потому что она равна самой себе.

Конечно, вы можете использовать ANY с другой SQL техникой, например с техникой обьединения. Этот запрос будет находить все порядки со значением суммы меньшей чем значение любой суммы для заказчика в San Jose (вывод показывается в Таблице 13.7):

SELECT *

FROM Orders

WHERE amt < ANY

( SELECT amt

FROM Orders A, Customers b

WHERE a.cnum=b.cnum

AND b.city=" San Jose' );

Даже если нименьший порядок в таблице был для заказчика из San Jose, то был второй наибольший; следовательно почти все строки будут выбраны. Простой способ запомнить, что < ANY значение меньшее чем наибольшее выбранное значение, а > ANY значение большее чем наименьшее выбранное значение.

SQL Execution Log

SELECT * FROM Orders WHERE amt > ANY

(SELECT amt FROM Orders WHERE odate=10/06/1990);

onum

amt

odate

cnum

snum

3002

1900.10

10/03/1990

2007

1004

3005

5160.45

10/03/1990

2003

1002

3009

1713.23

10/04/1990

2002

1003

3008

4723.00

10/05/1990

2006

1001

3011

9891.88

10/06/1990

2006

1001

Таблица 13. 6:

Выбранное значение больше чем любое(ANY) на 6-е Октября

SQL Execution Log

WHERE amt > ANY (SELECT amt FROM Orders a, Customers b

WHERE a.cnum=b.cnum AND b.city='San Jose');

onum

amt

odate

cnum

snum

3001

18.69

10/03/1990

2008

1007

3003

767.10

10/03/1990

2001

1001

3002

1900.10

10/03/1990

2007

1004

3006

1098.10

10/03/1990

2008

1007

3009

1713.23

10/04/1990

2002

1003

3007

75.10

10/04/1990

2004

1002

3008

4723.00

10/05/1990

2006

1001

3010

1309.88

10/06/1990

2004

1002

Таблица 13. 7: Использование ANY с объединением

Фактически, вышеуказанные команды весьма похожи на следующее - (вывод показан в Таблице 13.8) :

SELECT *

FROM Orders

WHERE amt <

( SELECT MAX amt

FROM Orders A, Customers b

WHERE a.cnum=b.cnum

AND b.city=" San Jose' );

SQL Execution Log

WHERE amt < (SELECT MAX (amt) FROM Orders a, Customers b

WHERE a.cnum=b.cnum AND b.city='San Jose');

Поделиться:
Популярные книги

Виконт. Книга 1. Второе рождение

Юллем Евгений
1. Псевдоним `Испанец`
Фантастика:
фэнтези
боевая фантастика
попаданцы
6.67
рейтинг книги
Виконт. Книга 1. Второе рождение

Чужак из ниоткуда 3

Евтушенко Алексей Анатольевич
3. Чужак из ниоткуда
Фантастика:
космическая фантастика
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда 3

Зодчий. Книга II

Погуляй Юрий Александрович
2. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга II

Барон отрицает правила

Ренгач Евгений
13. Закон сильного
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Барон отрицает правила

Древесный маг Орловского княжества

Павлов Игорь Васильевич
1. Орловское княжество
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Личный аптекарь императора. Том 5

Карелин Сергей Витальевич
5. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
7.50
рейтинг книги
Личный аптекарь императора. Том 5

На границе империй. Том 8. Часть 2

INDIGO
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Дважды одаренный

Тарс Элиан
1. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Дважды одаренный

Эволюционер из трущоб. Том 8

Панарин Антон
8. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 8

По прозвищу Святой. Книга вторая

Евтушенко Алексей Анатольевич
2. Святой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
По прозвищу Святой. Книга вторая

Гримуар темного лорда VIII

Грехов Тимофей
8. Гримуар темного лорда
Фантастика:
боевая фантастика
альтернативная история
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Гримуар темного лорда VIII

Неудержимый. Книга XXIX

Боярский Андрей
29. Неудержимый
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Неудержимый. Книга XXIX