最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Sql在多張表中檢索數(shù)據(jù)的方法詳解

 更新時間:2023年02月16日 09:42:51   作者:weixin_43912367  
SELECT語句是SQL中最常用的語句。它的用途是從一個或多個表中檢索信息。為了使用SELECT檢索表數(shù)據(jù),必須至少給出兩條信息:想選擇什么、從什么地方選擇

1.內(nèi)連接

各表分開存放是為了減少重復(fù)信息和方便修改,需要時可以根據(jù)相互之間的關(guān)系連接成相應(yīng)的合并詳情表以滿足相應(yīng)的查詢。FROM JOIN ON 語句就是告訴sql: 將哪幾張表以什么基礎(chǔ)連接/合并起來。

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.跨數(shù)據(jù)庫連接

有時需要選取不同庫的表的列,其他都一樣,就只是WHERE JOIN里對于非現(xiàn)在正在用的庫的表要加上庫名前綴而已。依然可用別名來簡化

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
-- 非當(dāng)前使用的庫,才需要加庫前綴

3.自連接

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

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 …… 分別通過不同的鏈接關(guān)系鏈接不同的表B、C、D……,通常是讓表B、C、D……為表A提供更詳細的信息從而合并為一張詳情合并版A表,即:

FROM  A 
    JOIN B ON AB的關(guān)系 
    JOIN C ON AC的關(guān)系 
    JOIN D ON AD的關(guān)系 
    ……

將得到一個合并了BCD……等表詳細信息的詳情合并版A表

真實工作場景中有時甚至要合并十多張表

-- 訂單表同時鏈接顧客表和訂單狀態(tài)表,合并為有顧客和狀態(tài)信息的詳細訂單表
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.復(fù)合連接條件

像訂單項目(order_items)這種表,訂單id和產(chǎn)品id合在一起才能唯一表示一條記錄,這叫復(fù)合主鍵,設(shè)計模式下也可以看到兩個字段都有PK標(biāo)識,訂單項目備注表(order_item_notes)也是這兩個復(fù)合主鍵,因此他們兩合并時要用復(fù)合條件: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)結(jié)果:即10條order會分別與10個customer結(jié)合,得到100條記錄。最好使用顯性合并語法,因為會強制要求你寫合并條件ON語句,不至于漏掉。

USE sql_store;
SELECT *
FROM orders o
JOIN customers c
	on o.id = c.id;
-- 可轉(zhuǎn)換為下面這個
SELECT *
FROM orders 

7.外連接

(INNER) JOIN只包含兩個表的交集

LEFT/RIGHT (OUTER) JOIN 結(jié)果里除了交集,還包含只出現(xiàn)在左/右表中的記錄

-- 合并顧客表和訂單表,用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以后顧客信息其實是是廣播了的,即一條顧客信息被多條訂單記錄共用,當(dāng)然 這叫廣播(broadcast)效應(yīng),是另一個問題,這里關(guān)注的重點是 INNER JOIN 的結(jié)果確實是兩表的交集,是那些同時有顧客信息和訂單信息的記錄。
-- 若要展示全部顧客(及其訂單,如果有的話),要改用LEFT (OUTER) JOIN,結(jié)果相較于 INNER JOIN 多了沒有訂單的那些顧客,即只有顧客信息沒有訂單信息的記錄
-- 當(dāng)然,也可以調(diào)換左右表的順序(即調(diào)換FROM和JOIN的對象)再 RIGHT JOIN,即:
FROM orders o
    RIGHT [OUTER] JOIN customers c
    -- 中括號 [] 表示是可選項、可省略 
    ON o.customer_id = c.customer_id
-- 若要展示全部訂單(及其顧客),就應(yīng)該是 orders RIGHT JOIN customers,結(jié)果相較于 INNER JOIN 多了沒有顧客的那些訂單,即只有訂單信息沒有顧客信息的記錄。(注:因為這里所有訂單都有顧客,所以這里 RIGHT JOIN 結(jié)果和 INNER JOIN 一樣)

8.多表外連接

