本周学习了:
MySQL数据库的基本查询语句
t_student表
t_score表
t_dept表
查询语句:
select 字段1,字段2,…from 表名 where 条件
distinct过滤重复项,limit限定查询结果,limit m,n 查询从第m下标行开始,往后显示n行
例如找出全班所有学生的学号及姓名,取第7行到第14行
SELECT * from t_student LIMIT 6,8;
处理空值 ifnull(字段,值)mysql独有的
例如将每个系人数增加10人(对于空记录 需要判断,不能直接计算)
SELECT did,dname,ifnull(dnumber,0)+10 from t_dept;
as取别名(可以省略)别名中如果有特殊符号,需要’ ’
select did as '编号+',dname 系名称,dnumber 人数 from t_dept;
concat拼接符,用","来分隔
select concat('我的名字叫',sname,',我今年',sage,'岁',',我的学号是',sid,',我的系编号是',did,',我的英文名是',sename) from t_student;
order by排序 asc升序,desc降序,默认升序。
查询全班最高分数学生的信息
select * from t_score order by 语文+英语+数学+体育 desc limit 1;
where 多条件筛选 and or not 等
查询1班的男生 和 二班的女生信息 (and优先级大于or)
select * from t_student where sclass=1 and ssex='男' or sclass=2 and ssex='女';
查询300分以下600分以上的女生
select * from t_student where (sscore<300 or sscore>600) and ssex='女';
group by 分组语句,通常和聚合函数一起使用。
聚合函数, 可以统计并汇总 多行记录
sum 求和 (必须是数值型),count 求总记录数,avg 求平均值 (必须是数值型),max 求最大值(可以是字符型),min 求最小值。
聚合函数和 单列同时查询(理论上不行) 但是不会报错,默认显示第一行
select avg(sage),max(sage),min(sage),sname from t_student;
having 筛选的字段 必须来自 select 显示的字段,也可以使用别名
查询 分数在300以上的学生的平均成绩大于500的前两个班级信息,并升序排列
select sclass,avg(sscore) 平均分 from t_student where Sscore>300
group by Sclass having 平均分>500
order by 平均分 limit 2;
group by 语句和distinct一样可以过滤重复项,但是group by 效率高,distinct 效率低。
group by 可以使用聚集函数,distinct不可以。
在学生信息表中找出所有的年龄-班级-系编号–并且不允许重复
select distinct sclass,did,sage from t_student;
也可以用:
select sclass,did,sage,sum(sscore) from t_student group by sclass,did,sage
子查询:将一个select语句嵌套在 select,update,insert,delete中.
格式:select * from 表名 where (select语句)或者 select * from (select 语句)
查询成绩最高的学生信息
select * from t_student where Sscore =
(select max(Sscore) from t_student)
查询与3班年龄相同的学生的信息
select * from t_student where sage in
(select distinct sage from t_student where Sclass=3)
and sclass!=3;
这里使用了"in"而不是"=",因为3班学生的年龄不止一个,而"="只能用于子查询语句只有一个结果的情况。
all 关键字,表示所有 >all 大于所有结果集 <all 小于所有结果集,
any 关键字,表示任意一个 >any 大于任意一个结果集, <any 小于任意一个结果集
在表中查询比3班任何学生都大的学生信息
select * from t_student where sage > all
(select sage from t_student where sclass=3);
在表中查询比3班任意一个学生大的学生信息
select * from t_student where sage > any
(select sage from t_student where sclass=3);
exists 是否存在 与 in 的查询结果一样,但是比in效率高
查询与3班年龄相同的学生的信息
select * from t_student t1
where exists (select distinct * from t_student where Sclass=3 and sage = t1.sage)
and sclass!=3;
关联查询,语法:select * from 表1 inner join 表2 on 表1.字段=表2.字段,
或者:select * from 表1,表2 where 表1.字段=表2.字段
查询每个学生的姓名和他系的名称
select t1.Sname,t2.Dname from t_student t1 inner join t_dept t2 on t1.did=t2.Did
sql 优化
1、select 语句后面 使用字段,不要使用*
2、在使用关联查询时,必须加条件
3、尽量使用分组 而不使用 distinct
4、尽量使用 exists 和 not exists , 而不使用in 和 not in