MySQL查询之每日十题(三)

384 阅读4分钟

MySQL查询之每日十题(三)

这是我参与8月更文挑战的第24天,活动详情查看:8月更文挑战

导读:

本次MySQL的查询语句是本人考试题目;

所有题目都已通过;

如果有书写以及其他错误欢迎指出。

题目正文:

1.找出借书超过5本的借阅信息

找出借书超过5本的借阅信息,输出借书卡号及所借图书数。

BORROW(借书记录)表 :CNO 借书卡号,BNO 书号,RDATE 还书日期

列含义 列名 类型 主键/外键

卡号 Cno Int 主键非空,参照card表的cno

书号 bno Int 主键非空,参照book表的bno

借书日期 rdate Datetime

表名请用小写。

select cno,count(*) from borrow group by cno having count(*)>5;

2.统计各专业的学生人数,要求输出系名,专业名,总人数,按系名排序。

[注意:SQL表名请用小写]表结构如下:

1、student(学生表):sno 学号 CHAR(9)

sname 姓名 CHAR(10)

ssex 性别 CHAR(2)

sage 年龄

SMALLINTjg 籍贯 VARCHAR(50)

zydh 专业代号 CHAR(4)

xdh 系代号 CHAR(2)

2、zy(专业表) zydh 专业代号 CHAR(4)

zymc 专业名称 VARCHAR(20)

xz 学制 SMALLINT

3、xb(系表) xdh 系代号 CHAR(2)

xmc 系名称 VARCHAR(20)

select xmc,zymc,count(*) from student s,xb,zy where s.zydh=zy.zydh
and s.xdh=xb.xdh group by xmc,zymc order by xb.xmc;

3.SQL查询:查询各个部门人数大于10人的,输出部门编号和人数,并按人数升序排序。

表结构如下:

select dept_id,COUNT(employee_id) as number  from employee group by  dept_id   HAVING number>=10 order by number;

4.查询选修未通过2门(包括2门)以上的学生的信息,输出学号、姓名、选修未通过门数,按门数降序排序,若门数相同,按学号升序排序。

[注意:SQL表名请用小写]

SELECT student.sno,sname,count(*)
from student,sc
where student.sno=sc.sno
and grade<60
GROUP by sno 
HAVING count(*)>=2
ORDER BY count(*) desc ,sno ;

5**.查询每个学生高于他自己选修平均分的那门课程的成绩,输出学号,课程号,课程成绩,他所有课程的平均分(取整),并按学号升序排列。**

[注意:SQL表名请用小写]

学生数据库db_student包括三个数据表student(学生表)、course(课程表)和sc(选课表)。表结构如下:

1、student(学生表):

SNO学号CHAR(7)

SNAME姓名CHAR(10)

SSEX性别CHAR(2)

SAGE年龄SMALLINT

SDEPT所在系 VARCHAR(20)

2、course(课程表)

CNO课程号CHAR(10)

CNAME课程名VARCHAR(20)

CCREDIT学分SMALLINT

SEMSTER学期SMALLINT

PERIOD学时SMALLINT

3、sc(选课表)

SNO 学号CHAR(7)

CNO 课程号CHAR(10)

GRADE 成绩 SMALLINT

SELECT sc.sno,cno,grade,avggrade 
FROM sc,(SELECT sno,ROUND(AVG(grade)) AS avggrade FROM sc GROUP BY sno) AS avg_sc
WHERE sc.sno=avg_sc.sno AND sc.grade>avg_sc.avggrade
ORDER BY sc.sno;

6.SQL查询:查询哪些客户从未有订单,输出客户编号和客户名称。

表结构如下:【注意order表,语句中写order

SELECT customer_id,customer_name
FROM customer
WHERE customer_id NOT IN(SELECT customer_id FROM `order`);

7.找出至今没有人选修过的课程

有课程表,学生表,成绩表如下,找出至今没有人选修过的课程号、课程名称。

course

列名数据类型约束说明
cnochar(4)主键非空课程号
cnamevarchar(40)非空课程名
cpnochar(4)参照course(cno)先修课
ccredittinyint学分

student

列名数据类型约束说明
snochar(7)主键非空学号
snamechar(10)非空学生姓名
ssexenum('男','女')默认‘男’性别
sagetinyint年龄
sdeptchar(20)默认'计算机系'系别

sc

列名数据类型约束说明
snochar(7)主键非空,参照student(sno)学号
cnochar(4)主键非空,参照course(cno)课程号
gradedecimal(5,1)成绩
ccredittinyint
select cno AS 课程号,cname AS 课程名
FROM course
WHERE cno NOT IN(SELECT DISTINCT sc.cno FROM sc);

8.查询同时选修了c01,c02,c03课程学生,输出学号,姓名

[注意:SQL表名请用小写]

select distinct student.sno, sname 
from student,sc
where student.sno = sc.sno 
and student.sno in
    (
        select sno
        from sc
        where cno = 'c01'
        and sno in
        (
            select sno
            from sc
            where cno = 'c02'
            and sno in
            (
                select sno
                from sc
                where cno = 'c03'
            )
        )
    ) ;

9.查询选课门数最多的学生的学号和姓名

有课程表,学生表,成绩表如下,查询选课门数最多的学生的学号和姓名,结果可能不只一行。

course

列名数据类型约束说明
cnochar(4)主键非空课程号
cnamevarchar(40)非空课程名
cpnochar(4)参照course(cno)先修课
ccredittinyint学分

student

列名数据类型约束说明
snochar(7)主键非空学号
snamechar(10)非空学生姓名
ssexenum('男','女')默认‘男’性别
sagetinyint年龄
sdeptchar(20)默认'计算机系'系别

sc

列名数据类型约束说明
snochar(7)主键非空,参照student(sno)学号
cnochar(4)主键非空,参照course(cno)课程号
gradedecimal(5,1)成绩
ccredittinyint
select student.sno,sname from sc,student where sc.sno=student.sno group by sno having (count(cno)>=all(select count(cno) from sc group by sno));

10 .查询统计产品“17”的每单平均订购数,和订单总数

个人看来该语句有些歧义,表示不是很清楚;

表结构如下:

SELECT product_id, AVG(buy_number), COUNT(*) 
FROM order_detail 
WHERE product_id = 17;

结束:

如果你看到这里或者正好对你有所帮助,希望能点个👍或者⭐感谢;

有错误的地方,欢迎在评论指出,作者看到会进行修改。