2023-03-29 练习题(一)

根据上图创建 数据库 & 表结构 并 录入数据(可以自行创造数据)

create database userdb default charset utf8 collate utf8_general_ci;
create table class(
    cid int not null auto_increment primary key,
    caption varchar(16) not null
)default charset=utf8;

create table student(
    sid int not null auto_increment primary key,
    sname varchar(16) not null,
    gender char(1) check(gender='男' or gender='女'),
    class_id int,
    constraint fk_student_class foreign key (class_id) references class(cid)
)default charset=utf8;

create table teacher(
    tid int not null auto_increment primary key,
    tname varchar(16) not null
)default charset=utf8;

create table course(
    cid int not null auto_increment primary key,
    cname varchar(16) not null,
    teacher_id int,
    constraint fk_course_teacher foreign key (teacher_id) references teacher(tid)
)default charset=utf8;

create table score(
    sid int not null auto_increment primary key,
    student_id int,
    course_id int,
    num int,
     constraint fk_score_student foreign key score(student_id) references student(sid),
    constraint fk_score_course foreign key score(course_id) references course(cid)
)default charset=utf8;
insert into class(caption) values("三年二班"),("一年三班"),("三年一班");

insert into student(sname,gender,class_id) values("钢蛋","女",1),("铁锤","女",1),("山炮","男",2);

insert into teacher(tname) values("波多"),("苍空"),("饭岛");

insert into course(cname,teacher_id) values("生物",1),("体育",1),("物理",2);

insert into score(student_id,course_id,num) values(1,1,60),(1,2,59),(2,2,100);

1.创建用户 luffy 并赋予此数据库的所有权限

create user 'luffy'@'%' identified by 'root123';

grant all privileges on userdb.* TO 'luffy'@'%'; 
flush privileges;
终端登录
mysql -u luffy -p

# 进入数据库
use userdb;

2.查询姓“李”的老师的个数。

select count(tid) from teacher where tname like "李%"; 

3.查询姓“张”的学生名单。

select sname from student where sname like "张%"; 

4.查询男生、女生的人数。

select gender AS 性别, COUNT(*) as 总人数 from student GROUP BY gender;

5.查询同名同姓学生名单,并统计同名人数。

select sname,COUNT(*) as 人数 from student GROUP BY sname having count(*)>1;

6.查询 “三年二班” 的所有学生。

select sname 
from student 
left outer join class 
on  student.class_id = class.cid 
where class.caption=“三年二班”;

7.查询 每个 班级的 班级名称、班级人数。

select class.caption,count(student.sid) as 人数 from class,student where student.class_id = class.cid GROUP BY student.class_id ;
Select 
        c.caption,count(s.sid) as 人数 
from  class c 
        LEFT JOIN student s 
        on c.cid = s.class_id 
group by c.caption;

8.查询成绩小于60分的同学的学号、姓名、成绩、课程名称。

select 
    student.sid,
    student.sname,
    score.num,
    course.cname 
from 
    score 
    left join student on score.student_id=student.sid 
    left join course on score.course_id =course.cid 
where num <60;
SELECT b.sid as 学号, b.sname as 姓名,f.cname as 课程名称,f.num as 成绩  FROM (
   SELECT s.num ,c.cname ,s.student_id
   FROM score s LEFT JOIN course c  ON c.cid = s.course_id where s.num<60 )
   f,student b WHERE b.sid = f.student_id ;

9.查询选修了 “生物课” 的所有学生ID、学生姓名、成绩。

SELECT b.sid as 学生ID, b.sname as 姓名,f.cname as 课程名称,f.num as 成绩  FROM (
   SELECT s.num ,c.cname ,s.student_id
   FROM score s LEFT JOIN course c  ON c.cid = s.course_id where c.cname="生物" )
   f,student b WHERE b.sid = f.student_id ;
select 
    student.sid,
    student.sname,
    score.num 
from 
    score 
    left join course on score.course_id =course.cid 
    left join student on score.student_id=student.sid 
where course.cname="生物";

10.查询选修了 “生物课” 且分数低于60的的所有学生ID、学生姓名、成绩。

SELECT b.sid as 学生ID, b.sname as 姓名,f.cname as 课程名称,f.num as 成绩  
FROM (
    SELECT s.num ,c.cname ,s.student_id
    FROM score s LEFT JOIN course c  
    ON c.cid = s.course_id 
    where c.cname="生物" and s.num<60
)f,student b 
WHERE 
    b.sid = f.student_id ;
select 
    student.sid,student.sname,score.num 
from 
    score 
    left join course on score.course_id =course.cid 
    left join student on score.student_id=student.sid 
where course.cname="生物" and score.num < 60;

11.查询所有同学的学号、姓名、选课数、总成绩。

