Грубер Мартин
Шрифт:
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 значение большее чем наименьшее выбранное значение.
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-е Октября
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' );
WHERE amt < (SELECT MAX (amt) FROM Orders a, Customers b
WHERE a.cnum=b.cnum AND b.city='San Jose');
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.8: Использование агрегатной функции вместо ANY
С помощью ALL, предикат является верным, если каждое значение выбранное подзапросом удовлетворяет условию в предикате внешнего запроса.
Если мы хотим пересмотреть наш предыдущий пример чтобы вывести только тех заказчиков чьи оценки, фактически, выше чем у каждого заказчика в Париже, мы можем ввести следующее чтобы произвести вывод показанный в Таблтце 13.9:
SELECT *
FROM Customers
WHERE rating > ALL
(SELECT rating
FROM Customers
WHERE city=Rome ):
SELECT * FROM Customers WHERE rating > ALL
(SELECT rating FROM Customers WHERE city='Rome');
cnum | cname | city | rating | snum |
2004 | Grass | Berlin | 300 | 1002 |
2008 | Cisneros | San Jose | 300 | 1007 |
Таблица 13.9: Использование оператора ALL
Этот оператор проверяет значения оценки всех заказчиков в Риме. Затем он находит заказчиков с оценкой большей чем у любого из заказчиков в Риме. Самая высокая оценка в Риме - у Giovanni( 200). Следовательно, выбираются только значения выше этих 200.
Как и в случае с ANY, мы можем использовать EXISTS для производства альтернативной формулировки такого же запроса - (вывод показан в Таблице 13.10 ):
SELECT *