欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL詳細(xì)講解多表關(guān)聯(lián)查詢

 更新時(shí)間:2022年04月27日 14:45:52   作者:羨羨ˇ  
在數(shù)據(jù)庫(kù)的設(shè)計(jì)中, 我們通常都是會(huì)有很多張表 , 通過(guò)表與表之間的關(guān)系建立我們想要的數(shù)據(jù)關(guān)系, 所以在多張表的前提下, 多表的關(guān)聯(lián)查詢就尤為重要

數(shù)據(jù)庫(kù)設(shè)計(jì)范式

目前數(shù)據(jù)庫(kù)設(shè)計(jì)有五種范式 , 一般我們數(shù)據(jù)庫(kù)只需要滿足前三項(xiàng)即可

第一范式 : 確保每列保持原子性

什么是原子性? 意思就是不可再分的,例如下

聯(lián)系方式有 QQ,微信 , 電話等等 , 顯然此列不滿足原子性, 如果是單獨(dú)的QQ或者電話等,則只有一個(gè), 滿足第一范式

第二范式 : 要有主鍵,要求其他字段都依賴于主鍵

為什么主鍵這么重要? 我們可以這樣理解, 如果把表當(dāng)作一個(gè)隊(duì)伍, 那么主鍵就是這個(gè)隊(duì)伍的隊(duì)旗

• 沒(méi)有主鍵就沒(méi)有唯一性,沒(méi)有唯一性在集合中就定位不到這行記錄,所以要主鍵。

• 其他字段為什么要依賴于主鍵?因?yàn)椴灰蕾囉谥麈I,就找不到他們。更重要的是,其他字段組成的這行記錄和主鍵表示的是同一個(gè)東西,而主鍵是唯一的,它們只需要依賴于主鍵,也就成了唯一的。

第三范式 : 第三范式就是要消除傳遞依賴,方便理解,可以看做是“消除冗余”

這個(gè)要怎樣理解呢? 看下述例子 

如果我們一張表設(shè)計(jì)成上面這樣, 大致看很正常, 但我們把這張表拆分開來(lái)

如果這樣做的話, 是不是條理清晰了很多, 我們直接通過(guò)商品編號(hào)來(lái)關(guān)聯(lián)這兩張表, 無(wú)論在哪方面,都比全部擠在一張表要優(yōu)于很多

外鍵

 我們知道有主鍵 , 主鍵相當(dāng)于表的標(biāo)識(shí), 那么外鍵呢 ? 

● 外鍵:引用另外一個(gè)數(shù)據(jù)表的某條記錄。

● 外鍵列類型與主鍵列類型保持一致 ,數(shù)據(jù)表之間的關(guān)聯(lián)/ 引用關(guān)系是依靠具體的主鍵( primary key )和外鍵(foreign key)建立起來(lái)的

語(yǔ)法:

添加外鍵約束
ALTER TABLE 表名 ADD [CONSTRAINT 約束名 ] FOREIGN KEY( 外鍵列 )
         REFERENCES 關(guān)聯(lián)表( 主鍵 );
刪除外檢鍵    ALTER TABLE 表名 DROP FOREIGN KEY 外鍵約束名

我們?cè)谏厦娴谌妒降睦又姓f(shuō)到, 消除冗余, 通過(guò)某一列來(lái)關(guān)聯(lián)兩個(gè)表 , 那么這一個(gè)連接起兩個(gè)表的列我們一般就會(huì)設(shè)置為外鍵

但是, 如果我們需要兩個(gè)表關(guān)聯(lián)查詢, 也是不一定去使用外鍵約束的

  • 如果兩張表關(guān)聯(lián)查詢 , 我們并沒(méi)有去添加外鍵約束, 我們把這種稱為弱引用
  • 如果添加了外鍵約束,那么它就是強(qiáng)引用

那么這兩種引用區(qū)別在哪呢?

我們知道 , 當(dāng)我們使用外鍵后 , 外鍵所在的是從表 , 外鍵指向主表的主鍵 , 那么此時(shí)就在這兩張表之間建立起了約束 , 這時(shí)我們就不能隨意的去修改主表或者從表里關(guān)聯(lián)的值 , 這就是強(qiáng)引用

1、當(dāng)主表中沒(méi)有對(duì)應(yīng)的記錄時(shí),不能將記錄添加到從表

2、不能更改主表中的值而導(dǎo)致從表中的記錄孤立

3、從表存在與主表對(duì)應(yīng)的記錄,不能從主表中刪除該行

