基本的SQL语句练习(学生课程表)

    技术2025-10-19  10

    创建表

    DROP TABLE IF EXISTS student; CREATE TABLE student( sno int auto_increment primary key, sname varchar(8), ssex varchar(3), sage int , sclass varchar(6) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO student(sname,ssex,sage,sclass) VALUES('李勇','男',20,'y01'); INSERT INTO student(sname,ssex,sage,sclass) VALUES('刘晨','男',21,'y02'); INSERT INTO student(sname,ssex,sage,sclass) VALUES('王敏','女',19,'y02'); INSERT INTO student(sname,ssex,sage,sclass) VALUES('张力','男',25,'y05'); DROP TABLE IF EXISTS course; CREATE TABLE course( cno int auto_increment primary key, cname varchar(20), ccredit int ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO course(cname,ccredit) VALUES('C语言',5); INSERT INTO course(cname,ccredit) VALUES('数据库',5); INSERT INTO course(cname,ccredit) VALUES('开发模式_VB',5); DROP TABLE IF EXISTS sc; CREATE TABLE sc( sno int references student(sno) on delete cascade, cno int references course(cno) on delete cascade, grade int ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO sc VALUES(1,1,90); INSERT INTO sc VALUES(1,2,95); INSERT INTO sc VALUES(2,1,55); INSERT INTO sc VALUES(4,3,null);

                1、查出全体同学的学号、姓名 select sno,sname from student; 2、查询全体同学的姓名学号班级(按顺序输出) select sname,sno,sclass from student; 3、查询全体同学的记录(显示所有行) select * from student; 4、查询全体同学的姓名及出生年份 select sname,(2010-sage) as '出生年份' from student ; 5、查询全体同学姓名出生年份班级(班级要用小写字母lower函数) select sname,2010-sage as '出生年份',lower(sclass) from student; 6、查询全体同学的姓名/出生年份/所在班级列为YearOfBirth select sname,2010-sage YearOfBirth,sclass from student; 7、查询选中学员的所在班级并且去掉重复行用distinct select distinct sclass from student; 8、查询Y02班全体同学名单 select * from student where sclass='y02'; 9、查询所有年龄在20岁一下的同学姓名及年龄 select sname,sage from student where sage<20; 10、查询考试不及格的同学的姓名及成绩 select s.sname,sc.grade from student s,sc where s.sno = sc.sno and sc.grade <60; 11、查询年龄在19-20岁(包括19、20)之间的同学姓名、班级、年龄 select sname,sclass,sage from student where sage in (19,20);(19、20 比较特殊选项少可以使用 in) select sname,sclass,sage from student where sage between 19 and 20; select sname,sclass,sage from student where sage>=19 and sage<=20; 12、查询年龄不在19-20岁之间的同学姓名、班级、年龄 select sname,sclass,sage from student where sage not in (19,20); select sname,sclass,sage from student where sage not between 19 and 20; select sname,sclass,sage from student where sage<19 or sage>20; 13、查询y02班级和y05班的同学的姓名、性别 select sname,sclass from student where sclass in ('y02','y05'); select sname,sclass from student where sclass='y02' or sclass='y05'; 14、查询不是y02或者y05班的同学的姓名、性别 select sname,sage from student where sclass not in('y02','y05'); select sname,sage from student where sclass!='y02' and sclass!='y05'; select sname,sage from student where not sclass='y02' and not sclass='y05'; 15、查所有姓刘的同学的姓名、学号、性别( " % "表示一个或者多个," _ "表示只占一个字符) select sname,sno,ssex from student where sname like'刘%'; 16、查所有姓张且全名只有2个汉子的同学的所有信息 select * from student where sname like'张_'; 17、某些学生未考试查缺成绩的同学的学号和课程号 select sno,cno,grade from sc where grade is null; 18、查询所有成绩的同学的学号、课程号和成绩 select sno,cno,grade from sc where grade is not null; 19、查y02班年龄在20岁一下的姓名和年龄 select sname,sage from student where sclass='y02' and sage<20; 20、查选修1号课程的同学的学号和成绩,按成绩降序排序 select sno,grade from sc where cno=1 order by grade desc; 21、查全体同学信息查询结果按所在班级的班级名称按降序排列,同班同学按年龄升序排列 select * from student order by sclass desc,sage asc; 22、查询学员的总人数 select count(sno) from student; 23、查选修课程学院人数 select count(*) from sc; 24、统计1号课的学院平均成绩 select avg(grade) 平均成绩 from sc where cno=1; 25、查选修1号课和同学最高成绩 select max(grade) from sc where cno=1; 26、求各个课程号及相应选课人数 select cno,count(*) 选课人数 from sc group by cno; 27、查选取1门以上课程的同学学号和课程个数 select sno,count(cno) from sc group by sno having count(cno)>1; 28、查每个学员及其选修课程情况 select sno,cno from sc; 29、查每个学员及其选修课程情况对没有选课的也要输出其姓名、学号、性别、班级(注意:是作外连接student是主表) select st.sname,st.sno,st.ssex,st.sclass,sc.cno,sc.grade from student st left join sc on st.sno = sc.sno order by st.sname; 30、查选取2号课程且成绩在90分以上的同学 select * from sc where cno=2 and grade>90; 31、查询每个同学学号姓名,选课程名称及其成绩 select stu.sno,stu.sname,c.cname,sc.grade from student stu join sc on stu.sno = sc.sno join course c on c.cno = sc.cno; 或者 select stu.sno,stu.sname,c.cname,sc.grade from student stu,course c,sc where stu.sno=sc.sno and c.cno= sc.cno order by sc.cno  desc; 32、查与刘晨在一个班的同学 select * from student where sclass=(select sclass from student where sname='刘晨'); 33、选取C语言的同学学号和姓名 select s.sno,s.sname from student s join sc on s.sno=sc.sno join course c on sc.cno=c.cno where c.cname='C语言'; 或者 select sno,sname from student where sno in (select sno from sc where cno in (select cno from course where cname='C语言')); 34、查其他班级中比y02班某一同学大的同学姓名和年龄 select sname,sage from student where sclass<>'y02' and sage > (select min(sage) from student where sclass='y02'); 或者(加入 any 关键字) select sname,sage from student where sclass<>'y02' and sage >any (select sage from student where sclass='y02'); 35、查其他班中比y02班同学全部都大的同学姓名和年龄 select sname,sage from student where sclass!='y02' and sage > (select max(sage) from student where sclass='y02'); 或者(加入 all 关键字) select sname,sage from student where sclass!='y02' and sage >all (select sage from student where sclass='y02'); 36、查选取1号课程的学员的姓名 (在与查询的集合的包含关系时,最好使用 in 、any、all) select s.sname from student s,sc where s.sno = sc.sno and sc.cno=1; 或者(子查询) select sname from student where sno in (select sno from sc where cno=1); 37、查没有选取1号课程的学员的姓名(注意:要过滤已经选取过1号的同学,因为可能某同学多选修课程) 说明:如果是过滤集合,就只能用 in/all/any select sname from student where sno not in (select sno from sc where cno=1); 38、查y02班同学及年龄不大于19岁的学员(union) select * from student where sclass='y02' union select * from student where sage<=19; 解析:y02班级的同学与全年纪年龄不大于19岁的学生,而(sage<=19 and sclass='y02')表示为 y02班级同学“且”年龄不大于19岁的同学,与题意不符。所以下面的语句是错误的,因为范围没有确定好 select * from student where sclass='y02' and sage<=19; 说明:union 用来两个集合求并集(合并两个集合,并且除去重复的记录) 39、查询选取1号课程或者2号课程的同学学号 select distinct sno from sc where  cno=1 or cno=2; 或者 select distinct sno from sc where cno in (1,2); 40、将4号学员的年龄改为23岁 update student set sage=23 where sno=4; 41、将所有同学的年龄增加1岁 update student set sage=sage+1; 42、y02班的同学的成绩改为100 update sc set grade=100 where sno in (select sno from student where sclass='y02'); 43、删除学号为1的同学记录 delete from student where sno=1;

    最新回复(0)