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

MySQL數(shù)據(jù)庫連接查詢?join原理

 更新時(shí)間:2022年06月08日 09:09:26   作者:彭世瑜  
這篇文章主要介紹了MySQL數(shù)據(jù)庫連接查詢?join原理,文章首先通過將多張表連到一起查詢?導(dǎo)致記錄行數(shù)和字段列發(fā)生變化,利用一對(duì)一、一對(duì)多和多對(duì)多關(guān)系保證數(shù)據(jù)完整性展開主題內(nèi)容,需要的小伙伴可以參考一下

1、連接查詢的分類

  • 交叉連接
  • 內(nèi)連接
  • 外連接
    • 左外鏈接(左連接)
    • 右外連接(右連接)
  • 自然連接

2、交叉連接

將兩張表的數(shù)據(jù)與另外一張表彼此交叉

2.1、原理

笛卡爾積:

  • 從第一張表一次取出每一條數(shù)據(jù)
  • 取出每一條記錄之后,與另外一張表的全部記錄挨個(gè)匹配
  • 沒有任何匹配條件,所有的結(jié)果都會(huì)保留
  • 記錄數(shù)=第一張表記錄數(shù) * 第二張表記錄數(shù)
  • 字段數(shù) = 第一張表字段數(shù) + 第二章表字段數(shù)

2.2、基本語法

表1 cross join 表2;
mysql> select * from tb_teacher;
+--------+------+
| name   | age  |
+--------+------+
| Jack   |   24 |
| Tom    |   26 |
| Steve  | NULL |
| 張三   |   23 |
| 張三   |   23 |
+--------+------+
5 rows in set (0.00 sec)

mysql> select * from my_student;
+----+--------+----------+------+--------+
| id | name   | class_id | age  | gender |
+----+--------+----------+------+--------+
|  1 | 劉備   |        1 |   18 |      2 |
|  2 | 李四   |        1 |   19 |      1 |
|  3 | 王五   |        2 |   20 |      2 |
|  7 | 張飛   |        2 |   21 |      1 |
|  8 | 關(guān)羽   |        1 |   22 |      2 |
|  9 | 曹操   |        1 |   20 |   NULL |
+----+--------+----------+------+--------+
6 rows in set (0.01 sec)

mysql> select * from my_student cross join tb_teacher;
+----+--------+----------+------+--------+--------+------+
| id | name   | class_id | age  | gender | name   | age  |
+----+--------+----------+------+--------+--------+------+
|  1 | 劉備   |        1 |   18 |      2 | Jack   |   24 |
|  1 | 劉備   |        1 |   18 |      2 | Tom    |   26 |
|  1 | 劉備   |        1 |   18 |      2 | Steve  | NULL |
|  1 | 劉備   |        1 |   18 |      2 | 張三   |   23 |
|  1 | 劉備   |        1 |   18 |      2 | 張三   |   23 |
|  2 | 李四   |        1 |   19 |      1 | Jack   |   24 |
|  2 | 李四   |        1 |   19 |      1 | Tom    |   26 |
|  2 | 李四   |        1 |   19 |      1 | Steve  | NULL |
|  2 | 李四   |        1 |   19 |      1 | 張三   |   23 |
|  2 | 李四   |        1 |   19 |      1 | 張三   |   23 |
|  3 | 王五   |        2 |   20 |      2 | Jack   |   24 |
|  3 | 王五   |        2 |   20 |      2 | Tom    |   26 |
|  3 | 王五   |        2 |   20 |      2 | Steve  | NULL |
|  3 | 王五   |        2 |   20 |      2 | 張三   |   23 |
|  3 | 王五   |        2 |   20 |      2 | 張三   |   23 |
|  7 | 張飛   |        2 |   21 |      1 | Jack   |   24 |
|  7 | 張飛   |        2 |   21 |      1 | Tom    |   26 |
|  7 | 張飛   |        2 |   21 |      1 | Steve  | NULL |
|  7 | 張飛   |        2 |   21 |      1 | 張三   |   23 |
|  7 | 張飛   |        2 |   21 |      1 | 張三   |   23 |
|  8 | 關(guān)羽   |        1 |   22 |      2 | Jack   |   24 |
|  8 | 關(guān)羽   |        1 |   22 |      2 | Tom    |   26 |
|  8 | 關(guān)羽   |        1 |   22 |      2 | Steve  | NULL |
|  8 | 關(guān)羽   |        1 |   22 |      2 | 張三   |   23 |
|  8 | 關(guān)羽   |        1 |   22 |      2 | 張三   |   23 |
|  9 | 曹操   |        1 |   20 |   NULL | Jack   |   24 |
|  9 | 曹操   |        1 |   20 |   NULL | Tom    |   26 |
|  9 | 曹操   |        1 |   20 |   NULL | Steve  | NULL |
|  9 | 曹操   |        1 |   20 |   NULL | 張三   |   23 |
|  9 | 曹操   |        1 |   20 |   NULL | 張三   |   23 |
+----+--------+----------+------+--------+--------+------+
30 rows in set (0.00 sec)

