一、基础操作

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

 

posted on 2021-04-16 12:31  喻解  阅读(65)  评论(0编辑  收藏  举报