SELECT
    stu.sid AS '学号',
    stu.sname AS '姓名',
    count( sc.course_id ) AS '选课数',
    sum( sc.num ) AS '总成绩'
FROM
    student AS stu
INNER JOIN score AS sc 
ON ( sc.student_id = stu.sid ) 
GROUP BY stu.sid

12.查询各科被选修的学生数。

SELECT c.cname ,count(c.cname) as 上课人数 
FROM course c
LEFT JOIN score s
ON c.cid = s.course_id
group by c.cname;
select student_id,student.sname,count(1),sum(num) from score left join student on score.student_id=student.sid group by student_id;

13.查询各科成绩的总分、最高分、最低分,显示:课程ID、课程名称、总分、最高分、最低分。

SELECT 
    c.cid as 课程ID,
    c.cname as 课程名称,
    sum(s.num) as 总分,
    max(s.num) as 最高分,
    min(s.num) as 最低分
FROM score s
LEFT JOIN course c
ON c.cid = s.course_id
group by s.course_id;

14.查询各科成绩的平均分,显示:课程ID、课程名称、平均分。


SELECT 
    c.cid as 课程ID,
    c.cname as 课程名称,
    avg(s.num) as 平均分

FROM score s
LEFT JOIN course c
ON c.cid = s.course_id
group by s.course_id;

15.查询各科成绩的平均分,显示:课程ID、课程名称、平均分(按平均分从大到小排序)。

SELECT 
    c.cid as 课程ID,
    c.cname as 课程名称,
    avg(s.num) as 平均分

FROM score s
LEFT JOIN course c
ON c.cid = s.course_id
group by s.course_id
order by avg(s.num) desc;
也可以取别名
select course_id,course.cname,avg(num) as A from score left join course on score.course_id =course.cid group by course_id order by A desc;

16.查询各科成绩的平均分和及格率,显示:课程ID、课程名称、平均分、及格率。

select 
    course_id,
    course.cname,
    avg(num),
    sum(case when score.num >= 60 then 1 else 0 end)/count(1) *100 as percent 
from 
    score 
    left join course on score.course_id =course.cid 
group by 
    course_id;
SELECT 
    c.cid as 课程ID,
    c.cname as 课程名称,
    avg(s.num) as 平均分,
    round(100 * SUM( CASE WHEN ifnull( s.num, 0 ) >= 60 THEN 1 ELSE 0 END ) / COUNT( * ),2) as 及格率
FROM score s
LEFT JOIN course c
ON c.cid = s.course_id
group by s.course_id;

17.查询平均成绩大于60的所有学生的学号、平均成绩

SELECT
    stu.sid AS '学号',
    stu.sname AS '姓名',
    count( sc.course_id ) AS '选课数',
    avg( sc.num ) AS '平均成绩'
FROM
    student AS stu
INNER JOIN score AS sc 
ON ( sc.student_id = stu.sid ) 
GROUP BY stu.sid
having avg( sc.num )>60;
select student_id,avg(num) from score group by student_id having avg(num) > 60;

18.查询平均成绩大于85的所有学生的学号、平均成绩、姓名。

select student_id,avg(num),student.sname from score left join student on score.student_id=student.sid   group by student_id having avg(num) > 85;
SELECT
    stu.sid AS '学号',
    stu.sname AS '姓名',

    avg( sc.num ) AS '平均成绩'
FROM
    student AS stu
INNER JOIN score AS sc 
ON ( sc.student_id = stu.sid ) 
GROUP BY stu.sid
having avg( sc.num )>85;

19.查询 “三年二班” 每个学生的 学号、姓名、总成绩、平均成绩。

SELECT
    student_id,
    sname,
    sum( num ),
    avg( num ) 
FROM
    score
    LEFT JOIN student ON score.student_id = student.sid
    LEFT JOIN class ON class.cid = student.class_id 
WHERE
    class.caption = "三年二班" 
GROUP BY
    student_id;
SELECT 
    f.学号, f.姓名,b.caption as '班级名称', f.总成绩, f.平均成绩
FROM (
    SELECT
        stu.sid AS '学号',
        stu.sname AS '姓名',
        sum( sc.num ) AS '总成绩',
        avg( sc.num ) AS '平均成绩',
        stu.class_id
    FROM
        student AS stu
    INNER JOIN score AS sc 
    ON ( sc.student_id = stu.sid ) 
    GROUP BY stu.sid

)f,class AS b 
WHERE 
    b.caption="三年二班" ;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,667评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,361评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,700评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,027评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,988评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,230评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,705评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,366评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,496评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,405评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,453评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,725评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,803评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,015评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,514评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,111评论 2 341

推荐阅读更多精彩内容