2.3、應(yīng)用

基本沒有實(shí)際意義

等價(jià)于

select * from my_student, tb_teacher;

3、內(nèi)連接

從一張表中取出所有的記錄,去另外一張表中匹配,利用匹配條件進(jìn)行匹配,成功則保留,失敗則放棄

3.1、原理

  • 從第一張表中取出一條記錄,然后去另外一張表中進(jìn)行匹配
  • 利用匹配條件進(jìn)行匹配
  • 匹配到則保留,繼續(xù)向下匹配
  • 匹配失敗則放棄

3.2、基本語法

表1 inner join 表2 on 匹配條件
create table my_class(
    id int primary key auto_increment,
    name varchar(10) not null
);

insert into my_class (name) values ('一班'), ('二班');

mysql> select * from my_class;
+----+--------+
| id | name   |
+----+--------+
|  1 | 一班   |
|  2 | 二班   |
+----+--------+

mysql> select * from my_student;
+----+--------+----------+------+--------+
| id | name   | class_id | age  | gender |
+----+--------+----------+------+--------+
|  1 | 劉備   |        1 |   18 |      2 |
|  2 | 李四   |        1 |   19 |      1 |
|  3 | 王五   |        2 |   20 |      2 |
|  4 | 張飛   |        2 |   21 |      1 |
|  5 | 關(guān)羽   |        1 |   22 |      2 |
|  6 | 曹操   |        1 |   20 |   NULL |
+----+--------+----------+------+--------+

-- 如果內(nèi)連接沒有條件,其實(shí)就是交叉連接(笛卡爾積)
mysql> select * from my_student inner join my_class;
+----+--------+----------+------+--------+----+--------+
| id | name   | class_id | age  | gender | id | name   |
+----+--------+----------+------+--------+----+--------+
|  1 | 劉備   |        1 |   18 |      2 |  1 | 一班   |
|  1 | 劉備   |        1 |   18 |      2 |  2 | 二班   |
|  2 | 李四   |        1 |   19 |      1 |  1 | 一班   |
|  2 | 李四   |        1 |   19 |      1 |  2 | 二班   |
|  3 | 王五   |        2 |   20 |      2 |  1 | 一班   |
|  3 | 王五   |        2 |   20 |      2 |  2 | 二班   |
|  4 | 張飛   |        2 |   21 |      1 |  1 | 一班   |
|  4 | 張飛   |        2 |   21 |      1 |  2 | 二班   |
|  5 | 關(guān)羽   |        1 |   22 |      2 |  1 | 一班   |
|  5 | 關(guān)羽   |        1 |   22 |      2 |  2 | 二班   |
|  6 | 曹操   |        1 |   20 |   NULL |  1 | 一班   |
|  6 | 曹操   |        1 |   20 |   NULL |  2 | 二班   |
+----+--------+----------+------+--------+----+--------+
12 rows in set (0.00 sec)

-- 表的設(shè)計(jì),通常會(huì)有同名字段,通常使用`表名.字段`來保證唯一性
mysql> select * from my_student inner join my_class on my_student.class_id = my_class.id;
+----+--------+----------+------+--------+----+--------+
| id | name   | class_id | age  | gender | id | name   |
+----+--------+----------+------+--------+----+--------+
|  1 | 劉備   |        1 |   18 |      2 |  1 | 一班   |
|  2 | 李四   |        1 |   19 |      1 |  1 | 一班   |
|  3 | 王五   |        2 |   20 |      2 |  2 | 二班   |
|  4 | 張飛   |        2 |   21 |      1 |  2 | 二班   |
|  5 | 關(guān)羽   |        1 |   22 |      2 |  1 | 一班   |
|  6 | 曹操   |        1 |   20 |   NULL |  1 | 一班   |
+----+--------+----------+------+--------+----+--------+

