亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL數據庫如何連接查詢join

發布時間:2022-06-08 10:26:20 來源:億速云 閱讀:140 作者:zzz 欄目:開發技術

今天小編給大家分享一下MySQL數據庫如何連接查詢join的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

1、連接查詢的分類

  • 交叉連接

  • 內連接

  • 外連接

    • 左外鏈接(左連接)

    • 右外連接(右連接)

  • 自然連接

2、交叉連接

將兩張表的數據與另外一張表彼此交叉

2.1、原理

笛卡爾積:

  • 從第一張表一次取出每一條數據

  • 取出每一條記錄之后,與另外一張表的全部記錄挨個匹配

  • 沒有任何匹配條件,所有的結果都會保留

  • 記錄數=第一張表記錄數 * 第二張表記錄數

  • 字段數 = 第一張表字段數 + 第二章表字段數

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 | 關羽   |        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 | 關羽   |        1 |   22 |      2 | Jack   |   24 |
|  8 | 關羽   |        1 |   22 |      2 | Tom    |   26 |
|  8 | 關羽   |        1 |   22 |      2 | Steve  | NULL |
|  8 | 關羽   |        1 |   22 |      2 | 張三   |   23 |
|  8 | 關羽   |        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、應用

基本沒有實際意義

等價于

select * from my_student, tb_teacher;

3、內連接

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

3.1、原理

  • 從第一張表中取出一條記錄,然后去另外一張表中進行匹配

  • 利用匹配條件進行匹配

  • 匹配到則保留,繼續向下匹配

  • 匹配失敗則放棄

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 | 關羽   |        1 |   22 |      2 |
|  6 | 曹操   |        1 |   20 |   NULL |
+----+--------+----------+------+--------+

-- 如果內連接沒有條件,其實就是交叉連接(笛卡爾積)
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 | 關羽   |        1 |   22 |      2 |  1 | 一班   |
|  5 | 關羽   |        1 |   22 |      2 |  2 | 二班   |
|  6 | 曹操   |        1 |   20 |   NULL |  1 | 一班   |
|  6 | 曹操   |        1 |   20 |   NULL |  2 | 二班   |
+----+--------+----------+------+--------+----+--------+
12 rows in set (0.00 sec)

-- 表的設計,通常會有同名字段,通常使用`表名.字段`來保證唯一性
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 | 關羽   |        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 | 關羽   |        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 | 關羽   |        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 | 關羽   |        1 |   22 |      2 |
|  1 | 一班   |  6 | 曹操   |        1 |   20 |   NULL |
+----+--------+----+--------+----------+------+--------+

3.3、應用

內連接通常是在對數據有精確要求的地方使用,必須保證兩張表中都能進行數據匹配,內連接匹配到才會保存

4、外連接

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

外連接分為兩種:

  • 左連接:左表是主表

  • 右連接:右表是主表

4.1、原理

  • 確定主表,左連接就是左邊的表為主表,右連接就是右邊的表為主表

  • 拿主表的每一條記錄,去匹配另外的一張表(從表)的每一條記錄

  • 如果滿足匹配條件,保留,不滿足即不保留

  • 如果主表記錄在從表中一條都沒有匹配成功,那么也要保留記錄, 從表對應的字段值都是null

4.2、基本語法

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

左表的數據在前,右表的數據在后

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 | 關羽   |        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 | 關羽   |        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 | 關羽   |        1 |   22 |      2 |  1 | 一班   |
|    6 | 曹操   |        1 |   20 |   NULL |  1 | 一班   |
| NULL | NULL   |     NULL | NULL |   NULL |  3 | 三班   |
+------+--------+----------+------+--------+----+--------+

4.3、特點

外連接中主表的數據一定會保存,連接之后不會出現記錄數少于主表(內連接可能少數據)

左連接和右連接可以相互轉換,但是數據對應的位置(字段順序)會改變

4.4、應用

獲取對應主表以及其他數據(關聯)

通常使用左連接

5、using關鍵字

在連接查詢中用來代替對應on關鍵字進行條件匹配

5.1、原理

  • 在連接查詢時,使用on的地方用using代替

  • 使用using的前提是對應的兩張表連接的字段名是同名的(類似自然連接)

  • 如果使用using關鍵字,那么對應的同名字段,最后在結果中只會保留一個

5.2、基本語法

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

這個方法通常不使用

以上就是“MySQL數據庫如何連接查詢join”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹤壁市| 安乡县| 博客| 苏州市| 玛纳斯县| 隆尧县| 中江县| 安乡县| 嘉鱼县| 尼勒克县| 南漳县| 大化| 项城市| 黄陵县| 广饶县| 蒙自县| 化德县| 福建省| 旌德县| 平顶山市| 宜宾县| 昭觉县| 凤翔县| 特克斯县| 德格县| 驻马店市| 徐州市| 奈曼旗| 镇安县| 桂阳县| 海淀区| 宾阳县| 新宁县| 黑龙江省| 阿勒泰市| 江达县| 修水县| 广南县| 扶余县| 客服| 桐城市|