一、基础操作
1.cmd中启动 mysql -u root -p
show databases;
use school;
show tables;
https://blog.csdn.net/you23hai45/article/details/9394673
2.添加字段
alter table student add 姓名 varchar(255) not null;
alter table student add 出生日期 date not null;
alter table student add 性别 varchar(255) not null;
alter table student add primary key(学号);
create table student(姓名 varchar(255) not null,.... primary key(学号));
https://www.cnblogs.com/softidea/p/6135097.html
3.录入数据
insert into student(学号,姓名,出生日期,性别)
values('0001','猴子','1989-01-01','男');
%表示多个字符,_只能是一个字符
#、/* */表注释
group by 要注意分类中不能有同类的字段存在
where和having的区别在于,先运行where在运行having,having可带聚合函数,where不行
https://www.cnblogs.com/jiaoxiaohui/p/10727394.html
4.时间函数
current_date 2020-05-02
current_time 10:41:23
current_timestamp 2020-05-02 10:41:23
year month day
dayname 星期六
DATE_FORMAT(Now(),'%Y-%m-%d')
https://www.cnblogs.com/softidea/p/5770174.html
5.case when 用法
https://www.cnblogs.com/chenduzizhong/p/9590741.html
二、遗忘语句
计算每个学号成绩<60的个数(group by)筛选出>=2个的学号(having)
select b.姓名,avg(a.成绩),a.学号
from score as a inner join student as b on a.学号 =b.学号 where a.成绩 <60group by a.学号 having count(a.学号 ) >=2;
查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩
select distinct a.学号 ,a.成绩 ,a.课程号 from score as a inner join score as b
on a.学号 =b.学号 where a.成绩 =b.成绩 and a.课程号 != b.课程号 ;
查询课程编号为“0001”的课程比“0002”的课程成绩高的所有学生的学号
select a.学号 from (select 学号 ,成绩 from score where 课程号=01) as a
inner join (select 学号 ,成绩 from score where 课程号=02) as b
on a.学号 =b.学号 inner join student c on c.学号 =a.学号 where a.成绩 >b.成绩 ;
查询没学过"孟扎扎"老师讲授的任一门课程的学生姓名
select 姓名 ,学号 from student where 学号 not in (select a.学号
from student as a inner join score as b on a.学号 =b.学号
inner join course as c on b.课程号 =c.课程号 inner join teacher as d on c.教师号 =d.教师号 where d.教师姓名 ='孟扎扎');
select 学号, 姓名 from student where 学号 not in
(select 学号 from score where 课程号=(select 课程号 from course where 教师号 = (select 教师号 from teacher where 教师姓名 ='孟扎扎')));
查询至少有一门课与学号为“0001”的学生所学课程相同的学生的学号和姓名
select 学号 ,姓名 from student
where 学号 in #换表
(select distinct(学号) from score where 课程号 in #将有学过01学号课程的学号取出
(select 课程号 from score where 学号=0001)) #先查询0001学号的课程
and 学号 !=0001; #去除01学号本身
按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩
select a.学号,avg(a.成绩 ),
max(case when b.课程名称 = '数学' then a.成绩 else null end ) as '数学',
max(case when b.课程名称 = '语文' then a.成绩 else null end ) as '语文',
max(case when b.课程名称 = '英语' then a.成绩 else null end ) as '英语'
from score as a inner join course as b on a.课程号 =b.课程号 group by a.学号 ;
排名row_number () over()
https://www.cnblogs.com/buwuliao/p/12894289.html
查询学生平均成绩及其名次
select 学号 ,avg(成绩),row_number () over( order by avg(成绩) desc) from score group by 学号 ;
分组排名partition by
按各科成绩进行排序,并显示排名
select 课程号 ,row_number () over(partition by 课程号 order by 成绩 ) from score ;
查询每门功成绩最好的前两名学生姓名
select a.课程号 ,b.姓名 ,a.成绩,a.ranking from (
select 课程号 ,学号 ,成绩 ,
row_number () over(partition by 课程号 order by 成绩 desc) as ranking
from score) as a inner join student b on a.学号 =b.学号 where a.ranking <3 ;
第2名到第3名
where a.ranking in( 2,3)
https://zhuanlan.zhihu.com/p/38354000
https://mp.weixin.qq.com/s/MuxjlFV0gi1GydOrYfiSeQ
https://mp.weixin.qq.com/s/6Kll4Q6Xp37i2PiLUh4cMA