知识归纳:
1.分组
分组就是结合聚合函数来对数据进行分组统计. 关键字:group by
根据分组的列把数据进行分组,然后再分别进行统计。
/*统计男女学员各有多少*/
selectsex,count(*) from student group by sex
/*统计每个年级各有多少学员*/
SELECTgid,count(*) from student group by gid;
/*统计每门科目的考试平均分*/
selectsubjectno,avg(studentresult) from result group by subjectno;
Having:在分组之后的结果中再一次进行数据的筛选。此关键字必须要结合分组来使用。
/*查询哪些学员在科目一参加了补考*/
selectstudentno, count(*) from result where subjectno = 1
group bystudentno having count(*)>1
2.模糊查询:
模糊查询就是指查询条件不确定的情况。
/*模糊查询
%: 0-N任意字符
_: 一个任意字符
[]:区间指定内的一个字符
*/
/*查询姓张的学员 like */
select * from student where name like '张_'
/*查询考试成绩在 70 - 90 之间的数据 between */
select * from result where studentResult>=70 andstudentResult<=90;
select * from result where studentResult between 70 and 90;
/*查询没有邮箱的学员信息 isnull 查询列值为 null 的数据*/
select * from student where email is null;
/*查询广州和深圳的学员信息 in */
select* from student where address in ('广州','深圳')3.连接查询
连接查询:内连接,外连接(左连接,右连接),交叉连接
/*两种方式都是内连接:特点,两个表的前后顺序调换结果没有影响
建议用inner join ... on ...方式,性能好一些
外连接:左外连接
左外连接:左边的表是主表,右边的表是子表,主表的数据全部显示,子表的数据来填充,如果子表中没有相关的数据填充,则显示NULL。
4.子查询
注意:表连接能实现的功能,子查询都能实现,但子查询实现的功能,表连接不一定能实现。
当查询结果只是作为查询条件时,选择用子查询,
当查询结果数据来自于多张表,选择用表连接。
子查询使用=、>=、< 、<= 、!= 要保证子查询的返回结果只有一个值,
如果有多个值返回,则用只能用 in
5字符串函数
6.日期函数
练习:
/*1.查询20岁以下的学员信息*/
select *from student where year<20;
/*2.查询Java课程的考试成绩*/
select *from exam where SubjectName='Java';
/*3.查询女学员信息,包括(学号、姓名、年龄、性别)*/
select StudentNO,name,year,sex from studentwhere sex='女';
/*4.查询课时超过60的科目信息*/
select*from subject where ClassHour>60;
/*5.查询班级中姓张的单名的学员信息*/
select* from student where name like'张_';
/*6.查询考试成绩在70-80之间的数据*/
select*from exam where StudentResultBETWEEN 70 and 80;
/*7.查询广州、北京的学员信息*/
select*from student where address in('广州','北京');
/*8.查询没有邮箱地址的学员信息*/
select*from student where email is null;
/*9.查询Java考试后前3名的考试成绩*/
select subjectno ,StudentResult from exam
where subjectno='java' order byStudentResult desc limit 0,3 ;
/*10. 分页查询第3页的 学员信息 每页3条*/
select*from student limit 6,3;
/*11.查询本月生日的学员信息*/
select *from student where month(birthday)=month(now());
/*12.查询本周的开卡信息*/
select *from card where date between
date_add(curdate(),interval-(dayofweek(now())-1) day)
and date_add(curdate(),interval (7-dayofweek(now())) day)
order by date;
/*13.统计班级学员的平均年龄*/
select avg(year)'平均年龄'fromstudent;
/*14.统计所有科目的总课时数*/
select sum(ClassHour)'总课时' fromsubject;