【MySQL】表的内外连接

文章目录

  • 一、内连接
    • [1.1 显示SMITH的名字和部门名称](#1.1 显示SMITH的名字和部门名称)
  • 二、外连接
    • [2.1 左外连接](#2.1 左外连接)
      • [2.1.1 查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来](#2.1.1 查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来)
    • [2.2 右外连接](#2.2 右外连接)
      • [2.2.1 对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来](#2.2.1 对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来)
      • [2.2.2 列出部门名称和这些部门的员工信息,同时列出没有员工的部门](#2.2.2 列出部门名称和这些部门的员工信息,同时列出没有员工的部门)

一、内连接

内连接就是利用where子句对两种表形成的笛卡尔积进行筛选,就是在from中把表连接号然后利用where条件筛选。

语法

sql 复制代码
select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件;

1.1 显示SMITH的名字和部门名称

sql 复制代码
# 要用到的两张表
mysql> select * from emp;
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| empno  | ename  | job       | mgr  | hiredate            | sal     | comm    | deptno |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| 007369 | SMITH  | CLERK     | 7902 | 1980-12-17 00:00:00 |  800.00 |    NULL |     20 |
| 007499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 00:00:00 | 1600.00 |  300.00 |     30 |
| 007521 | WARD   | SALESMAN  | 7698 | 1981-02-22 00:00:00 | 1250.00 |  500.00 |     30 |
| 007566 | JONES  | MANAGER   | 7839 | 1981-04-02 00:00:00 | 2975.00 |    NULL |     20 |
| 007654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 |     30 |
| 007698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 00:00:00 | 2850.00 |    NULL |     30 |
| 007782 | CLARK  | MANAGER   | 7839 | 1981-06-09 00:00:00 | 2450.00 |    NULL |     10 |
| 007788 | SCOTT  | ANALYST   | 7566 | 1987-04-19 00:00:00 | 3000.00 |    NULL |     20 |
| 007839 | KING   | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 |    NULL |     10 |
| 007844 | TURNER | SALESMAN  | 7698 | 1981-09-08 00:00:00 | 1500.00 |    0.00 |     30 |
| 007876 | ADAMS  | CLERK     | 7788 | 1987-05-23 00:00:00 | 1100.00 |    NULL |     20 |
| 007900 | JAMES  | CLERK     | 7698 | 1981-12-03 00:00:00 |  950.00 |    NULL |     30 |
| 007902 | FORD   | ANALYST   | 7566 | 1981-12-03 00:00:00 | 3000.00 |    NULL |     20 |
| 007934 | MILLER | CLERK     | 7782 | 1982-01-23 00:00:00 | 1300.00 |    NULL |     10 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
14 rows in set (0.00 sec)


mysql> select * from dept;
+--------+------------+----------+
| deptno | dname      | loc      |
+--------+------------+----------+
|     10 | ACCOUNTING | NEW YORK |
|     20 | RESEARCH   | DALLAS   |
|     30 | SALES      | CHICAGO  |
|     40 | OPERATIONS | BOSTON   |
+--------+------------+----------+
4 rows in set (0.00 sec)
  • 通过笛卡尔积筛选
sql 复制代码
mysql> select ename, dname from emp t1, dept t2 where t1.deptno=t2.deptno and t1.ename='SMITH';
+-------+----------+
| ename | dname    |
+-------+----------+
| SMITH | RESEARCH |
+-------+----------+
1 row in set (0.00 sec)
  • 标准的内连接的写法
sql 复制代码
mysql> select ename, dname from emp t1 inner join dept t2 on t1.deptno=t2.deptno;
+--------+------------+
| ename  | dname      |
+--------+------------+
| SMITH  | RESEARCH   |
| ALLEN  | SALES      |
| WARD   | SALES      |
| JONES  | RESEARCH   |
| MARTIN | SALES      |
| BLAKE  | SALES      |
| CLARK  | ACCOUNTING |
| SCOTT  | RESEARCH   |
| KING   | ACCOUNTING |
| TURNER | SALES      |
| ADAMS  | RESEARCH   |
| JAMES  | SALES      |
| FORD   | RESEARCH   |
| MILLER | ACCOUNTING |
+--------+------------+
14 rows in set (0.00 sec)

二、外连接

2.1 左外连接

如果联合查询,左侧的表完全显示就是左外连接。

语法:

sql 复制代码
select 字段名 from 表名1 left join 表名2 on 连接条件;

现在有两个表结构:

sql 复制代码
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)

2.1.1 查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显示出来

可以看到这两张表并不是完全吻合的,如果这里用内连接,未在两个表中同时出现的id字段将不会被筛选出来:

sql 复制代码
mysql> select * from stu inner join exam on stu.id=exam.id;
+------+------+------+-------+
| id   | name | id   | grade |
+------+------+------+-------+
|    1 | jack |    1 |    56 |
|    2 | tom  |    2 |    76 |
+------+------+------+-------+
2 rows in set (0.00 sec)
  • 左外连接
sql 复制代码
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)

2.2 右外连接

如果联合查询,右侧的表完全显示我们就说是右外连接。

语法:

sql 复制代码
select 字段 from 表名1 right join 表名2 on 连接条件;

2.2.1 对stu表和exam表联合查询,把所有的成绩都显示出来,即使这个成绩没有学生与它对应,也要显示出来

sql 复制代码
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)

2.2.2 列出部门名称和这些部门的员工信息,同时列出没有员工的部门

sql 复制代码
mysql> select dname, ename, dept.deptno from emp right join dept on dept.deptno=emp.deptno order by dept.deptno ASC;
+------------+--------+--------+
| dname      | ename  | deptno |
+------------+--------+--------+
| ACCOUNTING | KING   |     10 |
| ACCOUNTING | CLARK  |     10 |
| ACCOUNTING | MILLER |     10 |
| RESEARCH   | FORD   |     20 |
| RESEARCH   | JONES  |     20 |
| RESEARCH   | SMITH  |     20 |
| RESEARCH   | ADAMS  |     20 |
| RESEARCH   | SCOTT  |     20 |
| SALES      | BLAKE  |     30 |
| SALES      | WARD   |     30 |
| SALES      | TURNER |     30 |
| SALES      | MARTIN |     30 |
| SALES      | ALLEN  |     30 |
| SALES      | JAMES  |     30 |
| OPERATIONS | NULL   |     40 |
+------------+--------+--------+
15 rows in set (0.00 sec)
相关推荐
云和数据.ChenGuang12 分钟前
Django 应用安装脚本 – 如何将应用添加到 INSTALLED_APPS 设置中 原创
数据库·django·sqlite
woshilys40 分钟前
sql server 查询对象的修改时间
运维·数据库·sqlserver
Hacker_LaoYi40 分钟前
SQL注入的那些面试题总结
数据库·sql
建投数据2 小时前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi3 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀3 小时前
Redis梳理
数据库·redis·缓存
独行soc3 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天3 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺3 小时前
分布式系统架构:服务容错
数据库·架构
拭心4 小时前
Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
android