Изучаем sql


SELECT days.dt, COUNT(a.account_id)



Pdf көрінісі
бет189/261
Дата28.07.2022
өлшемі1,6 Mb.
#147825
1   ...   185   186   187   188   189   190   191   192   ...   261
Байланысты:
Изучаем SQL ( PDFDrive )

SELECT days.dt, COUNT(a.account_id)
> FROM account a RIGHT OUTER JOIN
> (SELECT DATE_ADD('20040101',
> INTERVAL (ones.num + tens.num + hundreds.num) DAY) dt
> FROM
> (SELECT 0 num UNION ALL
> SELECT 1 num UNION ALL
> SELECT 2 num UNION ALL
> SELECT 3 num UNION ALL
> SELECT 4 num UNION ALL
> SELECT 5 num UNION ALL
> SELECT 6 num UNION ALL
> SELECT 7 num UNION ALL
> SELECT 8 num UNION ALL
> SELECT 9 num) ones
> CROSS JOIN


Перекрестные соединения
211
> (SELECT 0 num UNION ALL
> SELECT 10 num UNION ALL
> SELECT 20 num UNION ALL
> SELECT 30 num UNION ALL
> SELECT 40 num UNION ALL
> SELECT 50 num UNION ALL
> SELECT 60 num UNION ALL
> SELECT 70 num UNION ALL
> SELECT 80 num UNION ALL
> SELECT 90 num) tens
> CROSS JOIN
> (SELECT 0 num UNION ALL
> SELECT 100 num UNION ALL
> SELECT 200 num UNION ALL
> SELECT 300 num) hundreds
> WHERE DATE_ADD('20040101',
> INTERVAL (ones.num + tens.num + hundreds.num) DAY) <
> '20050101') days
> ON days.dt = a.open_date
> GROUP BY days.dt;
+++
| dt | COUNT(a.account_id) |
+++
| 20040101 | 0 |
| 20040102 | 0 |
| 20040103 | 0 |
| 20040104 | 0 |
| 20040105 | 0 |
| 20040106 | 0 |
| 20040107 | 0 |
| 20040108 | 0 |
| 20040109 | 0 |
| 20040110 | 0 |
| 20040111 | 0 |
| 20040112 | 1 |
| 20040113 | 0 |
| 20040114 | 0 |
| 20040115 | 0 |
...
...
...
| 20041215 | 0 |
| 20041216 | 0 |
| 20041217 | 0 |
| 20041218 | 0 |
| 20041219 | 0 |
| 20041220 | 0 |
| 20041221 | 0 |
| 20041222 | 0 |
| 20041223 | 0 |
| 20041224 | 0 |


212
Глава 10. И снова соединения
| 20041225 | 0 |
| 20041226 | 0 |
| 20041227 | 0 |
| 20041228 | 1 |
| 20041229 | 0 |
| 20041230 | 0 |
| 20041231 | 0 |
+++
366 rows in set (0.03 sec)
Это один из самых интересных запросов, встречавшихся до сих пор
в данной книге. Его ценность в том, что он включает перекрестные со
единения, внешние соединения, функцию работы с датами, группи
ровку, операции с множествами (
union
all
) и агрегатную функцию
(
count()
). Это не самое элегантное решение заданной проблемы, но оно
послужит примером того, как с небольшой долей творчества и твер
дым знанием языка программирования даже такой редко используе
мый механизм, как перекрестные соединения, можно сделать могуще
ственным инструментом в наборе инструментов SQL.
Естественные соединения
Если вы ленивы (а кто не ленив?), можно выбрать тип соединения, при
котором сервер БД сам определяет необходимые условия соединения
указанных вами таблиц. Известный как 
естественное соединение 
(
na
tural join
), этот тип соединения делает предположение о необходимых
условиях соединения, полагаясь на идентичные имена столбцов в таб
лицах. Например, таблица 
account
включает столбец 
cust_id
, являю
щийся внешним ключом к таблице 
customer
, первичный ключ которой
также имеет имя 
cust_id
. Таким образом, можно написать запрос, ис
пользующий для соединения этих двух таблиц 
natural
join
:
mysql> 


Достарыңызбен бөлісу:
1   ...   185   186   187   188   189   190   191   192   ...   261




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет