多表查询

目录

  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

你可能感兴趣的:(多表查询)