ЗАПРОСЫ ПО НЕСКОЛЬКИМ ТАБЛИЦАМ
Комбинация текста, значений поля, и функций
SELECT snum, sname, city, '%', comm * 100
Вставка символов в вывод запроса
SELECT snum, sname, city, comm*100
FROM Salespeople;
snum sname city
------ --------- ----------- ---------
1001 Peel London 12.000000
1002 Serres San Jose 13.000000
1004 Motika London 11.000000
1007 Rifkin Barcelona 15.000000
1003 Axelrod New York 10.000000
1 + 2 'A' + 'B'
FROM Salespeople;
snum sname city
------ -------- ----------- ---- ---------
1001 Peel London % 12.000000
1002 Serres San Jose % 13.000000
1004 Motika London % 11.000000
1007 Rifkin Barcelona % 15.000000
1003 Axelrod New York % 10.000000
SELECT 'For', odate, ', ' there are ',
COUNT (DISTINCT onum), ' orders '
FROM Orders
GROUP BY odate;
odate
------ ---------- --------- ------ -------
For 10/03/1990 , there are 5 orders.
For 10/04/1990 , there are 2 orders.
For 10/05/1990 , there are 1 orders.
For 10/06/1990 , there are 2 orders.
УПОРЯДОЧЕНИЕ ВЫВОДА ПОЛЕЙ
ORDER BY
ASC - возрастание
DESC - убывание
Упорядочение вывода с помощью убывания
SELECT *
FROM Orders
ORDER BY cnum DESC;
===============================
onum amt odate cnum snum
------ -------- ---------- ----- -----
3001 18.69 10/03/1999 2008 1007
3006 1098.16 10/03/1999 2008 1007
3002 1900.10 10/03/1999 2007 1004
3008 4723.00 10/05/1999 2006 1001
3011 9891.88 10/06/1999 2006 1001
3007 75.75 10/04/1999 2004 1002
3010 1309.95 10/06/1999 2004 1002
3005 5160.45 10/03/1999 2003 1002
3009 1713.23 10/04/1999 2002 1003
3003 767.19 10/03/1999 2001 1001
================================
Упорядочение с помощью нескольких столбцов
SELECT *
FROM Orders
ORDER BY cnum DESC, amt DESC;
==============================
onum amt odate cnum snum
------ -------- ---------- ----- -----
3006 1098.16 10/03/1999 2008 1007
3001 18.69 10/03/1999 2008 1007
3002 1900.10 10/03/1999 2007 1004
3011 9891.88 10/06/1999 2006 1001
3008 4723.00 10/05/1999 2006 1001
3010 1309.95 10/06/1999 2004 1002
3007 75.75 10/04/1999 2004 1002
3005 5160.45 10/03/1999 2003 1002
3009 1713.23 10/04/1999 2002 1003
3003 767.19 10/03/1999 2001 1001
===============================
УПОРЯДОЧЕНИЕ ГРУПП
ORDER BY может использоваться с
GROUP BY для упорядочения групп.
SELECT snum, odate, MAX (amt)
FROM Orders
GROUP BY snum, odate
ORDER BY snum;
=====================
snum odate amt
----- ---------- --------
1001 10/06/1999 767.19
1001 10/05/1999 4723.00
1001 10/05/1999 9891.88
1002 10/06/1999 5160.45
1002 10/04/1999 75.75
1002 10/03/1999 1309.95
1003 10/04/1999 1713.23
1004 10/03/1999 1900.10
1007 10/03/1999 1098.16
=====================
УПОРЯДОЧЕНИЕ АГРЕГАТНЫХ ГРУПП
SELECT snum, odate, MAX (amt)
FROM Orders
GROUP BY snum, odate
ORDER BY snum;
========================
snum odate amt
----- ---------- --------
1001 10/06/1990 767.19
1001 10/05/1990 4723.00
1001 10/05/1990 9891.88
1002 10/06/1990 5160.45
1002 10/04/1990 75.75
1002 10/03/1990 1309.95
1003 10/04/1990 1713.23
1004 10/03/1990 1900.10
1007 10/03/1990 1098.16
=========================
Þ Вместо имен полей, можно использовать их порядковые номера
SELECT sname, comm
FROM Salespeople
ORDER BY 2 DESC;
sname comm
-------- --------
Peel 0.17
Serres 0.13
Rifkin 0.15
Упорядочение с помощью столбца вывода
SELECT snum, COUNT ( DISTINCT onum )
FROM Orders
GROUP BY snum
ORDER BY 2 DESC;
snum
----- ----------
1001 3
1002 3
1007 2
1003 1
1004 1
===============
ИМЕНА ТАБЛИЦ И СТОЛБЦОВ
Salespeople.snum
Salespeople.city
Orders.odate
СОЗДАНИЕ ОБЬЕДИНЕНИЯ
SELECT Customers.cname, Salespeople.sname,
Salespeople.city
FROM Salespeople, Customers
WHERE Salespeople.city = Customers.city
=========================
cname cname city
------- -------- ----
Hoffman Peel London
Liu Serres San Jose
Cisneros Serres San Jose
Hoffman Motika London
Clemens Motika London
===========================
Þ ОБЪЕДИНЕНИЕ ТАБЛИЦ ЧЕРЕЗ СПРАВОЧНУЮ ЦЕЛОСТНОСТЬ
SELECT Customers.cname, Salespeople.sname,
FROM Salespeople, Customers
WHERE Salespeople.snum = Customers.snum
==================
cname sname
------- --------
Hoffman Peel
Giovanni Axelrod
Liu Serres
Grass Serres
Clemens Peel
Cisneros Rifkin
Pereira Motika
===================
Þ ОБЪЕДИНЕНИЕ, ОСНОВАННОЕ НА НЕРАВЕНСТВЕ
SELECT sname, cname
FROM Salespeople, Customers
WHERE sname < cname AND rating < 200;
==============
sname cname
-------- -------
Peel Pereira
Motika Pereira
Axelrod Hoffman
Axelrod Clemens
Axelrod Pereira
===============
* ОБЪЕДИНЕНИЕ БОЛЕЕ ДВУХ ТАБЛИЦ
SELECT onum, cname, Orders.cnum,
Orders.snum
FROM Salespeople, Customers, Orders
WHERE Customers.city < > Salespeople.city
AND Orders.cnum = Customers.cnum
AND Orders.snum = Salespeople.snum;
=========================
onum cname cnum snum
------ ------- ----- -----
3001 Cisneros 2008 1007
3002 Pereira 2007 1004
3006 Cisneros 2008 1007
3009 Giovanni 2002 1003
3007 Grass 2004 1002
3010 Grass 2004 1002
=========================
SELECT имя_таблицы.имя_столбца[, . ..]
FROM {имя-таблицы
[тип-объединения]JOIN имя-таблицы
ON условие-поиска}[, ...]
WHERE условие-поиска;
ТИПЫ ОПЕРАТОРА ОБЪЕДИНЕНИЯ:
INNER JOIN (внутреннее объединение),
OUTER JOIN (внешнее объединение),
CROSS JOIN (перекрестное объединение).
Внутреннее объединение
· объединениями по эквивалентности
SELECT onum, amt, cnum, cname
FROM Orders INNER JOIN Customers
ON Orders.cnum = Customers.cnum;
· Естественное объединение
SELECT Orders.*, cname
FROM Orders
INNER JOIN Customers
ON Orders.cnum = Customers.cnum;
Перекрестные и неограниченные объединения
Декартовое произведение
A
| B
|
|
|
|
С
| D
|
|
|
|
Е
| F
|
|
|
|
Д
| В
|
|
|
|
С
| D
|
|
|
|
Е
| F
|
|
|
|
Д
| В
|
|
|
|
С
| D
|
|
|
|
Е
| F
|
|
|
|
text или image
Старый синтаксис ANSI:
SELECT Orders.onum, Salespeople.snum
FROM Orders, Salespeople
Предпочтительный синтаксис ANSI:
SELECT Orders.onum, Salespeople.snum
FROM Orders CROSS JOIN Salespeople
Внешнее объединение
SELECT Custorners. cnum, Orders.onum
FROM Custorners, Orders
WHERE Custorners. cnum *= Orders. cnum
SELECT Orders.onum, Custorners. cnum
FROM Orders, Custorners
WHERE Orders. cnum =* Custorners.cnum
*= включает все строки первой таблицы и только сопоставимые строки второй таблицы (левое внешнее объединение).
=* включает все строки второй таблицы и только сопоставимые строки первой таблицы (правое внешнее объединение).
Стандарт ANSI:
· LEFT OUTER JOIN - Включает все строки первой таблицы и только сопоставимые строки второй таблицы.
· RIGHT OUTER JOIN - Включает все строки второй таблицы и только сопоставимые строки первой таблицы.
· FULL OUTER JOIN - Включает все сопоставимые и несопоставимые строки обеих таблиц.
SELECT Custorners.cnum, Orders.onum
FROM Custorners LEFT OUTER JOIN Orders
ON Custorners.cnum= Orders.cnum
SELECT Custorners.cnum, Orders.onum
FROM Custorners RIGHT OUTER JOIN Orders
ON Custorners.cnum= Orders.cnum
SELECT Custorners.cnum, Orders.onum
FROM Custorners FULL OUTER JOIN Orders
ON Custorners.cnum= Orders.cnum
СУБД Access, MySQL и Sybase.
Самообъединения
SELECT c1.snum, c1.cnum, c1.cnаme
FROM Custorners AS c1, Custorners AS c2
WHERE c1.snum=c2.snum
AND c2.cname= “Clemens”
SELECT c1.cnаme, c2.city
FROM Custorners AS c1, Custorners AS c2
WHERE c1.city = c2.city