-- 如果表名比較長,可以使用別名簡化
mysql> select * from my_student as a inner join my_class b on a.class_id = b.id;
+----+--------+----------+------+--------+----+--------+
| id | name   | class_id | age  | gender | id | name   |
+----+--------+----------+------+--------+----+--------+
|  1 | 劉備   |        1 |   18 |      2 |  1 | 一班   |
|  2 | 李四   |        1 |   19 |      1 |  1 | 一班   |
|  3 | 王五   |        2 |   20 |      2 |  2 | 二班   |
|  4 | 張飛   |        2 |   21 |      1 |  2 | 二班   |
|  5 | 關(guān)羽   |        1 |   22 |      2 |  1 | 一班   |
|  6 | 曹操   |        1 |   20 |   NULL |  1 | 一班   |
+----+--------+----------+------+--------+----+--------+

-- 可以交換兩張表的先后順序
mysql> select * from my_class b inner join my_student as a on a.class_id = b.id;
+----+--------+----+--------+----------+------+--------+
| id | name   | id | name   | class_id | age  | gender |
+----+--------+----+--------+----------+------+--------+
|  1 | 一班   |  1 | 劉備   |        1 |   18 |      2 |
|  1 | 一班   |  2 | 李四   |        1 |   19 |      1 |
|  2 | 二班   |  3 | 王五   |        2 |   20 |      2 |
|  2 | 二班   |  4 | 張飛   |        2 |   21 |      1 |
|  1 | 一班   |  5 | 關(guān)羽   |        1 |   22 |      2 |
|  1 | 一班   |  6 | 曹操   |        1 |   20 |   NULL |
+----+--------+----+--------+----------+------+--------+

-- on 可以使用 where 替換,推薦使用 on
mysql> select * from my_class b inner join my_student as a where a.class_id = b.id;
+----+--------+----+--------+----------+------+--------+
| id | name   | id | name   | class_id | age  | gender |
+----+--------+----+--------+----------+------+--------+
|  1 | 一班   |  1 | 劉備   |        1 |   18 |      2 |
|  1 | 一班   |  2 | 李四   |        1 |   19 |      1 |
|  2 | 二班   |  3 | 王五   |        2 |   20 |      2 |
|  2 | 二班   |  4 | 張飛   |        2 |   21 |      1 |
|  1 | 一班   |  5 | 關(guān)羽   |        1 |   22 |      2 |
|  1 | 一班   |  6 | 曹操   |        1 |   20 |   NULL |
+----+--------+----+--------+----------+------+--------+

3.3、應(yīng)用

內(nèi)連接通常是在對(duì)數(shù)據(jù)有精確要求的地方使用,必須保證兩張表中都能進(jìn)行數(shù)據(jù)匹配,內(nèi)連接匹配到才會(huì)保存

4、外連接

按照某一張表作為主表(表中所有記錄在最后都會(huì)保留)根據(jù)條件取連接另外一張表,從而得到目標(biāo)數(shù)據(jù)

外連接分為兩種:

  • 左連接:左表是主表
  • 右連接:右表是主表

4.1、原理

  • 確定主表,左連接就是左邊的表為主表,右連接就是右邊的表為主表
  • 拿主表的每一條記錄,去匹配另外的一張表(從表)的每一條記錄
  • 如果滿足匹配條件,保留,不滿足即不保留
  • 如果主表記錄在從表中一條都沒有匹配成功,那么也要保留記錄, 從表對(duì)應(yīng)的字段值都是null

4.2、基本語法

-- 左連接
主表 left join 從表 on 連接條件;
-- 右連接
從表 right join 主表 on 連接條件;

左表的數(shù)據(jù)在前,右表的數(shù)據(jù)在后

