<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
各表分開存放是為了減少重複資訊和方便修改,需要時可以根據相互之間的關係連線成相應的合併詳情表以滿足相應的查詢。FROM JOIN ON 語句就是告訴sql: 將哪幾張表以什麼基礎連線/合併起來。
select * from order inner join customers on order.id = customers.id; -- inner可省略 -- 可起別名 select order_id, customer_id, o.id, last_name from order o join customers c on o.id = c.id;
有時需要選取不同庫的表的列,其他都一樣,就只是WHERE JOIN裡對於非現在正在用的庫的表要加上庫名字首而已。依然可用別名來簡化
use sql_store; select * from order_items oi join sql_inventory.products p on oi.product_id = p.product_id -- 或 use sql_inventory; select * from sql_store.order_items oi join products p on oi.product_id = p.product_id -- 非當前使用的庫,才需要加庫字首
一個表和它自己合併。如員工的上級也是員工,所以也在員工表裡,所以想得到的有員工和他的上級資訊的合併表,就要員工表自己和自己合併,用兩個不同的表別名即可實現。這個例子中只有兩級,但也可用類似的方法構建多層級的組織結構。
USE sql_hr select e.employee_id, e.first_name, m.first_name as manger from employees e join employee m on e.reports_to = m.employee_id
FROM
一個核心表A,用多個 JOIN …… ON ……
分別通過不同的連結關係連結不同的表B、C、D……,通常是讓表B、C、D……為表A提供更詳細的資訊從而合併為一張詳情合併版A表,即:
FROM A
JOIN B ON AB的關係
JOIN C ON AC的關係
JOIN D ON AD的關係
……
將得到一個合併了BCD……等表詳細資訊的詳情合併版A表
真實工作場景中有時甚至要合併十多張表
-- 訂單表同時連結顧客表和訂單狀態表,合併為有顧客和狀態資訊的詳細訂單表 USE sql_store; SELECT o.order_id, o.order_date, c.first_name, c.last_name, os.name AS status FROM order o JOIN customers c on o.customers_id = c.customers_id JOIN order_statuses os ON o.status = os.order_status_id;
像訂單專案(order_items)這種表,訂單id和產品id合在一起才能唯一表示一條記錄,這叫複合主鍵,設計模式下也可以看到兩個欄位都有PK標識,訂單專案備註表(order_item_notes)也是這兩個複合主鍵,因此他們兩合併時要用複合條件:FROM
表1 JOIN
表2 ON
條件1 【AND】
條件2
USE sql_store SELECT * FROM order_items oi JOIN order_item_notes oin ON oi.order_Id = oin.order_Id AND oi.product_id = oin.product_id
就是用FROM WHERE取代FROM JOIN ON
儘量別用,因為若忘記WHERE條件篩選語句,不會報錯但會得到交叉合併(cross join)結果:即10條order會分別與10個customer結合,得到100條記錄。最好使用顯性合併語法,因為會強制要求你寫合併條件ON語句,不至於漏掉。
USE sql_store; SELECT * FROM orders o JOIN customers c on o.id = c.id; -- 可轉換為下面這個 SELECT * FROM orders
(INNER) JOIN只包含兩個表的交集
LEFT/RIGHT (OUTER) JOIN
結果裡除了交集,還包含只出現在左/右表中的記錄
-- 合併顧客表和訂單表,用INNER JOIN USE sql_store; SELECT c.customer_id, c.first_name, o.order_id FROM customers c JOIN orders o ON o.customer_id = c.customer_id ORDER BY customer_id -- 這樣是INNER JOIN,只展示有訂單的顧客(及其訂單),也就是兩張表的交集,但注意這裡因為一個顧客可能有多個訂單,所以INNER JOIN以後顧客資訊其實是是廣播了的,即一條顧客資訊被多條訂單記錄共用,當然 這叫廣播(broadcast)效應,是另一個問題,這裡關注的重點是 INNER JOIN 的結果確實是兩表的交集,是那些同時有顧客資訊和訂單資訊的記錄。 -- 若要展示全部顧客(及其訂單,如果有的話),要改用LEFT (OUTER) JOIN,結果相較於 INNER JOIN 多了沒有訂單的那些顧客,即只有顧客資訊沒有訂單資訊的記錄 -- 當然,也可以調換左右表的順序(即調換FROM和JOIN的物件)再 RIGHT JOIN,即: FROM orders o RIGHT [OUTER] JOIN customers c -- 中括號 [] 表示是可選項、可省略 ON o.customer_id = c.customer_id -- 若要展示全部訂單(及其顧客),就應該是 orders RIGHT JOIN customers,結果相較於 INNER JOIN 多了沒有顧客的那些訂單,即只有訂單資訊沒有顧客資訊的記錄。(注:因為這裡所有訂單都有顧客,所以這裡 RIGHT JOIN 結果和 INNER JOIN 一樣)
與內連線類似,我們可以對多個表(3個及以上)進行外連線,最好只用 JOIN 和 LEFT JOIN
SELECT c.customer_id, c.first_name, o.order_id, sh.name AS shipper FROM customers c LEFT JOIN orders o ON c.customer_id = o.customer_id LEFT JOIN shippers sh ON o.shipper_id = sh.shipper_id ORDER BY customer_id -- 雖然可以調換順序並用 RIGHT JOIN,但作為最佳實踐,最好調整順序並統一隻用 [INNER] JOIN 和 LEFT [OUTER] JOIN(總是左表全包含),這樣,當要合併的表比較多時才方便書寫和理解而不易混亂
就用前面那個員工表的例子來說,就是用LEFT JOIN讓得到的 員工-上級 合併表也包括老闆本人(老闆沒有上級,即 reports_to 欄位為空,如果用 JOIN 會被篩掉,用 LEFT JOIN 才能保留)
USE sql_hr; SELECT e.employee_id, e.first_name, m.first_name AS manager FROM employees e LEFT JOIN employees m -- 包含所有僱員(包括沒有report_to的老闆本人) ON e.reports_to = m.employee_id
當作為合併條件(join condition)的列在兩個表中有相同的列名時,可用 USING (……, ……)
取代 ON …… AND ……
予以簡化,內/外連線均可如此簡化。
一定注意 USING 後接的是括號,特容易搞忘
SELECT o.order_id, c.first_name, sh.name AS shipper FROM orders o JOIN customers c USING (customer_id) LEFT JOIN shippers sh USING (shipper_id) ORDER BY order_id -- 複合主鍵表間複合連線條件的合併也可用 USING,中間逗號隔開就行: SELECT * FROM order_items oi JOIN order_item_notes oin ON oi.order_id = oin.order_Id AND oi.product_id = oin.product_id /USING (order_id, product_id) -- USING對複合主鍵的簡化效果更加明顯 -- 列名不同就必須用 ON …… 了 -- 實際中同一個欄位在不同表列名不同的情況也很常見,不能想當然的用USING
NATURAL JOIN
就是讓MySQL自動檢索同名列作為合併條件。
最好別用,因為不確定合併條件是否找對了,有時會造成無法預料的問題,程式設計時保持對結果的控制是非常重要的
但也要知道有這個東西,混個臉熟,不要別人用了看不懂。
USE sql_store; SELECT o.order_id, c.first_name FROM orders o NATURAL JOIN customers c
得到名字和產品的所有組合,因此不需要合併條件。 實際運用如:要得到尺寸和顏色的全部組合
-- 得到顧客和產品的全部組合(毫無意義,純粹為了展示交叉連線) USE sql_store; SELECT c.first_name AS customer, p.name AS product FROM customers c CROSS JOIN products p ORDER BY c.first_name -- 上面是顯性語法,還有隱式語法,之前講過,其實就是隱式內合併忽略WHERE子句(即合併條件)的情況,也就是把 CROSS JOIN 改為逗號,即 FROM A CROSS JOIN B 等效於 FROM A, B,Mosh更推薦顯式語法,因為更清晰 USE sql_store; SELECT c.first_name, p.name FROM customers c, products p ORDER BY c.first_name
FROM …… JOIN ……
可對多張表進行橫向列合併,而 …… UNION ……
可用來按行縱向合併多個查詢結果,這些查詢結果可能來自相同或不同的表
注意
-- 給訂單表增加一個新欄位——status,用以區分今年的訂單和今年以前的訂單 USE sql_store; SELECT order_id, order_date, 'Active' AS status FROM orders WHERE order_date >= '2019-01-01' UNION SELECT order_id, order_date, 'Archived' AS status -- Archived 歸檔 FROM orders WHERE order_date < '2019-01-01';
到此這篇關於Sql在多張表中檢索資料的方法詳解的文章就介紹到這了,更多相關Sql檢索資料內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45