1. 连接查询
连接查询的意义: 在用户查看数据的时候,需要显示的数据来自多张表
1.1 内连接
内连接查询是最常见的连接查询,内连接查询可以查询两张或两张以上的表
从左表中取出每一条记录,去右表中与所有的记录进行匹配: 匹配必须是某个条件在左表中与右表中相同最终才会保留结果,否则不保留. 则给予一个逻辑取出他们共有的数
基本语法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;
on后面连接的是所需要的条件。可以没有,如果没有则相当于全部取出
1.2 外连接
1.2.1 左外连接
left join: 左外连接(左连接), 以左表为主表
基本语法: from 左表 left join 右表 on 左表.字段 = 右表.字段;
左表全部匹配,右表符合逻辑数据则往结果上填充,如果右表的数据在左表没匹配的会用null代替
1.2.2 右外连接
right join: 左外连接(左连接), 以左表为主表
基本语法: from 左表 right join 右表 on 左表.字段 = 右表.字段;
右表全部匹配,左表表符合逻辑数据则往结果上填充,如果左表的数据在右表没匹配的会用null代替
2. 联合查询
联合查询结果是将多个select语句的查询结果合并到一块因为在某种情况下需要将几个select语句查询的结果合并起来显示。比如现在需要查询两个公司的所有员工的信息,这就需要从甲公司查询所有员工信息,再从乙公司查询所有的员工信息,然后将两次的查询结果进行合并。
select 语句1
union[union 选项]
select 语句2
union|[union 选项]
select 语句n
union有两个选项:
all : 不去掉重复的
distinct: 去掉重复的
- 查询语句的字段只要求个数一样,跟顺序和类型无关
- 在联合查询中: order by不能直接使用,需要对查询语句使用括号才行,虽然能运行,但是结果不是我要得到的;
- order by不能直接出现在union的子句中,但是可以出现在子句中。
/* 如果是上边这样只出现一次他的意义就是等合并完成之后再进行排序就没有任何意义了, 因为又把前边sex分好的类打乱了 */ select *from student where sex="woman" order by score union select *from student where sex="man" order by score;
//order by不能直接出现在union的子句中,但是可以出现在子句中。
select *from
(select *from student
where sex="woman"
order by score)student
union
select *from
(select *from student
where sex="man"
order by score)student ;
3. 子查询
查询里面镶嵌查询,虽然逻辑清晰,但是耗时间