如:
-- 查询员工表中所有薪水超过1000元的名字和薪水
select first_name, salary from s_emp
where salary > 1000;
-- 查询员工表中所有薪水超过1000元的名字和薪水,并按照薪水进行升序排序
select first_name, salary from s_emp
where salary > 1000
order by salary asc;
-- asc关键字表示升序排序,可以省略,默认就是升序排列
select first_name, salary from s_emp
where salary > 1000
order by salary;
-- desc关键字可以实现降序排列
select first_name, salary from s_emp
where salary > 1000
order by salary desc;
-- 查询员工表中所有部门的所有员工的薪水,要求按照部门进行升序,按照薪水升序
select first_name, dept_id, salary from s_emp
order by dept_id asc, salary asc;
-- 查询员工表中所有部门的所有员工的薪水,要求按照部门进行升序,按照薪水降序
select first_name, dept_id, salary from s_emp
order by dept_id asc, salary desc;
-- 查询员工表中所有部门的所有员工的薪水,要求按照部门进行降序,按照薪水降序
select first_name, dept_id, salary from s_emp
order by dept_id desc, salary desc;
-- 查询员工表中所有部门的所有员工的薪水,要求按照部门进行降序,按照薪水升序
select first_name, dept_id, salary from s_emp
order by dept_id desc, salary asc;
-- 实现三个字段的排序,按照部门编号降序,薪水降序,名字降序
select dept_id, salary, first_name from s_emp
order by dept_id desc, salary desc, first_name desc;
如:
-- 查询学生表中每个年级的学生人数,每...就表示按照...分组
select gradeid, count(*) from student
group by gradeid;
-- 查询学生表中每种性别的学生人数
select sex, count(*) from student
group by sex;
-- 查询学生表中每种性别的学生人数并按照人数进行降序排列
select sex, count(*) from student
group by sex
order by count(*) desc;
-- 注意:下面的代码虽然没有报错,但与实际情况不符,多个学生应该有多个学号
select studentno, sex, count(*) from student
group by sex
order by count(*) desc;
案例讲解:
-- 查询成绩表中每门课程的平均分
select subjectid, avg(studentresult) from result
group by subjectid;
-- 查询成绩表中每门课程的平均分,并按照平均分进行降序排列
select subjectid 课程编号, avg(studentresult) 平均分 from result
group by subjectid
order by 平均分 desc;
-- 查询每个年级中每种性别的学生人数
select gradeid 年级编号, sex 性别, count(*) 学生人数 from student
group by gradeid, sex;
-- 先按照年级升序,在按照人数降序
select gradeid 年级编号, sex 性别, count(*) 学生人数 from student
group by gradeid, sex
order by gradeid asc, count(*) desc;
如:
-- 查询总人数超过18人的所有年级
-- 也就是先计算每个年级的总人数,再按照18进行过滤
-- 下面的写法直接报错:where子句不许使用分组函数,因为此时还没有分组
select gradeid, count(*) from student
where count(*)> 18
group by gradeid;
-- 正确的写法
select gradeid, count(*) from student
group by gradeid
having count(*)> 18;
执行流程:
from子句 => where子句 => group by子句 => having子句 => select子句
=> order by子句
练习:
-- 查询每个年级的总课时,并升序排列 (subject表)
select gradeid, sum(classhour) from subject
group by gradeid
order by sum(classhour) asc;
-- 查询每个学员的平均分(result表)
select studentno, avg(studentresult) from result
group by studentno;
-- 查询每门课程的平均分,并降序排列(result表)
select subjectid, avg(studentresult) from result
group by subjectid
order by avg(studentresult) desc;
-- 查询每个学生的总分,并降序排列(result表)
select studentno, sum(studentresult) from result
group by studentno
order by sum(studentresult) desc;
如:
-- 查询学生表中比'崔今生'小的学生姓名和出生日期
-- 第一步:先查询'崔今生'的生日信息 '1990-01-05'select borndate from student
where studentname ='崔今生';
-- 第二步:根据'崔今生'的生日信息来查询比该生日信息大的学生信息 23个
select studentname, borndate from student
where borndate >'1990-01-05';
-- 实现真正的子查询
select studentname, borndate from student
where borndate >(select borndate from student
where studentname ='崔今生');
练习:
-- 查询学生表中与'崔今生'在同一个年级的学生姓名和年级编号
-- 第一步:查询学生表中'崔今生'所在的年级编号 1
select gradeid from student
where studentname ='崔今生';
-- 第二步:根据查询到的年级编号再查同一个年级的学生姓名和年级编号
select studentname, gradeid from student
where gradeid = 1;
-- 合并起来
select studentname, gradeid from student
where gradeid =(select gradeid from student
where studentname ='崔今生');
案例讲解:
-- 查询'JavaSE'课程中考了100分的学生名字
-- 第一步:根据课程名称'JavaSE'来查询对应的课程编号 1
select subjectid from subject
where subjectname ='JavaSE';
-- 第二步:根据课程编号和100分的成绩来查询对应的学生学号 S1101019
select studentno from result
where subjectid = 1 and studentresult = 100;
-- 第三步:根据学生的学号来查询对应的学生名字
select studentname from student
where studentno ='S1101019';
-- 合并上述结果
select studentname from student
where studentno =(select studentno from result
where subjectid =(select subjectid from subject
where subjectname ='JavaSE') and studentresult = 100);