mysql> select * from my_student;
+----+--------+----------+------+--------+
| id | name   | class_id | age  | gender |
+----+--------+----------+------+--------+
|  1 | 劉備   |        1 |   18 |      2 |
|  2 | 李四   |        1 |   19 |      1 |
|  3 | 王五   |        2 |   20 |      2 |
|  4 | 張飛   |        2 |   21 |      1 |
|  5 | 關(guān)羽   |        1 |   22 |      2 |
|  6 | 曹操   |        1 |   20 |   NULL |
+----+--------+----------+------+--------+
mysql> select * from my_class;
+----+--------+
| id | name   |
+----+--------+
|  1 | 一班   |
|  3 | 三班   |
|  2 | 二班   |
+----+--------+
mysql> select * from my_student as s left join my_class c on s.class_id = c.id;
+----+--------+----------+------+--------+------+--------+
| id | name   | class_id | age  | gender | id   | name   |
+----+--------+----------+------+--------+------+--------+
|  1 | 劉備   |        1 |   18 |      2 |    1 | 一班   |
|  2 | 李四   |        1 |   19 |      1 |    1 | 一班   |
|  3 | 王五   |        2 |   20 |      2 |    2 | 二班   |
|  4 | 張飛   |        2 |   21 |      1 |    2 | 二班   |
|  5 | 關(guān)羽   |        1 |   22 |      2 |    1 | 一班   |
|  6 | 曹操   |        1 |   20 |   NULL |    1 | 一班   |
+----+--------+----------+------+--------+------+--------+
select * from my_student as s right join my_class c on s.class_id = c.id;
mysql> select * from my_student as s right join my_class c on s.class_id = c.id;
+------+--------+----------+------+--------+----+--------+
| id   | name   | class_id | age  | gender | id | name   |
+------+--------+----------+------+--------+----+--------+
|    1 | 劉備   |        1 |   18 |      2 |  1 | 一班   |
|    2 | 李四   |        1 |   19 |      1 |  1 | 一班   |
|    3 | 王五   |        2 |   20 |      2 |  2 | 二班   |
|    4 | 張飛   |        2 |   21 |      1 |  2 | 二班   |
|    5 | 關(guān)羽   |        1 |   22 |      2 |  1 | 一班   |
|    6 | 曹操   |        1 |   20 |   NULL |  1 | 一班   |
| NULL | NULL   |     NULL | NULL |   NULL |  3 | 三班   |
+------+--------+----------+------+--------+----+--------+

4.3、特點(diǎn)

外連接中主表的數(shù)據(jù)一定會(huì)保存,連接之后不會(huì)出現(xiàn)記錄數(shù)少于主表(內(nèi)連接可能少數(shù)據(jù))

左連接和右連接可以相互轉(zhuǎn)換,但是數(shù)據(jù)對(duì)應(yīng)的位置(字段順序)會(huì)改變

4.4、應(yīng)用

獲取對(duì)應(yīng)主表以及其他數(shù)據(jù)(關(guān)聯(lián))

通常使用左連接

5、using關(guān)鍵字

在連接查詢中用來代替對(duì)應(yīng)on關(guān)鍵字進(jìn)行條件匹配

5.1、原理

  • 在連接查詢時(shí),使用on的地方用using代替
  • 使用using的前提是對(duì)應(yīng)的兩張表連接的字段名是同名的(類似自然連接)
  • 如果使用using關(guān)鍵字,那么對(duì)應(yīng)的同名字段,最后在結(jié)果中只會(huì)保留一個(gè)

5.2、基本語法

表1 [inner, left, right] join 表2 using (同名字段列表);
select * from my_student left join my_class using(class_id);
-- 等價(jià)于
select * from my_student left join my_class on my_student.class_id = my_class.class_id;

這個(gè)方法通常不使用

