学习笔记

本周学习了:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值