與內(nèi)連接類似,我們可以對多個表(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
-- 雖然可以調(diào)換順序并用 RIGHT JOIN,但作為最佳實踐,最好調(diào)整順序并統(tǒng)一只用 [INNER] JOIN 和 LEFT [OUTER] JOIN(總是左表全包含),這樣,當(dāng)要合并的表比較多時才方便書寫和理解而不易混亂

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子句

當(dāng)作為合并條件(join condition)的列在兩個表中有相同的列名時,可用 USING (……, ……) 取代 ON …… AND …… 予以簡化,內(nèi)/外鏈接均可如此簡化。

一定注意 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
-- 復(fù)合主鍵表間復(fù)合連接條件的合并也可用 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對復(fù)合主鍵的簡化效果更加明顯
-- 列名不同就必須用 ON …… 了
-- 實際中同一個字段在不同表列名不同的情況也很常見,不能想當(dāng)然的用USING

11.自然連接

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

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

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

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

12.交叉連接

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

-- 得到顧客和產(chǎn)品的全部組合(毫無意義,純粹為了展示交叉連接)
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
-- 上面是顯性語法,還有隱式語法,之前講過,其實就是隱式內(nèi)合并忽略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.聯(lián)合

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

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

注意

  • 合并的查詢結(jié)果必須列數(shù)相等,否則會報錯
  • 合并表里的列名由排在 UNION 前面的決定
-- 給訂單表增加一個新字段——status,用以區(qū)分今年的訂單和今年以前的訂單
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';

到此這篇關(guān)于Sql在多張表中檢索數(shù)據(jù)的方法詳解的文章就介紹到這了,更多相關(guān)Sql檢索數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mysql中校對集utf8_unicode_ci與utf8_general_ci的區(qū)別說明

    Mysql中校對集utf8_unicode_ci與utf8_general_ci的區(qū)別說明

    一直對utf8_unicode_ci與utf8_general_ci這2個校對集很迷惑,今天查了手冊有了點眉目。不過對中文字符集來說采用utf8_unicode_ci與utf8_general_ci時有何區(qū)別還是不清楚
    2012-03-03
  • Mysql 用戶權(quán)限管理實現(xiàn)

    Mysql 用戶權(quán)限管理實現(xiàn)

    MySQL 是一個多用戶數(shù)據(jù)庫,具有功能強大的訪問控制系統(tǒng),可以為不同用戶指定不同權(quán)限。本文就來介紹一下Mysql 用戶權(quán)限管理實現(xiàn),感興趣的可以了解一下
    2021-05-05
  • mysql多實例部署實例教程

    mysql多實例部署實例教程

    這篇文章主要介紹了mysql多實例部署,主要包括軟件下載、配置用戶并解壓二進制程序至/usr/local下及創(chuàng)建各實例數(shù)據(jù)存放的目錄,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • mysql利用覆蓋索引避免回表優(yōu)化查詢

    mysql利用覆蓋索引避免回表優(yōu)化查詢

    這篇文章主要給大家介紹了關(guān)于mysql如何利用覆蓋索引避免回表優(yōu)化查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • mysql獲取group by的總記錄行數(shù)另類方法

    mysql獲取group by的總記錄行數(shù)另類方法

    mysql獲取group by內(nèi)部可以獲取到某字段的記錄分組統(tǒng)計總數(shù),而無法統(tǒng)計出分組的記錄數(shù),下面有個可行的方法,大家可以看看
    2014-10-10
  • MySql索引使用策略分析

    MySql索引使用策略分析

    這篇文章主要介紹了MySql索引使用策略分析,幫助大家更好的理解和使用MySQL,感興趣的朋友可以了解下
    2020-11-11
  • Mysql通過ibd文件恢復(fù)數(shù)據(jù)的詳細步驟

    Mysql通過ibd文件恢復(fù)數(shù)據(jù)的詳細步驟

    mysql在使用的過程中,難免遇到數(shù)據(jù)庫表誤操作,下面這篇文章主要給大家介紹了關(guān)于Mysql通過ibd文件恢復(fù)數(shù)據(jù)的詳細步驟,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • mysql居然還能實現(xiàn)分布式鎖的方法

    mysql居然還能實現(xiàn)分布式鎖的方法

    這篇文章主要介紹了mysql居然還能實現(xiàn)分布式鎖的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • MySQL?Workbench操作圖文詳解(史上最細)

    MySQL?Workbench操作圖文詳解(史上最細)

    Workbench是MySQL最近釋放的可視數(shù)據(jù)庫設(shè)計工具,這個工具是設(shè)計 MySQL數(shù)據(jù)庫的專用工具,下面這篇文章主要給大家介紹了關(guān)于MySQL?Workbench操作的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • 如何使用mysql語句進行多表聯(lián)查(以三個表為例)

    如何使用mysql語句進行多表聯(lián)查(以三個表為例)

    這篇文章主要介紹了如何使用mysql語句進行多表聯(lián)查(以三個表為例),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08

最新評論

佛冈县| 龙陵县| 稻城县| 富民县| 保康县| 广昌县| 长宁区| 黄龙县| 扎赉特旗| 房产| 惠东县| 错那县| 吉隆县| 洛南县| 富锦市| 海南省| 汝城县| 南召县| 栾川县| 江西省| 垣曲县| 双辽市| 泾源县| 桃园县| 玉门市| 贵州省| 渝北区| 湖南省| 鸡泽县| 香格里拉县| 三台县| 文成县| 易门县| 辽源市| 龙陵县| 佛学| 锦屏县| 郴州市| 理塘县| 依兰县| 镇安县|