目录
- 笛卡尔积查询 没卵用 略
- 内连接查询====>只连接匹配的行
- 外链接之左连接:优先显示左表全部记录
- 外链接之右连接:优先显示右表全部记录
- 全外连接
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