多表查询

目录

  1. 笛卡尔积查询 没卵用 略
  2. 内连接查询====>只连接匹配的行
  3. 外链接之左连接:优先显示左表全部记录
  4. 外链接之右连接:优先显示右表全部记录
  5. 全外连接

0. 需求

在多个表中查询需要的数据
例如:有班级表 和学生表
给你已给班级名称 请查询所有的学员数据
先查班级表 得到一个班级的id 再根据id去学院表查询对应的学员

!!!!!!语法!!!!!!

SELECT 字段列表
    FROM 表1 INNER|LEFT|RIGHT JOIN 表2
    ON 表1.字段 = 表2.字段;
准备表 : 
create table emp (id int,name char(10),sex char,dept_id int);
insert emp values(1,"大黄","m",1);
insert emp values(2,"老王","m",2);
insert emp values(3,"老李","w",30);

create table dept (id int,name char(10));
insert dept values(1,"市场");
insert dept values(2,"财务");
insert dept values(3,"行政");

mysql> select * from dept;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 市场   |
|    2 | 财务   |
|    3 | 行政   |
+------+--------+

mysql> select * from emp;
+------+--------+------+---------+
| id   | name   | sex  | dept_id |
+------+--------+------+---------+
|    1 | 大黄   | m    |       1 |
|    2 | 老王   | m    |       2 |
|    3 | 老李   | w    |      30 |
+------+--------+------+---------+

1. 笛卡尔积查询 没卵用 略

2. 内连接查询====>只连接匹配的行

查询关键字:inner join
on 用于多表查询 对条件进行限制
!!!!!注意 on 与where 区别!!!!!
where 用于一个字段的值与给定的值比较
on 用于两个字段的值比较

mysql> SELECT * FROM emp INNER JOIN dept  ON emp.dept_id = dept.id;
+------+--------+------+---------+------+--------+
| id   | name   | sex  | dept_id | id   | name   |
+------+--------+------+---------+------+--------+
|    1 | 大黄   | m    |       1 |    1 | 市场   |
|    2 | 老王   | m    |       2 |    2 | 财务   |
+------+--------+------+---------+------+--------+

3. 外链接之左连接:优先显示左表全部记录

查询关键字:left join
左 指的是 放在左边的表

mysql> select *from emp left join dept  
    -> on emp.dept_id = dept.id;
+------+--------+------+---------+------+--------+
| id   | name   | sex  | dept_id | id   | name   |
+------+--------+------+---------+------+--------+
|    1 | 大黄   | m    |       1 |    1 | 市场   |
|    2 | 老王   | m    |       2 |    2 | 财务   |
|    3 | 老李   | w    |      30 | NULL | NULL   |
+------+--------+------+---------+------+--------+

4. 外链接之右连接:优先显示右表全部记录

查询关键字:right join

mysql> select *from emp right join dept
    -> on emp.dept_id = dept.id;
+------+--------+------+---------+------+--------+
| id   | name   | sex  | dept_id | id   | name   |
+------+--------+------+---------+------+--------+
|    1 | 大黄   | m    |       1 |    1 | 市场   |
|    2 | 老王   | m    |       2 |    2 | 财务   |
| NULL | NULL   | NULL |    NULL |    3 | 行政   |
+------+--------+------+---------+------+--------+

5. 全外连接

左连接加上右连接
简单说就是 :
两个表的数据共用一个表头显示
语法就是在两个查询语句中间加上 union
注意 , 两个查询语句查出的结果的结构必须相同

mysql> select *from emp right join dept  on emp.dept_id = dept.id
    -> union
    -> select *from emp left join dept  on emp.dept_id = dept.id;
+------+--------+------+---------+------+--------+
| id   | name   | sex  | dept_id | id   | name   |
+------+--------+------+---------+------+--------+
|    1 | 大黄   | m    |       1 |    1 | 市场   |
|    2 | 老王   | m    |       2 |    2 | 财务   |
| NULL | NULL   | NULL |    NULL |    3 | 行政   |
|    3 | 老李   | w    |      30 | NULL | NULL   |
+------+--------+------+---------+------+--------+

默认去重 , 若不想去重的话在将union改为union all

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容