4、刪除主表前,先刪從表

弱引用我們則可以隨意修改關(guān)聯(lián)之間的值

-- 創(chuàng)建學(xué)生表
CREATE TABLE student(
    id INT PRIMARY KEY AUTO_INCREMENT,
    num INT,
    NAME VARCHAR(20),
    sex CHAR(1),
    gradeId INT   -- 從表外鍵列
)
-- 創(chuàng)建年級(jí)表
CREATE TABLE grade(
    -- 主表主鍵列
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
)     
-- 添加外鍵約束
ALTER TABLE student ADD CONSTRAINT fk_grade 
      FOREIGN KEY(gradeId) REFERENCES grade(id)

主表創(chuàng)建并添加數(shù)據(jù) :

從表創(chuàng)建并添加數(shù)據(jù) : 

可以看到 , gradeId字段添加了外鍵約束 

這時(shí)我們?cè)囍h除主表的一列 : 

可以看到 , 是不能去隨意改變主表的, 如果一旦改變,就會(huì)使得從表中的數(shù)據(jù)孤立 

內(nèi)連接 

● 把滿足了條件的兩張表中的交集數(shù)據(jù)查詢出來(lái)

語(yǔ)法:

Select 結(jié)果 from 表 1 ,表 2 where 表 1.column1 = 表 2.column2

內(nèi)連接有等值連接, 非等值連接, 自連接, 這里我們主要討論自連接

笛卡爾乘積現(xiàn)象:表1有m行,表2有n行,結(jié)果=m*n

什么是自連接呢 , 就是自己關(guān)聯(lián)自己 , 自己和自己做笛卡爾積,  這么說(shuō)可能不好理解, 舉例說(shuō)明如下:

我們平時(shí)在淘寶網(wǎng)購(gòu)填地址的時(shí)候, 都是采用選擇的方式, 先選擇省,然后是省下面的市, 接著是市下面的區(qū)(縣) ,它們都是在數(shù)據(jù)庫(kù)中存著, 如何去實(shí)現(xiàn)這個(gè)功能呢 ? 

有人可能會(huì)說(shuō), 建三張表相互關(guān)聯(lián)即可 , 但實(shí)際是 , 我們采用自連接的方式 , 一張表即可實(shí)現(xiàn)

CREATE TABLE demo(     -- 建立demo表
    id INT PRIMARY KEY,
    NAME VARCHAR(50),
    pid INT    
 )

往表中填入數(shù)據(jù), pid為關(guān)聯(lián)上一級(jí)的id

-- 自連接 
-- 在多表關(guān)系中我們需要定義別名來(lái)區(qū)分
SELECT d1.name,d2.name,d3.name FROM demo d1 
            INNER JOIN demo d2 ON d1.id=d2.pid  --自連接條件
            INNER JOIN demo d3 ON d2.id=d3.pid  --自連接條件
  WHERE d3.id=6101011   -- 查詢條件

結(jié)果 : 

外連接

外連接又分為左外連接與右外連接

先看左外連接 : 

語(yǔ)法 

select 結(jié)果 from 表1 left join 表 2 on 表1.column1 = 表 2.column2 

左連接和內(nèi)連接有什么不同呢?  通過(guò)兩幅圖我們就可以看出 ,內(nèi)連接是取了兩張表的共同部分 , 而左連接是取了左邊表的全部(包括兩張表的共同部分)

也就是說(shuō), 不僅查詢兩張表的共同部分, 并且左邊表會(huì)被全部查詢出來(lái)

我們通過(guò)上面外鍵所建的表來(lái)演示 , 為了演示方便,我們?yōu)閟tudent表再添加一列數(shù)據(jù)

可以看到, 此時(shí)第五列并沒(méi)有去關(guān)聯(lián)grade表

-- 左外連接查詢
SELECT * FROM student s 
     LEFT JOIN grade g ON s.gradeId= g.id

查詢結(jié)果如下 : 

 那么說(shuō)到這, 右外連接也就不難理解了 , 每次都會(huì)完整的查詢右邊的表

同樣我們?cè)贋間rade添加一條無(wú)關(guān)聯(lián)的數(shù)據(jù)

語(yǔ)法 :

 select 結(jié)果 from 表1 right join 表2 on 表1.column1 = 表2.column2 

-- 右外連接查詢
SELECT * FROM student s 
     RIGHT JOIN grade g ON s.gradeId= g.id

查詢結(jié)果 : 

可以看到, 右表被完全查詢

