Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных / БД2012 / Understanding.SQL.doc
Скачиваний:
283
Добавлен:
28.03.2015
Размер:
1.75 Mб
Скачать

Глава 11

1. SELECT cnum, cname

FROM Customers outer

WHERE rating =

(SELECT MAX (rating)

FROM Customers inner

WHERE inner.city = outer.city);

2. Решение с помощью соотнесенного подзапроса:

SELECT snum, sname

FROM Salespeople main

WHERE city IN

(SELECT city

FROM Customers inner

WHERE inner.snum < > main.snum);

Решение с помощью объединения:

SELECT DISTINCT first.snum, sname

FROM Salespeople first, Customers second

WHERE first.city = second.city

AND first.snum < > second.snum;

Соотнесенный подзапрос находит всех заказчиков, не обслуживаемых данным продавцом, и выясняет: живет ли кто-нибудь из их в его городе. Решение с помощью объединения является более простым и более инту- итивным. Оно находит случаи где пол city совпадают, а пол snums нет. Следовательно объединение является более изящным решением для этой проблемы, чем то которое мы исследовали до этого. Имеется еще более изящное решение с помощью подзапроса, с которым Вы столкнетесь позже.

Глава 12

1. SELECT *

FROM Salespeople first

WHERE EXISTS

(SELECT *

FROM Customers second

WHERE first.snum = second.snum

AND rating = 300);

2. SELECT a.snum, sname, a.city, comm

FROM Salespeople a, Customers b

WHERE a.snum = b.snum

AND b.rating = 300;

3. SELECT *

FROM Salespeople a

WHERE EXISTS

(SELECT *

FROM Customers b

WHERE b.city = a.city

AND a.snum < > b.snum);

4. SELECT *

FROM Customers a

WHERE EXISTS

(SELECT *

FROM Orders b

WHERE a.snum = b.snum

AND a.cnum < > b.cnum)

Глава 13

1. SELECT *

FROM Customers

WHERE rating > = ANY

(SELECT rating

FROM Customers

WHERE snum = 1002);

2. cnum cname city rating snum

2002 Giovanni Rome 200 1003

2003 Liu San Jose 200 1002

2004 Grass Berlin 300 1002

2008 Cisneros SanJose 300 1007

3. SELECT *

FROM Salespeople

WHERE city < > ALL

(SELECT city

FROM Customers);

или

SELECT *

FROM Salespeople

WHERE NOT city = ANY

(SELECT city

FROM Customers);

4. SELECT *

FROM Orders

WHERE amt > ALL

(SELECT amt

FROM Orders a, Customers b

WHERE a.cnum = b.cnum

AND b.city = 'London');

5. SELECT *

FROM Orders

WHERE amt >

(SELECT MAX (amt)

FROM Orders a, Customers b

WHERE a.cnum = b.cnum

AND b.city = 'London');

Глава 14

1. SELECT cname, city, rating, 'High Rating'

FROM Customers

WHERE rating > = 200

UNION

SELECT cname, city, rating, ' Low Ratlng'

FROM Customers

WHERE rating < 200;

или

SELECT cname, city, rating, 'High Rating'

FROM Customers

WHERE rating > = 200

UNION

SELECT cname, city, rating, ' Low Rating'

FROM Customers

WHERE NOT rating > = 200;

Различие между этими двум предложениями, в форме второго предиката. Обратите внимание что, в обоих случаях, строка "Low Rating" имеет в начале дополнительный пробел для того чтобы совпадать со строкой "High Rating" по длине.

2. SELECT cnum, cname

FROM Customers a

WHERE 1 <

(SELECT COUNT (-)

FROM Orders b

WHERE a.cnum = b.cnum)

UNION

SELECT snum, sname

FROM Salespeople a

WHERE 1 <

(SELECT COUNT (*)

FROM Orders b

WHERE a.snum = b.snum)

ORDER BY 2;

3. SELECT snum

FROM Salespeople

WHERE city = 'San Jose'

UNION

(SELECT cnum

FROM Customers

WHERE city = 'San Jose'

UNION ALL

SELECT onum

FROM Orders

WHERE odate = 10/03/1990);

Соседние файлы в папке БД2012