SQL刷题
1:向学生表里添加数据
---自写答案
insert into studet(学号,姓名,出生日期,性别), ---错误1:后面不应该有,
values('001','张山','1995-09-10','男'), ---错误2:后面不该是,而是;
values('002','王二','1995-01-23','男'), ---错误3:每一次插入数据都要单独写insert语句
values('003','李四','1994-02-12','女'),
---正确答案
insert into student(学号,姓名,出生日期,性别)
values('1','shaw','2012-01-21','男');
insert into student(学号,姓名,出生日期,性别)
values('2','jason','2012-09-12','男');
2:简单的查询
---表结构
student:id,name,brith,sexy
score : id,course,socres
course : c_id,c_name,t_id
teacher: t_id,t_name
---查找姓"肖"的学生名单
---查找姓名中最后一个字是"帅"的学生名单
---查找姓名中带"帅"的学生名单
---自写答案
select * from student where name like '^肖' ---like语句用%字符来表示任意字符
select * from student where name like '帅%'
select * from student where name like '*帅*'
---笔记
---1: like是模糊匹配,mysql里的正则匹配是regexp操作符
---2: sql提供四种匹配方式
--- <1>%:表示任意0个或多个字符,可匹配任意类型和长度的字符
--- <2>_:表示任意单个字符,指定一个字符,字符串或范围,要求所匹配对象为它们中的任一个
--- <3>[]:表示括号内所列字符中的一个
--- <4>[^]:表示不在括号所列之内的单个字符,其取值和[]相同。
---正确答案
select * from student where name like '肖%'
select * from student where name like '%帅'
select * from student where name like '%帅%'
select * from student where name regexp '^肖' ---正则写法
select * from student where name regexp '帅$'
select * from student where name regexp '帅'
引申内容:正则
^ | 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。 |
---|---|
$ | 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。 |
. | 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像 '[.\n]' 的模式。 |
[...] | 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 |
[^...] | 负值字符集合。匹配未包含的任意字符。例如, [^ abc ]可以匹配 "plain" 中的'p'。 |
p1|p2|p3 | 匹配 p1 或 p2 或 p3。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
3:汇总分析
---表结构
student:id,name,brith,sexy
score : id,course,socres
course : c_id,c_name,t_id
teacher: t_id,t_name
---查询课程编号为'0002'的总成绩
---查询选了课程的学生人数
select sum(scores) from score
where course = '0002'
select count(*) from score group by id ---错误
select count(distinct id) from score
3:分组
---查询各科成绩最高和最低分
---查询每门课程被选修的学生数
---查询男生,女生人数
select course,max(score),min(score) from score group by course ---未取别名
select course,count(*) from score group by course ---未取别名
select sexy,count(*) from student group by sexy ---未取别名
4:分组结果的条件
---查询平均成绩大于60分学生的学号和平均成绩
select id,avg(score) avg_score
from score
group by id
having avg(score) >60
---查询至少选修两门课程的学生学号
select id,count(*) from score
group by id
having count(*) >=2
---查询同名同性学生名单并统计同名人数
select name,sexy,count(*)
from student
group by name,sexy
having count(*) >=2
---问题
---count(*)与count(字段)的区别?
---count(*)会返回全表的所有记录数,但是count(字段)只会返回字段不为NULL的记录数
---查询不及格的课程并按课程号从大到小排列
select course from score
where scores < 60
order by course desc
---查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
select course,avg(scores)
from score
group by course
order by avg(scores),course desc ---正序 asc,倒序 desc
---检索课程编号为 "0004"且分数小于60的学生学号,结果按分数降序排列
select id from
score
where course = '0004' and scores < 60
order by scores desc
---统计每门课程的学生选修人数(超过2人的课程才统计)
select course,count(id) as 'people'
from score
group by course
having count(id) >2
order by count(id) desc,course asc
---查询两门以上不及格课程的同学的学号及其平均成绩
select id,avg(scores),count(course)
from score
where scores < 60
group by id
having count(course) >2 ---可以直接使用count()来筛选过滤
5:汇总分析-查询结构排序,分组的指定条件
---查询学生的总成绩并进行排名
select id,sum(scores)
from score
group by id
order by sum(scores)
select a.id,a.score_total,row_number()over(order by a.score_total desc)rank
from
(select id,sum(scores)score_total
from
score
group by
id
)a
---查询