多表查询
- 如果两张表没有任何引用的关系,那么使用select * from 表格1,表格2;结果会成为,将表格2追加到表格1的后面
合并结果集
- 可以将结果类型相同的列合并,如果要进行整张表的合并,那么必须这两个表列数必须是相同的,
- union 去除重复的行
- union all 不去除重复的行
select * from aa
union [all]
select * from bb;
连接查询之内连接
- 方言:格式
- select * from 主表名1,外表名2;这样子查询 ,外键表的每一行都会匹配主键的表的所有行一次,产生了大量的垃圾数据
- 同时设置where条件,让互相引用的主外键相同,可以去除笛卡尔积,格式:select * from 表格名1,表格名2 where 表格名1.xxx=表格2.xxx;
- ==注意==为了解决如果要查询的表名过长,不容易书写的问题,也可以对表格设置别名,格式:select * from aa a,bb b where a.id=b.id;
- 标准(推荐使用)
- 格式:select 要查询的列… from 表格1 别名 inner join 表格2 别名 on 条件;
- 例如:select * from aa a inner join bb b on a.id=b.id;
- 自然:
- 格式: select 要查询的列… from 表格1 别名 natural join 表格2 别名
- 这种方式不需要添加on条件,会自动将表名中相同的列的记录进行匹配。
连接查询之外连接
- 外连接查询,必须写查询条件,这样才可以知道,要合并的是哪一个列
- 左外连接
- 除了内连接的结果外,右表内容找不到和左表对应的信息,使用null填充。
- 格式:select 查询的列 from 表格名1 [别名] left join 表格名2 [别名] on 条件
- 右外连接
- 除了内连接结果外,左表找不到和右表对饮的信息时候进行使用null填充。
- 格式:select 要查询的列 from 表格名1 [别名] right join 表格名2 [别名] on 条件
- 全外连接
- 除了内连接的结果外,还有左表和右表不符合条件的记录使用null填充
- mysql是不支持全外连接的,
- 但是可以通过合并左外连接,和右外连接的结果集可以得到
- 例如:
select a.id,b.id from aa a right outer join bb b on a.id=b.id
union
select a.id,b.id from aa a left outer join bb b on a.id=b.id;
子查询
- 所谓的子查询就是,一条查询语句包含了另一条查询语句
子查询可以出现额位置
where 后作为条件存在
- 下面的例子子查询的含义:从表bb中查询出id=1的列
- 外部查询的意思是:查询aa表中所有列条件是id值比子查询出来的结果要大
select * from aa where id>(select id from bb where id=1);
from 后作为表存在
- 使用这种方式查询必须,给表名添加别名,否则报错
- 这种方式就是,把一个查询结果当作一个表格,进行二次查询
- ==使用这样的方式,必须个表格一个别名,否则,系统找不到要查询的表==
- 格式:select 要查询的列 from (select 子查询的列 from 表格名 where 子查询条件) [as] ==表格别名== where 外层查询条件;
- 例如:select * from (select * from bb where id<4) b where b.id>1;