SQL 练习

这篇博客涵盖了多个SQL查询实践,包括比较不同课程成绩、筛选高分学生、获取学生详细信息、计数、排除条件查询以及复杂联接操作。通过这些实例,读者可以深入理解并提升SQL查询能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CREATE DATABASE /*!32312 IF NOT EXISTS*/`test1` /*!40100 DEFAULT CHARACTER SET utf8 */;

USE `test1`;

/*Table structure for table `course` */

DROP TABLE IF EXISTS `course`;

CREATE TABLE `course` (
  `cno` int(11) DEFAULT NULL,
  `cname` varchar(30) DEFAULT NULL,
  `tno` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `course` */

insert  into `course`(`cno`,`cname`,`tno`) values (1,'语文',1),(2,'数学',2),(3,'英语',3);

/*Table structure for table `sc` */

DROP TABLE IF EXISTS `sc`;

CREATE TABLE `sc` (
  `sno` int(11) DEFAULT NULL,
  `cno` int(11) DEFAULT NULL,
  `score` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `sc` */

insert  into `sc`(`sno`,`cno`,`score`) values (1,1,89),(1,2,56),(2,1,52),(2,2,24),(2,3,90),(3,1,86),(3,2,79),(3,3,65),(4,1,23),(4,2,96),(4,3,42),(5,1,99),(5,2,85),(5,3,76);

/*Table structure for table `student` */

DROP TABLE IF EXISTS `student`;

CREATE TABLE `student` (
  `sno` int(11) DEFAULT NULL,
  `sname` varchar(30) DEFAULT NULL,
  `sage` int(11) DEFAULT NULL,
  `ssex` char(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `student` */

insert  into `student`(`sno`,`sname`,`sage`,`ssex`) values (1,'张麻子',23,'男'),(2,'李麻子',22,'女'),(3,'',18,'男'),(4,'郭',26,'男'),(5,'田',26,'女');

/*Table structure for table `teacher` */

DROP TABLE IF EXISTS `teacher`;

CREATE TABLE `teacher` (
  `tno` int(11) DEFAULT NULL,
  `tname` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `teacher` */

insert  into `teacher`(`tno`,`tname`) values (1,'李四'),(2,'郭'),(3,'张三');

1.查询课程1的成绩比课程2的成绩高的所有学生的学号

SELECT a.sno FROM (SELECT sno,score FROM sc WHERE cno= 1) a, (SELECT sno,score FROM sc WHERE cno = 2 ) b  WHERE a.sno = b.sno AND a.score>b.score;

2.查询平均成绩大于60分的同学的学号和平均成绩

SELECT score.sno,score.av FROM (SELECT sno,AVG(score) av  FROM sc GROUP BY sno ) score WHERE av>60;

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

SELECT student.sno '学号',student.sname '姓名', c.cou '选课数',c.su '总成绩' FROM (SELECT sno,COUNT(1) cou,SUM(score) su FROM sc GROUP BY sno) c ,student WHERE c.sno = student.sno

SELECT student.sno AS 学号, student.sname AS 姓名, COUNT(sc.cno) AS 选课数, SUM(score) AS 总成绩 FROM student LEFT JOIN sc ON student.sno = sc.sno GROUP BY student.sno

4.查询姓“张”的老师的个数

SELECT COUNT(DISTINCT(tname)) FROM teacher WHERE tname LIKE '张%'

5.查询没学过“张三”老师课的同学的学号、姓名

SELECT student.sno,student.sname FROM student WHERE sno NOT IN (SELECT DISTINCT(sc.sno) FROM sc,course,teacher WHERE sc.cno=course.cno AND teacher.tno=course.tno AND teacher.tname='张三')

6.查询同时学过课程1和课程2的同学的学号、姓名

SELECT sno, sname FROM student WHERE sno IN (SELECT sno FROM sc WHERE sc.cno = 1) AND sno IN (SELECT sno FROM sc WHERE sc.cno = 2)

7.查询学过“李四”老师所教所有课程的所有同学的学号、姓名

SELECT a.sno, a.sname FROM student a, sc b WHERE a.sno = b.sno AND b.cno IN (SELECT c.cno FROM course c, teacher d WHERE c.tno = d.tno AND d.tname = '李四')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值