SQL學習—多張表之間的組合
阿新 • • 發佈:2018-12-14
1.JOIN (Inner Join)
因為不同表之間的column名可能會重疊,所以用table_name.column_name=table_name.column_name這種方式
SELECT *
FROM orders
JOIN customers
ON orders.customer_id = customers.customer_id;
這是一種Inner Joins 內聯合 有可能出現數據丟失
2.LEFT JOIN
左邊的資料一定不會丟失
SELECT * FROM newspaper LEFT JOIN online ON newspaper.id=online.id; SELECT * FROM newspaper LEFT JOIN online ON newspaper.id = online.id WHERE online.id IS NULL;
3 Primary Key vs Foreign Key
當一個表的主鍵出現在另外一張表中時被稱為外來鍵
SELECT *
FROM classes
JOIN students
ON classes.id = students.class_id;
4.Cross Join
類似於交叉排列
襯衣顏色有3種 褲子顏色有2種 交叉組合有6種組合
SELECT shirts.shirt_color,
pants.pants_color
FROM shirts
CROSS JOIN pants;
looks like
shirt_color | pants_color |
---|---|
white | light denim |
white | black |
grey | light denim |
grey | black |
olive | light denim |
olive | black |
統計每個月的訂閱 思考流程
1.某一個月訂閱量
2.交叉聯合 cross join
3.進行條件限制
4.使用select
select count(*)
from newspaper
where start_month<=3
and end_month >=3;
SELECT *
FROM newspaper
CROSS JOIN months;
SELECT *
FROM newspaper
CROSS JOIN months
where start_month<=month
and end_month >=month;
SELECT month,
COUNT(*)
FROM newspaper
CROSS JOIN months
where start_month<=month
and end_month >=month
GROUP BY month;
5.Union
單純的堆疊 使用於列相同的表
select *
from newspaper
UNION
select *
from online;
6.WITH
想要組合兩個表但是一個表示計算後的結果
WITH previous_results AS (
SELECT ...
...
...
...
)
SELECT *
FROM previous_results
JOIN customers
ON _____ = _____;
WITH previous_query AS(
SELECT customer_id,
COUNT(subscription_id) AS 'subscriptions'
FROM orders
GROUP BY customer_id
)
SELECT customers.customer_name,
previous_query.subscriptions
FROM previous_query
JOIN customers
ON previous_query.customer_id = customers.customer_id;
讓我們總結一下: