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

MySQL內外連接實戰(zhàn)詳解

 更新時間:2025年08月07日 09:22:42   作者:茉莉玫瑰花茶  
文章詳解MySQL內連接與外連接,內連接通過WHERE篩選匹配記錄,外連接包括左、右連接,保留一側全數據,包含案例與練習及LeetCode實戰(zhàn)題目,對mysql內外連接實戰(zhàn)案例相關知識感興趣的朋友一起看看吧

表的連接分類

表的連接主要分為內連接和外連接兩種類型。

內連接

內連接實際上就是利用WHERE子句對兩種表形成的笛卡爾積進行篩選,這是我們前面學習的主要查詢方式,也是開發(fā)過程中使用最多的連接查詢。

我們除了可以使用“ , ”來隔離表,我們還可以使用下面的語法:和我們之前笛卡爾積,后面使用where條件篩選是一樣的效果的!只不過下面的寫法是比較標準的!

SELECT 字段 FROM 表1 INNER JOIN 表2 ON 連接條件 AND 其他條件;

前面學習的大部分查詢都屬于內連接。

案例:顯示SMITH的名字和部門名稱

傳統寫法:

SELECT ename, dname FROM EMP, DEPT WHERE EMP.deptno=DEPT.deptno AND ename='SMITH';
mysql> select emp.ename, dept.dname from emp, dept where emp.deptno=dept.deptno and emp.ename='SMITH';
+-------+----------+
| ename | dname    |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)

標準內連接寫法:

SELECT ename, dname FROM EMP INNER JOIN DEPT ON EMP.deptno=DEPT.deptno AND ename='SMITH';
mysql> select emp.ename, dept.dname from emp inner join dept on emp.deptno=dept.deptno and emp.ename='SMITH';
+-------+----------+
| ename | dname    |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)

外連接

外連接分為左外連接和右外連接。

為主的在哪一邊,基本就是使用那一邊的連接方式!--- 后面的練習部分體現!??!

左外連接

如果聯合查詢時,左側的表完全顯示(左側的信息不要做任何的過濾和篩選,完全保留)(即使右側沒有匹配記錄),我們就稱為左外連接。

僅僅將 inner join 改成了 left join

SELECT 字段名 FROM 表名1 LEFT JOIN 表名2 ON 連接條件

創(chuàng)建測試表:

CREATE TABLE stu (id INT, name VARCHAR(30)); -- 學生表
INSERT INTO stu VALUES(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');
CREATE TABLE exam (id INT, grade INT); -- 成績表
INSERT INTO exam VALUES(1, 56),(2,76),(11, 8);
mysql> select * from stu;
+------+------+
| id   | name |
+------+------+
|    1 | jack |
|    2 | tom  |
|    3 | kity |
|    4 | nono |
+------+------+
4 rows in set (0.00 sec)
mysql> select * from exam;
+------+-------+
| id   | grade |
+------+-------+
|    1 |    56 |
|    2 |    76 |
|   11 |     8 |
+------+-------+
3 rows in set (0.00 sec)

查詢所有學生的成績,如果學生沒有成績也要顯示個人信息:

SELECT * FROM stu LEFT JOIN exam ON stu.id=exam.id;
mysql> select * from stu left join exam on stu.id=exam.id;
+------+------+------+-------+
| id   | name | id   | grade |
+------+------+------+-------+
|    1 | jack |    1 |    56 |
|    2 | tom  |    2 |    76 |
|    3 | kity | NULL |  NULL |
|    4 | nono | NULL |  NULL |
+------+------+------+-------+
4 rows in set (0.00 sec)

這個查詢會顯示左邊表的所有記錄,即使右邊表沒有匹配的記錄。

右外連接

如果聯合查詢時,右側的表完全顯示(即使左側沒有匹配記錄),我們就稱為右外連接。

SELECT 字段 FROM 表名1 RIGHT JOIN 表名2 ON 連接條件;

對stu表和exam表聯合查詢,顯示所有成績,即使沒有對應學生:

SELECT * FROM stu RIGHT JOIN exam ON stu.id=exam.id;
mysql> select * from stu right join exam on stu.id=exam.id;
+------+------+------+-------+
| id   | name | id   | grade |
+------+------+------+-------+
|    1 | jack |    1 |    56 |
|    2 | tom  |    2 |    76 |
| NULL | NULL |   11 |     8 |
+------+------+------+-------+
3 rows in set (0.00 sec)

練習:

列出部門名稱和這些部門的員工信息,同時列出沒有員工的部門

方法一(使用左連接):

SELECT d.dname, e.* FROM dept d LEFT JOIN emp e ON d.deptno=e.deptno;
mysql> select d.dname, e.* from dept d left join emp e on d.deptno=e.deptno;
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
| dname      | empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
| ACCOUNTING | 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
| ACCOUNTING | 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| ACCOUNTING | 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| RESEARCH   | 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| RESEARCH   | 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| RESEARCH   | 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| RESEARCH   | 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| RESEARCH   | 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| SALES      | 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| SALES      | 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| SALES      | 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| SALES      | 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| SALES      | 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| SALES      | 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| OPERATIONS |   NULL | NULL   | NULL      | NULL | NULL                |    NULL |    NULL |   NULL |
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
15 rows in set (0.00 sec)

方法二(使用右連接):

SELECT d.dname, e.* FROM emp e RIGHT JOIN dept d ON d.deptno=e.deptno;
mysql> select d.dname, e.* from emp e right join dept d on d.deptno=e.deptno;
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
| dname      | empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
| ACCOUNTING | 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
| ACCOUNTING | 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| ACCOUNTING | 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| RESEARCH   | 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| RESEARCH   | 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| RESEARCH   | 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| RESEARCH   | 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| RESEARCH   | 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| SALES      | 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| SALES      | 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| SALES      | 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| SALES      | 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| SALES      | 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| SALES      | 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| OPERATIONS |   NULL | NULL   | NULL      | NULL | NULL                |    NULL |    NULL |   NULL |
+------------+--------+--------+-----------+------+---------------------+---------+---------+--------+
15 rows in set (0.00 sec)

實戰(zhàn)OJ題目

到此這篇關于MySQL內外連接詳解的文章就介紹到這了,更多相關mysql內外連接內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • win2003服務器下配置 MySQL 群集(Cluster)的方法

    win2003服務器下配置 MySQL 群集(Cluster)的方法

    MySQL 群集是 MySQL 適合于分布式計算環(huán)境的高可用、高冗余版本。它采用了 NDB Cluster 存儲引擎,允許在 1 個群集中運行多個 MySQL 服務器。
    2010-12-12
  • Pentaho Kettle工具實現SQL Server到MySQL數據庫的定時數據同步方案

    Pentaho Kettle工具實現SQL Server到MySQL數據庫的定時數據同步方案

    本文介紹了使用Kettle工具實現SQL Server到MySQL數據庫的定時數據同步方案,首先需放置數據庫驅動并創(chuàng)建目標表結構,通過圖形化界面配置轉換流程,該方案無需編寫代碼,完全通過圖形化操作即可實現跨數據庫的定時數據同步
    2026-03-03
  • Mysql索引的類型和優(yōu)缺點詳解

    Mysql索引的類型和優(yōu)缺點詳解

    這篇文章主要為大家詳細介紹了Mysql索引的類型和優(yōu)缺點,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • 詳解MySQL主從復制實戰(zhàn) - 基于GTID的復制

    詳解MySQL主從復制實戰(zhàn) - 基于GTID的復制

    本篇文章主要介紹了MySQL主從復制實戰(zhàn) - 基于GTID的復制,基于GTID的復制是MySQL 5.6后新增的復制方式.有興趣的可以了解一下。
    2017-03-03
  • Docker部署MySQL8.0從拉取鏡像到配置遠程訪問完整指南

    Docker部署MySQL8.0從拉取鏡像到配置遠程訪問完整指南

    在開發(fā)測試環(huán)境中,通過Docker部署MySQL 8.0可實現快速啟動、環(huán)境隔離和數據持久化,這篇文章主要介紹了Docker部署MySQL8.0從拉取鏡像到配置遠程訪問的相關資料,需要的朋友可以參考下
    2026-05-05
  • MySQL中跨表排序和指定類型置頂的四種寫法詳解

    MySQL中跨表排序和指定類型置頂的四種寫法詳解

    這篇文章主要介紹了MySQL跨表排序和固定置頂的兩種排序需求的實現方法,并結合實戰(zhàn)場景分析了四種解決方案,通過具體SQL示例和適用場景分析,幫助開發(fā)者更好地理解和應用這些排序策略
    2026-06-06
  • MySQL視圖中用變量實現自動加入序號功能

    MySQL視圖中用變量實現自動加入序號功能

    在 MySQL 中,視圖不支持直接使用變量來生成序號,因為視圖是基于靜態(tài) SQL 查詢定義的,而變量是在運行時動態(tài)計算的,不過,你可以通過一些技巧來實現類似的效果,以下是一個常見的方法,使用子查詢來初始化變量,然后在視圖中使用這些變量,需要的朋友可以參考下
    2024-10-10
  • 解析MySQL binlog

    解析MySQL binlog

    我們都知道,binlog可以說是MySQL中比較重要的日志了,在日常學習及運維過程中,也經常會遇到。不清楚你對binlog了解多少呢?本篇文章將從binlog作用、binlog相關參數、解析binlog內容三個方面帶你了解binlog
    2021-06-06
  • 遠程訪問MySQL數據庫的方法小結

    遠程訪問MySQL數據庫的方法小結

    MySQL數據庫不允許從遠程訪問如何辦?本文提供了 3種解決思路方法
    2009-12-12
  • mysql中索引使用不當速度比沒加索引還慢的測試

    mysql中索引使用不當速度比沒加索引還慢的測試

    mysql的索引使用不當速度比沒加索引還慢,我們舉個例子來解釋一下。
    2011-08-08

最新評論

巴林左旗| 肥乡县| 万全县| 灵寿县| 蓬溪县| 新野县| 西平县| 二手房| 潜江市| 石狮市| 柳林县| 大洼县| 宁南县| 达拉特旗| 高唐县| 育儿| 饶阳县| 河津市| 黑河市| 新源县| 克什克腾旗| 双城市| 通渭县| 工布江达县| 永善县| 凭祥市| 社旗县| 英德市| 黄平县| 苏州市| 玉龙| 新兴县| 吉安县| 镇宁| 浦城县| 长葛市| 阳西县| 历史| 安康市| 横山县| 铜山县|