Mosh Mysql 學習筆記(三) 連線

2021-10-08 03:12:56 字數 3938 閱讀 2960

課程是國外mosh hamedani 的付費mysql課程。 該課程乾貨滿滿,沒有廢話。並且授課方式目的性強,適合各個基礎的學生。 課程在b站有搬運,大家動動手就可以找到~~ 希望能幫助到各位同學

本章覆蓋了mysql中的所有連線方式,包括內連線,外連線,自連線,多表連線,跨資料庫連線,聯合,自然連線,交叉連線。

第一節 內連線

為了資料的穩定性和可維護性,我們通常把每一種資料(比如customers)抽離形成單獨的表,比如在orders表中我們通過customer_id來標註是哪乙個客戶下的訂單,而不是使用使用者的名字。因為使用者可能在將來修改自己的位址,名字等屬性,這就會造成表的高度耦合。 通過抽離我們可以直接在customer表中修改客戶屬性來實現資料的更新,不需要我們在orders表中修改客戶的屬性。

首先我們觀察orders表的資料。

我們可以觀察到這裡我們看不見使用者的具體資訊,所以我們要通過連線orders表和customers表來在同乙個表(結果集)中展示訂單和使用者的具體資訊

select 

o.order_id,c.first_name

from

sql_store.orders o

join

customers c on o.customer_id = c.customer_id //這樣我們就實現了在一張表中展示訂單號和下訂單的客戶名

章節練習

在一張表中展示訂單號,具體的產品名字,數量,單價

第二節 跨資料庫連線

這個比較簡單,只需要在表的前面加上具體資料庫的字首便可

select oi.order_id,p.name,oi.quantity,oi.unit_price from 

sql_store.order_items oi// 注意這兩行**,這裡把products表移到了另乙個資料庫,我們利用字首關聯了跨資料庫的兩張表

join sql_inventory.products p //注意這兩行**,這裡把products表移到了另乙個資料庫,我們利用字首關聯了跨資料庫的兩張表

on oi.product_id = p.product_id

第三節 自連線

首先我們觀察目標資料,這是一張employee**,裡面記錄了員工的基本資訊。請重點觀察reports_to列,這裡記錄了每乙個員工的匯報物件。恰好這個物件就是37270,這個人沒有匯報物件。所以我們可以自連線本表,把每個員工的匯報物件替換成乙個具體的人名。

第三節 多表連線

在orders表中,有status 狀態一列屬性,用於標註訂單的狀態資訊。

在之前的章節中,我們通過連線orders.customer_id = customers.customer_id實現了在一張**顯示 訂單編號和具體的客戶名字,現在我們可以通過order.status = order_statues.status_id 在同一張表上顯示 訂單編號和頂帶狀態

select

*from sql_store.orders o

join customers c on o.customer_id = c.customer_id

join order_statuses os on o.

status

= os.order_status_id

第四節 復合連線

對於有多個主鍵的表單連線,需要匹配所有的主鍵列。

第五節 隱式連線

和明示連線相比,mysql也提供的隱式連線的語法支援,即不明確的使用 join 關鍵字來連線2張表 。 對於實現相同功能,隱式連線有如下不同

明示連線 使用join

select

*from orders o

join customers c on

o.customer_id = c.customer_id

隱式連線 不使用join

select

*from

orders o, customers c

where o.customer_id = c.customer_id

並不推薦這種隱式連線語法。

第六節 外連線

select

*from

orders o

right

join customers c

on o.customer_id = c.customer_id

等價於

select

*from

customers c

left

join orders o

on o.customer_id = c.customer_id

多表外連線的方式語法類似。

第九節 自外連線 self outer join

第十節 using 關鍵字

如果背連線的兩張表有想通的列名,我們可以省略 join …on … 語法直接使用 using(列名)

select

*from

orders

join customers

using

(customer_id)

自然連線 nature join 交叉連線

聯合 union

select 

order_id,

order_date,

'active'

asstatus

from

sql_store.orders

where

order_date >=

'2019-01-01'

union

//我在這!!!!!!!!!!!!

單身三連之三

這是最終章,永久的思念。題目大意 有n張牌,每張牌兩面都有數字,範圍都在1到2n之間,求最少的反轉次數,使得每張牌朝上的一面的數字各不相同,並求出達到這個效果的方案數。多測,初始時每張牌正面朝上,無解輸出 1 1 題解 20 資料 n 20 直接搜尋即可。100 資料 n 1 105 搜尋複雜度不允...

NOIP三連測總結

近三天舉行了三場考試,好像考得都不咋地,與上一周專題訓練相比相差甚遠。單就分數來說,基本看不下去。基本就在20名左右徘徊。但是,三天以來,從第一天思維僵化忽略各種情況到今天想到第二題正解 雖然寫掛了 個人感覺自己的狀態還是在變好,並且收穫了一些乾貨 1.對於輸入輸出接近longlong的題目,不要因...

單身三連之一

乙個讓單身狗們崩潰的題 題目大意 有n件物品,一共取d次,一次取的必須少於m件,問共有多少種取法。每個物品相同,有多測,對998244353取模 題解 30 演算法 n,d 20,m 10 簡單的dp。設f i j 為取了i次,共取了j件物品的方案數,則有如下狀態轉移方程 f i j kk max ...