1. 程式人生 > >SQL學習—多張表之間的組合

SQL學習—多張表之間的組合

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;

讓我們總結一下:

JOIN 如果連線條件為true,將組合來自不同表的行。

LEFT JOIN將返回表中的每一行,如果不滿足連線條件,NULL則使用值來填充表中的列。

主鍵是一個列,用於為表中的行提供唯一識別符號。

外來鍵是包含另一個表的主鍵的列。

CROSS JOIN 讓我們將一個表的所有行與另一個表的所有行組合在一起。

UNION 將一個數據集堆疊在另一個數據集之上。

WITH 允許我們定義一個或多個可以在最終查詢中使用的臨時表。