定义:通过指定的连接条件同时获取多张表的数据。
1、内连接
1)隐式内连接:将连接条件直接拼接到where关键字后面
语法:select 查询的内容 from 表1,表2,表3 where 连接条件 [and 筛选条件];
2)显示内连接:通过inner join on 去查询,将连接条件写在on后面
语法:select 查询内容 from 表1[inner] join 表2 on 连接条件 [where 筛选条件];
2、外连接
以一张表为基表,查询出基表中的所有数据及连接表中能够与基表匹配的数据,如果匹配不上就用null来填充。
1)左外连接(以left左边的表为基表,右边的表为连接表)
语法:select 查询内容 from 表1 left 表2 on 连接条件 [where 筛选条件];
2)右外连接(以right右边的表为基表,左边的表为连接表)
语法:select 查询内容 from 表1 right join 表2 on 连接条件 [where 筛选条件];
先对数据进行分组,再对这些分组后的信息进行汇总。分组查询时经常会用到聚合函数,达到对分组后数据的统计效果。
关键字:group by [having]
语法:select 查询内容 from 表名 group by 分组列 [having 筛选条件];
where和having在分组SQL中的区别:
1、having对分组后的数据进行筛选,有having那么一定会有group by,有group by不一定有having。where是在分组前进行筛选。
2、having后面可以写聚合函数,where后面不行
3、如果在一个SQL语句中两者同时出现,where先执行,having后执行
子查询(嵌套查询)
当一个查询得到的结果是另一个查询的条件时,就会用到子查询。
案例:
1、查询出比金坤同学大的学生的信息
步骤:先查询金坤同学的年龄,再根据查到的年龄进行条件查询
select sage from student where sname=’金坤’;
select * from student where sage>上一句查到的结果;
即select * from student where sage>(select sage from student where sname=’金坤’);
2、查询年龄最大的学生的信息
步骤:先查询出最大的年龄,再根据查出的最大年龄查询学生信息
select max(sage) from student;
select * from student where sage=上一句查出的结果;
即select * from student where sage=(select max(sage) from student);
子查询的另外一种写法,将前一个查询的结果当成一张表来处理:
select s.* from student s, (select max(sage) from student) max where s.sage=max.age;