日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Sql在多張表中檢索數據的方法詳解

瀏覽:259日期:2023-02-18 16:43:26
目錄
  • 1.內連接
  • 2.跨數據庫連接
  • 3.自連接
  • 4.多表連接
  • 5.復合連接條件
  • 6.隱式連接語法
  • 7.外連接
  • 8.多表外連接
  • 9.自外部連接
  • 10.USING子句
  • 11.自然連接
  • 12.交叉連接
  • 13.聯合

1.內連接

各表分開存放是為了減少重復信息和方便修改,需要時可以根據相互之間的關系連接成相應的合并詳情表以滿足相應的查詢。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;

2.跨數據庫連接

有時需要選取不同庫的表的列,其他都一樣,就只是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
-- 非當前使用的庫,才需要加庫前綴

3.自連接

一個表和它自己合并。如員工的上級也是員工,所以也在員工表里,所以想得到的有員工和他的上級信息的合并表,就要員工表自己和自己合并,用兩個不同的表別名即可實現。這個例子中只有兩級,但也可用類似的方法構建多層級的組織結構。

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

4.多表連接

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;

5.復合連接條件

像訂單項目(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

6.隱式連接語法

就是用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 

7.外連接

(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 一樣)

8.多表外連接

與內連接類似,我們可以對多個表(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(總是左表全包含),這樣,當要合并的表比較多時才方便書寫和理解而不易混亂

9.自外部連接

就用前面那個員工表的例子來說,就是用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

10.USING子句

當作為合并條件(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

11.自然連接

NATURAL JOIN 就是讓MySQL自動檢索同名列作為合并條件。

最好別用,因為不確定合并條件是否找對了,有時會造成無法預料的問題,編程時保持對結果的控制是非常重要的

但也要知道有這個東西,混個臉熟,不要別人用了看不懂。

USE sql_store;
SELECT 
    o.order_id,
    c.first_name
FROM orders o
NATURAL JOIN customers c

12.交叉連接

得到名字和產品的所有組合,因此不需要合并條件。 實際運用如:要得到尺寸和顏色的全部組合

-- 得到顧客和產品的全部組合(毫無意義,純粹為了展示交叉連接)
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

13.聯合

FROM …… JOIN …… 可對多張表進行橫向列合并,而 …… UNION …… 可用來按行縱向合并多個查詢結果,這些查詢結果可能來自相同或不同的表

  • 同一張表可通過UNION添加新的分類字段,即先通過分類查詢并添加新的分類字段再UNION合并為帶分類字段的新表。
  • 不同表通過UNION合并的情況如:將一張18年的訂單表和19年的訂單表縱向合并起來在一張表里展示

注意

  • 合并的查詢結果必須列數相等,否則會報錯
  • 合并表里的列名由排在 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檢索數據內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: MySQL
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日韩中文在线中文字幕| 麻豆精品国产91久久久久久| 国产亚洲字幕| 国产欧美亚洲一区| 精品视频一区二区三区四区五区| 国产第一亚洲| 久久精品国产大片免费观看| 欧美美女一区| 日韩在线视频一区二区三区| 国产日韩高清一区二区三区在线| 欧美极品一区二区三区| а√天堂8资源在线| 精品一区欧美| 亚洲精品在线a| 精品三级久久久| 狠狠久久伊人| 91精品国产乱码久久久久久久| 一区久久精品| 午夜久久av| 国产伦精品一区二区三区千人斩| 国内一区二区三区| 欧美日韩视频| 日本欧美韩国一区三区| 国产一区二区三区四区五区传媒| 久久精品主播| 日韩精品1区2区3区| 高潮久久久久久久久久久久久久| 欧美在线亚洲综合一区| 欧美亚洲网站| 久久精品观看| 亚洲伊人影院| 成人在线丰满少妇av| 一区在线视频观看| 欧美在线精品一区| 久久网站免费观看| 欧美中文高清| 欧美搞黄网站| 久久不卡国产精品一区二区| 日韩视频精品在线观看| 国产精品v一区二区三区| 欧美日韩激情在线一区二区三区| 国产欧美日韩综合一区在线播放| 99久久婷婷这里只有精品| 69堂精品视频在线播放| 999国产精品视频| 日本aⅴ亚洲精品中文乱码| 欧美精品高清| 欧美精品观看| 蜜桃久久av| 日韩一区亚洲二区| 欧美精品影院| 99国产精品99久久久久久粉嫩| 国产一区二区三区网| 免费在线观看一区二区三区| 97人人精品| 欧美专区一区| 一区免费在线| 日韩免费福利视频| 国产精品视频一区二区三区四蜜臂 | 日韩三级久久| 久久国产免费| 麻豆91在线播放| 蜜臀国产一区二区三区在线播放| 91亚洲国产成人久久精品| 欧美精品影院| 日韩影院免费视频| 99国内精品| 久久精品亚洲人成影院| 国产精品chinese| 婷婷综合电影| 蜜桃视频在线观看一区二区| 久久在线视频免费观看| 国产h片在线观看| 欧美国产另类| 欧美日本不卡| 亚洲毛片网站| 蜜臀91精品一区二区三区| 欧美日韩中文一区二区| 国内精品伊人| 久草精品视频| 精品一区二区三区中文字幕视频 | 开心激情综合| 国产精品一区2区3区| 日韩一二三区在线观看| 影音先锋久久| 1024精品久久久久久久久| 午夜久久中文| 91看片一区| 黑森林国产精品av| 国产网站在线| 久久福利在线| 日韩av成人高清| 中文字幕av一区二区三区四区| 九一成人免费视频| 久久久久99| 久久裸体视频| 不卡视频在线| 亚洲a在线视频| 在线日韩电影| av亚洲免费| 香蕉精品999视频一区二区| 国产精品视区| 天堂俺去俺来也www久久婷婷| 亚洲一区欧美| 青草国产精品久久久久久| 男人的天堂久久精品| 日韩精品免费视频人成| 国产欧美综合一区二区三区| 美女视频免费精品| 一本大道色婷婷在线| 欧美+亚洲+精品+三区| 日韩视频中文| 日韩精品免费观看视频| 国产欧美一区二区色老头| 精品国产鲁一鲁****| 久久黄色影院| 一区二区精品| 国产日韩在线观看视频| 91欧美在线| 中文久久精品| 亚洲+小说+欧美+激情+另类| 国产日本亚洲| 国产va在线视频| 日韩视频不卡| 国产欧美一区二区色老头| 亚洲国产成人二区| 国产日韩专区| 国产欧美精品| japanese国产精品| 日韩国产精品久久久久久亚洲| 国产精品一卡| 久久精选视频| 日韩中文字幕在线一区| 国内不卡的一区二区三区中文字幕| 日韩欧美综合| 欧美精选一区二区三区| 日本精品在线播放| 国产一区二区三区成人欧美日韩在线观看| 成人日韩av| 99国产精品| 久久精品国产成人一区二区三区| 久久精品主播| 日韩黄色av| 99成人超碰| 久久国产欧美日韩精品| 欧美日韩在线观看首页| 乱人伦精品视频在线观看| 麻豆精品av| 午夜久久美女| 麻豆精品少妇| 国产一区二区三区四区大秀| 亚洲少妇在线| 日本精品黄色| 亚洲免费观看高清完整版在线观| av免费不卡国产观看| 久久亚洲图片| 国产不卡一区| 黄色欧美日韩| 久久久久久色 | 欧美午夜精品一区二区三区电影| 日韩综合一区二区| 国产在线视频欧美一区| 亚洲中午字幕| 91亚洲国产成人久久精品| 亚洲欧美网站在线观看| 性欧美videohd高精| 国产乱码精品一区二区亚洲| 亚洲激情不卡| 欧美aa一级| 国产精品99久久免费| aa国产精品| 日韩国产在线| 国产精品大片| 日韩欧美中文字幕在线视频| 国产专区一区| 国产伦久视频在线观看| 日本91福利区| 亚洲欧美视频一区二区三区| 亚洲成av在线| 国产精品hd| 久久精品凹凸全集| 亚洲精选91| 久久夜色精品| 日韩一级欧洲| 婷婷六月综合| 久久精品免费一区二区三区| 久久尤物视频| 国产欧美综合一区二区三区| 中文字幕日韩亚洲| 国产精品美女久久久| 国产一区观看| 亚洲精品**中文毛片| 精品一区视频| 国产精区一区二区| 91精品国产自产观看在线| 视频一区日韩精品| 免费人成精品欧美精品| 美女91精品| 亚洲一区二区三区四区电影| 亚洲一区二区免费看|