表的进阶查询

聚合查询

聚合函数

注意点:
①后面可以加where限定条件
②可以使用as别名

count(列名)

统计该列有几行数据, 其中null会被忽略

sum(列名)

求该列所有数据的总和

avg(列名)

求该列所有数据的平均值

max(列名)

求该列的最大值数据

min(列名)

求该列的最小值数据

group by

语法

select 要分组的字段,聚合函数(列名),... from 表名 (where 限定条件) group by 按什么字段分组
注意:
通常要搭配聚合函数使用
举例:
假如一个表里有三个角色(员工,CEO,BOSS), 每个角色的工资不是一个水平, 我们想查每个角色的平均工资就可以,查询"角色","avg(工资)",分组依据"角色". group by将查出来的数据分组, 然后聚合函数再对各组进行操作.

having

where是来筛序需要被分组的数据, 当数组分组完毕还需要筛选的话, 那就要使用having

举例:
select 角色,avg(工资) from 工资表 角色!=员工 group by 角色 having avg(工资)<20000;
这句话就是查询各个角色(除了普通员工)的平均工资, 然后把平均工资小于20000的去掉

联合查询

问题引入

实际开发中数据往往来自不同的表, 所以需要多表联合查询, 多表查询就是取两个表的笛卡尔积

假如有两个表

student(id, name, class_id)有数据:
1	张三	1
2	李四	2

classes(id,name)有数据:
1	火箭班
2	奥赛班

联合查询select * from student,classes;

结果是笛卡尔积
id,name,class_id,id,name
1		张三	1				1 火箭班	有效数据
1		张三	1				2 奥赛班	无效数据
2		李四	2				1	火箭班	无效数据
2		李四	2				2	奥赛班	有效数据

此时加上限定条件where student.class_id=classes.id就能选择出有效数据

id,name,class_id,id,name
1		张三	1				1 火箭班	有效数据
2		李四	2				2	奥赛班	有效数据

内连接

语法

select 字段 from1 (别名1) (inner) Join2 (别名2) on 连接条件 (and 其他条件)
-- Join on 这种方式是在连接时指定条件,从而使连接更明确。


select 字段 from1 (别名1) ,2 (别名2) where 连接条件 (and 其他条件)
-- where 这种情况下,连接条件会在连接后的结果集上进行过滤。

示例

select stu.id,stu.name,stu.sn,stu.email,sum(sco.score) as '总分'	--精简查询结果
from student stu,score sco					-- 做笛卡尔积
where student.id=score.student_id		-- 确认连接关系
group by student.id									--分组依据

外连接

外连接分为左外连接和右外连接
联合查询, 如果左侧的表完全显示就是左外连接, 右侧的表完全显示就是右外连接

语法

左外连接和右外连接不会影响查询结果中列的展示顺序,它们只会影响连接后是否展示特定的行。

①左外连接: 表1完全显示, 如果右表没匹配到数据则会填充null
select 字段名 from 表1 left Join 表2 on 连接条件
②右外连接: 表2完全显示
select 字段名 from 表1 right Join 表2 on 连接条件

自连接

就是在同一张表连接自身进行查询

举例

-- 查询语文成绩比数学成绩高的人(首先知道语文和数学的id)
select s1.*
from score s1
join score s2
on s1.student_id = s2.student_id
	and s1.score < s2.score
	and s1.course_id = 1
  and s2.course_id = 3;

子查询

是指嵌入在其他sql语句中的select语句, 也叫嵌套查询

单行子查询

返回一行记录的子查询

示例: 查询小明的同班同学

-- 查询小明的同班同学
select *
from student
where classes_id = (select classes_id
                    from student
                    where name='小明');
-- 先查小明的班级id,再把结果传给外面的sql查询改班级学生

多行子查询

返回多行记录的子查询
只要字段属性匹配,用union可以查询不同的表

示例: 查询"语文"或"英语"课程的成绩信息

-- 使用in
select *
from score
where course_id in (select id
                    from course
                    where name='语文' or name='英语');

合并查询

实际中为了合并多个select的查询结果, 可以使用集合操作符union, union all

union

该操作符用于取得两个结果集的并集, 会自动去掉重复行

示例: 查询id小于3,或者名字为’英语’的课程

select * from course  where id<3 
union
select * from course where name='英语';

-- 可以用or来实现
select * from course where id<3 or name='英语';

union all

和union完全一样, 唯一区别就是不会去掉重复行

你可能感兴趣的:(MySQL,数据库,java,sql)