MySQL查询之每日十题(一)

2021/8/24 8:05:43

本文主要是介绍MySQL查询之每日十题(一),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

MySQL查询练习

导读:

以下是MySQL中查询练习题,该练习题是个人整理的,如果哪些地方有错误或者疑问,欢迎指出;

个人使用navicate版本是15,mysql版本5.7.31

如果有些语句显示group by的问题,建议查看MySQL版本:

如果是mysql5.7.x版本,默认是开启了 only_full_group_by 模式,会导致代码报错;

解决方法:

1、查看sql_mode:

select @@global.sql_mode;


查询出来的值为:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION


2、去掉ONLY_FULL_GROUP_BY,重新设置值。

 set @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';


3、上面是改变了全局sql_mode,对于新建的数据库有效。对于已存在的数据库,则需要在对应的数据下执行:

set sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';



资源问题:

将student各表,以及study表放到百度网盘中,自取;

链接:pan.baidu.com/s/1CxZA_pb9… 提取码:1234

一、 实验目的

1、掌握查询语句的基本组成和使用方法。

2、掌握常用查询技巧。

二、 实验预习

1、 SQL中查询语句的语句格式:

Select 属性名 from 表名;


2、 SQL中创建数据表的语句格式:

Create table 表名(  字段名 字段类型,………  );


三、 实验内容及要求

1、 数据库****db_student****中基本表的数据如下,输入下列数据。

学生表:Student

SnoSnameSsexSageSdept
9512101李勇19计算机系
9512103王敏20计算机系
9521101张莉22信息系
9521102吴宾21信息系
9521103张海20信息系
9531101钱小平18数学系
9531102王大力19数学系

课程表:Course

CnoCnameCcreditSemsterPeriod
C01计算机导论313
C02VB434
C03计算机网络474
C04数据库基础664
C05高等数学818

选课表:SC

SnoCnoGrade
9512101C0395
9512103C0351
9512101C0580
9512103C05NULL
9521101C05NULL
9521102C0580
9521103C0545
9531101C0581
9531101C0167
9531102C0594
9521103C0180
9512101C01NULL
9531102C01NULL
9512101C0287
9512101C0476

2、根据db_student中的数据,完成下列查询,将查询语句写在下方。

(1)查询全体学生的信息。

Select * from student;


(2)查询“信息系”学生的学号,姓名和出生年份。

Select sno,sname,YEAR(NOW())-sage from student  WHERE sdept='信息系';


(3)查询考试不及格的学生的学号。

Select distinct sno from sc where grade<60;


(4)查询无考试成绩的学生的学号和相应的课程号。

Select sno,cno from sc where grade is null;


(5)将学生按年龄升序排序。

Select * from student order by sage;


(6)查询选修了课程的学生的学号和姓名。

(要求:分别使用连接查询、嵌套子查询完成)

连接查询:

Select distinct student.sname,sc.sno from student,sc where student.sno=sc.sno ;


嵌套子查询:

select sno,sname from student where sno in ( select distinct sno from sc);


补充:

=any-->等于子查询结果中的某个值。

Select sno,sname from student where sno=any (select distinct sno from sc);


(7)查询年龄在20-23岁之间的学生的系,姓名,年龄,按照系升序排序。

Select sname,sage,sdept from student where sage between 20 and 23 order by sdept;


补充:

注意:utf8默认的校队集是utf-8-general-ci,他不是按照中文来的,需要强制让mysql按照中文来排序,gbk包含全部的中文字符,utf-8则包含全世界所有国家需要用到的字符;

Select sname,sage,sdept from student where sage between 20 and 23 order by convert(sdept using gbk);


(8)查询选修了“计算机网络”或者“数据库基础”课程的学生的学号,姓名。

(要求:分别使用连接查询、嵌套子查询完成)

连接查询:

select distinct student.sno,sname from student,sc,course where student.sno=sc.sno and sc.cno=course.cno and (cname='计算机网络' or cname='数据库基础');


嵌套查询:

select student.sno,sname 


from student


where sno in 


(


select sno From sc


where cno in (select cno from course where cname = '计算机网络' or cname = '数据库基础' ));


补充:

联合查询:

Select sno,sname from student where sno in (select sno from course,sc where course.cno =sc.cno and cname ='计算机网络') 
Union 
Select sno,sname from student where sno in (select sno from course,sc where course.cno =sc.cno and cname ='数据库基础');


(9)查询姓“张”的学生的基本信息。

select * from student where sname like'张%';


(10)查询学生的选课情况,要求输出学号,姓名,课程门数,课程名列表(用逗号分隔),按照学号升序排序。

 SELECT student.sno,sname,COUNT(*),    
 GROUP_CONCAT(cname ORDER BY cname SEPARATOR ',')'课程列表'    
 FROM student,sc,course    
 WHERE student.sno=sc.sno AND sc.cno=course.cno    
 GROUP BY student.sno    
 ORDER BY student.sno;


结束:

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

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


作者:xbhog




这篇关于MySQL查询之每日十题(一)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程