到此這篇關(guān)于MySQL數(shù)據(jù)庫連接查詢 join原理的文章就介紹到這了,更多相關(guān)MySQL連接查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql的基礎(chǔ)語句和外鍵查詢及其語句詳解(推薦)

    mysql的基礎(chǔ)語句和外鍵查詢及其語句詳解(推薦)

    這篇文章主要介紹了mysql的基礎(chǔ)語句和外鍵查詢及其語句詳解(推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-04-04
  • 解析數(shù)據(jù)庫分頁的兩種方法對(duì)比(row_number()over()和top的對(duì)比)

    解析數(shù)據(jù)庫分頁的兩種方法對(duì)比(row_number()over()和top的對(duì)比)

    本篇文章是對(duì)數(shù)據(jù)庫分頁的兩種方法對(duì)比(row_number()over()和top的對(duì)比)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • MySQL中預(yù)處理語句prepare、execute與deallocate的使用教程

    MySQL中預(yù)處理語句prepare、execute與deallocate的使用教程

    這篇文章主要介紹了MySQL中預(yù)處理語句prepare、execute與deallocate的使用教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • 一文帶你永久擺脫Mysql時(shí)區(qū)錯(cuò)誤問題(idea數(shù)據(jù)庫可視化插件配置)

    一文帶你永久擺脫Mysql時(shí)區(qū)錯(cuò)誤問題(idea數(shù)據(jù)庫可視化插件配置)

    在MySQL啟動(dòng)時(shí)會(huì)檢查當(dāng)前系統(tǒng)的時(shí)區(qū)并根據(jù)系統(tǒng)時(shí)區(qū)設(shè)置全局參數(shù)system_time_zone的值,下面這篇文章主要給大家介紹了關(guān)于如何永久擺脫Mysql時(shí)區(qū)錯(cuò)誤問題(idea數(shù)據(jù)庫可視化插件配置)的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 使用Dify訪問mysql數(shù)據(jù)庫詳細(xì)代碼示例

    使用Dify訪問mysql數(shù)據(jù)庫詳細(xì)代碼示例

    這篇文章主要介紹了使用Dify訪問mysql數(shù)據(jù)庫的相關(guān)資料,并詳細(xì)講解了如何在本地搭建數(shù)據(jù)庫訪問服務(wù),使用ngrok暴露到公網(wǎng),并創(chuàng)建知識(shí)庫、數(shù)據(jù)庫訪問工作流和智能體,需要的朋友可以參考下
    2025-03-03
  • xampp中修改mysql默認(rèn)空密碼(root密碼)的方法分享

    xampp中修改mysql默認(rèn)空密碼(root密碼)的方法分享

    以前開發(fā)我一直都是用的phpnow做php開發(fā)環(huán)境,phpnow的特點(diǎn)就是一鍵安裝,安裝的時(shí)候會(huì)要求用戶輸入mysql的root密碼。今天由于客戶機(jī)器使用的xampp作為開發(fā)環(huán)境,所以碰到了修改mysql默認(rèn)空密碼的問題
    2014-04-04
  • MySQL?中常見的幾種高可用架構(gòu)部署方案解析

    MySQL?中常見的幾種高可用架構(gòu)部署方案解析

    MySQL Replication 是官方提供的主從同步方案,用于將一個(gè) MySQL 的實(shí)例同步到另一個(gè)實(shí)例中,這篇文章主要介紹了MySQL?中常見的幾種高可用架構(gòu)部署方案,需要的朋友可以參考下
    2023-04-04
  • 關(guān)于mysql數(shù)據(jù)庫誤刪除后的數(shù)據(jù)恢復(fù)操作說明

    關(guān)于mysql數(shù)據(jù)庫誤刪除后的數(shù)據(jù)恢復(fù)操作說明

    下面小編就為大家?guī)硪黄P(guān)于mysql數(shù)據(jù)庫誤刪除后的數(shù)據(jù)恢復(fù)操作說明。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • MySQL5.6.22安裝配置方法圖文教程

    MySQL5.6.22安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了MySQL5.6.22安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • MySQL數(shù)據(jù)表添加字段的三種方式

    MySQL數(shù)據(jù)表添加字段的三種方式

    本文主要介紹了MySQL數(shù)據(jù)表添加字段的三種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評(píng)論

高密市| 当阳市| 长沙市| 高密市| 鸡泽县| 雷山县| 桂平市| 五家渠市| 徐州市| 冷水江市| 周口市| 凯里市| 普格县| 巴中市| 萨嘎县| 乐昌市| 石狮市| 克什克腾旗| 体育| 秦安县| 眉山市| 屯昌县| 辉县市| 宿迁市| 宁南县| 忻州市| 永新县| 潍坊市| 元谋县| 东乌珠穆沁旗| 华阴市| 龙胜| 项城市| 修水县| 通城县| 华亭县| 凯里市| 肇州县| 五台县| 甘肃省| 怀集县|