Mysql练习

刚离职,去面试,才察觉自己在sql这方面还是有很大的欠缺,普通的增删改查完全应付不了笔试,故此稍加练习较为复杂的sql语句.

在网上查找了些许mysql的练习题,原链接已经忘却了,抱歉!

废话不说:

学生表:
CREATE TABLE `student` (
  `S` varchar(10) DEFAULT NULL,
  `Sname` varchar(10) DEFAULT NULL,
  `Sage` datetime DEFAULT NULL,
  `Ssex` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

教师表:
CREATE TABLE `teacher` (
  `T` varchar(10) DEFAULT NULL,
  `Tname` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

课程表: T对应教师表的T

CREATE TABLE `course` (
  `C` varchar(10) DEFAULT NULL,
  `Cname` varchar(10) DEFAULT NULL,
  `T` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

分数表:  关联学生表和课程表

CREATE TABLE `sc` (
  `S` varchar(10) DEFAULT NULL,
  `C` varchar(10) DEFAULT NULL,
  `score` decimal(18,1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

--1、查询"01"课程比"02"课程成绩高的学生的信息及课程分
SELECT a.*,b.score AS '01课程分数', c.score AS '02课程分数' FROM student AS a 
LEFT JOIN sc AS b ON a.s = b.s AND b.c = '01' 
LEFT JOIN sc AS c ON a.s = c.s AND c.c = '02' 
WHERE b.score > c.score

  --2、查询"01"课程比"02"课程成绩低的学生的信息及课程分数
     SELECT a.* ,b.score AS '01分数',c.score AS '02分数' FROM Student a 
 LEFT JOIN sc b ON a.s = b.s AND b.c ='01'
 LEFT JOIN sc c ON a.s = c.s AND c.c = '02'
 WHERE b.score < c.score

 --3、查询 平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩
 SELECT student.s,student.`Sname`,AVG(sc.score) AS avgScore FROM sc 
 LEFT JOIN student ON sc.`S` = student.`S` GROUP BY sc.s HAVING AVG(sc.`score`) >= 60

 --4、查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩
SELECT a.s,a.sname,AVG(b.score) FROM student a LEFT JOIN sc b ON a.s = b.s GROUP BY a.s HAVING AVG(b.score) <= 60 ;

--5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
SELECT a.s,a.sname,SUM(b.score) AS '总成绩' ,COUNT(c.c) AS '选课总数' FROM student a LEFT JOIN sc b ON a.s = b.s LEFT JOIN Course c ON b.c = c.c GROUP BY a.s

SELECT a.s ,a.sname ,COUNT(b.c) ,SUM(b.score) FROM student a LEFT JOIN sc b ON a.s=b.s GROUP BY 1,2

--6、查询学过"张三"老师授课的同学的信息 
SELECT a.* FROM student a LEFT JOIN sc b ON a.s = b.s LEFT JOIN Course c ON b.c = c.c LEFT JOIN Teacher d ON c.t = d.t WHERE d.Tname = '张三'

--7、查询没学过"张三"老师授课的同学的信息 
SELECT a.* FROM student a LEFT JOIN sc b ON a.s = b.s WHERE NOT EXISTS 
(SELECT * FROM Teacher c LEFT JOIN Course d ON c.T = d.t LEFT JOIN sc f ON d.c = f.c WHERE c.tname = '张三' AND a.s = f.s) GROUP BY a.s

--8、查询学过编号为"01"并且也学过编号为"02"的课程的同学的信息
第一种:
SELECT aa.s,aa.name FROM (SELECT a.s AS s,a.sname AS NAME FROM student a INNER JOIN sc b ON a.s = b.s AND b.c ='01') aa,
(SELECT a.s,a.sname AS NAME FROM student a INNER JOIN sc b ON a.s = b.s AND b.c ='02') bb WHERE aa.name = bb.name
第二种:
SELECT a.s,a.sname FROM Student a INNER JOIN sc b ON a.s = b.s AND b.c = '01' INNER JOIN sc c ON a.s = c.s AND c.c = '02'




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值