結(jié)語(yǔ)

       mysql是一款優(yōu)秀的關(guān)系型數(shù)據(jù)庫(kù) , 在多表查詢中,通過(guò)表與表之間的關(guān)系, 我們就可以連接起各種數(shù)據(jù) , 通過(guò)外鍵約束等,我們可以在表與表之間建立起聯(lián)系 , 等等

到此這篇關(guān)于MySQL詳細(xì)講解多表關(guān)聯(lián)查詢的文章就介紹到這了,更多相關(guān)MySQL多表關(guān)聯(lián)查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Navicat連接MySQL時(shí)出現(xiàn)的連接失敗問(wèn)題及解決

    Navicat連接MySQL時(shí)出現(xiàn)的連接失敗問(wèn)題及解決

    這篇文章主要介紹了Navicat連接MySQL時(shí)出現(xiàn)的連接失敗問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • MySQL按小時(shí)查詢數(shù)據(jù),沒(méi)有的補(bǔ)0

    MySQL按小時(shí)查詢數(shù)據(jù),沒(méi)有的補(bǔ)0

    這篇文章主要介紹了MySQL按小時(shí)查詢數(shù)據(jù),沒(méi)有的補(bǔ)0,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Mysql時(shí)間軸數(shù)據(jù) 獲取同一天數(shù)據(jù)的前三條

    Mysql時(shí)間軸數(shù)據(jù) 獲取同一天數(shù)據(jù)的前三條

    這篇文章主要介紹了Mysql時(shí)間軸數(shù)據(jù) 獲取同一天數(shù)據(jù)的前三條 ,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • mysql中profile的使用方法教程

    mysql中profile的使用方法教程

    這篇文章主要給大家介紹了關(guān)于mysql中profile的使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • 關(guān)于對(duì)mysql語(yǔ)句進(jìn)行監(jiān)控的方法詳解

    關(guān)于對(duì)mysql語(yǔ)句進(jìn)行監(jiān)控的方法詳解

    這篇文章主要給大家介紹了關(guān)于對(duì)mysql語(yǔ)句進(jìn)行監(jiān)控的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • MySQL主備操作以及原理詳解

    MySQL主備操作以及原理詳解

    本文主要介紹了MySQL主備操作以及原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • MySQL中的批量修改、插入操作數(shù)據(jù)庫(kù)

    MySQL中的批量修改、插入操作數(shù)據(jù)庫(kù)

    在平常的項(xiàng)目中,我們會(huì)需要批量操作數(shù)據(jù)庫(kù)的時(shí)候,例如:批量修改,批量插入,那我們不應(yīng)該使用 for 循環(huán)去操作數(shù)據(jù)庫(kù),這樣會(huì)導(dǎo)致我們反復(fù)與數(shù)據(jù)庫(kù)發(fā)生連接和斷開連接,影響性能和增加操作時(shí)間,所以可以使用SQL 批量修改的方式去操作數(shù)據(jù)庫(kù),感興趣的朋友一起學(xué)習(xí)下吧
    2023-09-09
  • Mysql三種常用的刪除數(shù)據(jù)或者表的方式

    Mysql三種常用的刪除數(shù)據(jù)或者表的方式

    本文主要介紹了Mysql三種常用的刪除數(shù)據(jù)或者表的方式,它們分別是?TRUNCATE、DROP?和?DELETE,下面就詳細(xì)的介紹一下這三種的使用,感興趣的可以了解一下
    2024-01-01
  • MySQL的數(shù)據(jù)類型和建庫(kù)策略分析詳解

    MySQL的數(shù)據(jù)類型和建庫(kù)策略分析詳解

    無(wú)論是在小得可憐的免費(fèi)數(shù)據(jù)庫(kù)空間或是大型電子商務(wù)網(wǎng)站,合理的設(shè)計(jì)表結(jié)構(gòu)、充分利用空間是十分必要的。這就要求我們對(duì)數(shù)據(jù)庫(kù)系統(tǒng)的常用數(shù)據(jù)類型有充分的認(rèn)識(shí)。下面我就將我的一點(diǎn)心得寫出來(lái)跟大家分享。
    2008-04-04
  • MySQL prepare語(yǔ)句的SQL語(yǔ)法

    MySQL prepare語(yǔ)句的SQL語(yǔ)法

    PREPARE語(yǔ)句用于預(yù)備一個(gè)語(yǔ)句,并指定名稱statement_name,以后引用該語(yǔ)句
    2012-01-01

最新評(píng)論