MySQL(学生表、教师表、课程表、成绩表)多表查询
多表查询SQL语句
1、表架构
student(sid,sname,sage,ssex) 学生表
course(cid,cname,tid) 课程表
sC(sid,cid,score) 成绩表
teacher(tid,tname) 教师表
2、建表sql语句
CREATE TABLE student ( sid INT PRIMARY KEY NOT NULL,sname VARCHAR(30), sage INT, ssex VARCHAR(8) ) CREATE TABLE course ( cid INT PRIMARY KEY NOT NULL, cname VARCHAR(30), tid INT ) CREATE TABLE sc ( sid INT NOT NULL, cid INT NOT NULL, score INT ) CREATE TABLE teacher ( tid INT PRIMARY KEY NOT NULL, tname VARCHAR(30) )
3、问题:
(1)查询“30001”课程的所有学生的学号与分数;
SELECT sid,score FROM sc WHERE cid="30001"
(2)查询“001”课程比“002”课程成绩高的所有学生的学号与分数;
SELECT a.sid,a.score FROM (SELECT sid,score FROM sc WHERE cid="30001") a,(SELECT sid,score FROM sc WHERE cid="30002") bWHERE a.score>b.score AND a.sid=b.sid
(3)查询平均成绩大于60分的同学的学号和平均成绩;
SELECT sid,AVG(score)FROM scGROUP BY sid HAVING AVG(score)>60
(4)查询所有同学的学号、姓名、选课数、总成绩
SELECT s.sid AS "学号", s.sname AS "姓名", COUNT(sc.cid) AS "课程数目", SUM(sc.score) AS "总分数"FROM student s, sc scWHERE s.sid=sc.sidGROUP BY s.sid
(5)查询姓“李”的老师的个数;
select count(distinct(Tname))from teacherwhere tname like '李%';
(6)查询学过“张三”老师课的同学的学号、姓名
SELECT s.sid AS "学号", s.sname AS "姓名"FROM student s, sc sc, course c, teacher tWHERE s.sid=sc.sid AND c.cid=sc.cid AND t.tid=c.tid AND t.tname="张三"
(7)查询没有学过“张三”老师课的同学的学号、姓名
SELECT s.sid, s.snameFROM student sWHERE s.sid NOT IN (SELECT s.sidFROM student s, sc sc, course c, teacher tWHERE s.sid=sc.sid AND c.cid=sc.cid AND t.tid=c.tid AND t.tname="张三")
(8)查询学过“30001”并且也学过编号“30002”课程的同学的学号、姓名
SELECT s.sid, s.snameFROM student s, sc scWHERE s.sid=sc.sid AND sc.cid="30001" AND EXISTS(SELECT * FROM sc AS sc2 WHERE sc2.sid=sc.sid AND sc2.cid="30002")
(9)查询学过“叶平”老师所教的所有课的同学的学号、姓名;
SELECT sid, snameFROM studentWHERE sid IN (SELECT sc.sidFROM sc sc, course c, teacher tWHERE sc.cid=c.cid AND c.tid=t.tid AND t.tname="张二")
(10)查询所有课程成绩小于60分的同学的学号、姓名
SELECT sid, sname FROM studentWHERE sid NOT IN (SELECT DISTINCT(sc.sid) FROM student s, sc scWHERE sc.sid=s.sid AND sc.score>60)
(11)查询没有学全所有课的同学的学号、姓名;
SELECT sid, sname FROM student WHERE sid NOT IN(SELECT s.sid FROM student s, sc scWHERE sc.sid=s.sidGROUP BY s.sidHAVING COUNT(sc.cid)=(SELECT COUNT(cid) FROM course))
(12)查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
SELECT cid AS "课程ID", MAX(score) AS "最高分", MIN(score) AS "最低分"
FROM sc
GROUP BY cid
(13)按各科平均成绩从低到高和及格率的百分数从高到低顺序
(方式一)
SELECT sc.cid AS "课程ID",c.cname AS "课程名", AVG(sc.score) AS "平均成绩",SUM(CASE WHEN sc.score > 60 THEN 1 ELSE 0 END)/COUNT(1)*100 AS "及格百分数"
FROM sc sc, course c
WHERE sc.cid=c.cid
GROUP BY sc.cid
ORDER BY AVG(sc.score) ASC,SUM(CASE WHEN sc.score > 60 THEN 1 ELSE 0 END)/COUNT(1)*100 DESC(方式二)
SELECT sc.cid AS "课程ID",c.cname AS "课程名", IFNULL(AVG(sc.score),0) AS "平均成绩",100*SUM(CASE WHEN IFNULL(sc.score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS "及格百分数"
FROM sc sc, course c
WHERE sc.cid = c.cid
GROUP BY sc.cid
ORDER BY AVG(sc.score) ASC,100*SUM(CASE WHEN IFNULL(sc.score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC
(14)查询所有学生的所有科目的成绩单(学号、姓名、语文、数学、英语、物理、平均分、总分(按照总分由高到低排序))
SELECT s.sid AS "学号", s.sname AS "姓名",SUM(CASE c.cname WHEN "语文" THEN sc.score ELSE 0 END) AS "语文",SUM(CASE c.cname WHEN "数学" THEN sc.score ELSE 0 END) AS "数学",SUM(CASE c.cname WHEN "英语" THEN sc.score ELSE 0 END) AS "英语",SUM(CASE c.cname WHEN "物理" THEN sc.score ELSE 0 END) AS "物理",IFNULL(AVG(sc.score),0) AS "平均分",IFNULL(SUM(sc.score),0) AS "总分"
FROM student sLEFT OUTER JOIN sc sc ON s.sid=sc.sidLEFT OUTER JOIN course c ON sc.cid=c.cid
GROUP BY s.sid, s.sname
ORDER BY IFNULL(SUM(sc.score),0) DESC
(15)查询总分排名在200-300(包含200和第300)之间的学生所有成绩单信息
SELECT s.sid AS "学号", s.sname AS "姓名",SUM(CASE c.cname WHEN "语文" THEN sc.score ELSE 0 END) AS "语文",SUM(CASE c.cname WHEN "数学" THEN sc.score ELSE 0 END) AS "数学",SUM(CASE c.cname WHEN "英语" THEN sc.score ELSE 0 END) AS "英语",SUM(CASE c.cname WHEN "物理" THEN sc.score ELSE 0 END) AS "物理",IFNULL(AVG(sc.score),0) AS "平均分",IFNULL(SUM(sc.score),0) AS "总分"
FROM student sLEFT OUTER JOIN sc sc ON s.sid=sc.sidLEFT OUTER JOIN course c ON sc.cid=c.cid
GROUP BY s.sid, s.sname
HAVING IFNULL(SUM(sc.score),0) BETWEEN 200 AND 300
ORDER BY IFNULL(SUM(sc.score),0) DESC
(16)查询总分排名在前四名的学生所有成绩单信息
SELECT s.sid AS "学号", s.sname AS "姓名",SUM(CASE c.cname WHEN "语文" THEN sc.score ELSE 0 END) AS "语文",SUM(CASE c.cname WHEN "数学" THEN sc.score ELSE 0 END) AS "数学",SUM(CASE c.cname WHEN "英语" THEN sc.score ELSE 0 END) AS "英语",SUM(CASE c.cname WHEN "物理" THEN sc.score ELSE 0 END) AS "物理",IFNULL(AVG(sc.score),0) AS "平均分",IFNULL(SUM(sc.score),0) AS "总分"
FROM student sLEFT OUTER JOIN sc sc ON s.sid=sc.sidLEFT OUTER JOIN course c ON sc.cid=c.cid
GROUP BY s.sid, s.sname
ORDER BY IFNULL(SUM(sc.score),0) DESC
LIMIT 0,4
(17)查询总分排名在前二名到四名的学生所有成绩单信息(limit 1,3表示从第二条数据开始,连续三条数据)
SELECT s.sid AS "学号", s.sname AS "姓名",SUM(CASE c.cname WHEN "语文" THEN sc.score ELSE 0 END) AS "语文",SUM(CASE c.cname WHEN "数学" THEN sc.score ELSE 0 END) AS "数学",SUM(CASE c.cname WHEN "英语" THEN sc.score ELSE 0 END) AS "英语",SUM(CASE c.cname WHEN "物理" THEN sc.score ELSE 0 END) AS "物理",IFNULL(AVG(sc.score),0) AS "平均分",IFNULL(SUM(sc.score),0) AS "总分"
FROM student sLEFT OUTER JOIN sc sc ON s.sid=sc.sidLEFT OUTER JOIN course c ON sc.cid=c.cid
GROUP BY s.sid, s.sname
ORDER BY IFNULL(SUM(sc.score),0) DESC
LIMIT 1,3
(18)查询学生平均成绩及其名次
(非本人)
SELECT 1+(SELECT COUNT( distinct 平均成绩)FROM (SELECT sid,AVG(score) AS 平均成绩FROM scGROUP BY sid ) AS T1WHERE 平均成绩 > T2.平均成绩) as 名次, S# as 学生学号,平均成绩
FROM (SELECT sid,AVG(score) 平均成绩FROM sc GROUP BY sid ) AS T2
ORDER BY 平均成绩 desc
MySQL(学生表、教师表、课程表、成绩表)多表查询相关推荐
- Mysql 学生信息经典50题
Mysql 学生信息经典50题 练习数据 数据表 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学 ...
- mysql:设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)表(四)所示
设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)表(四)所示,数据如表1-2的表( ...
- MySQL 学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)
设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表 ...
- 学生表课程表成绩表教师表
. Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 ...
- MySQL全方位练习(学生表 教师表 课程表 分数表)
一.创建表并初始化数据 1.表说明 student(学生表).teacher(教师表).course(课程表).sc(分数表) 2.创建表 [sql] view plain copy create ...
- mysql建立班级表_mysql数据表设计-班级表 学生表 老师表 课程表 成绩表
mysql数据表设计- 班级表 学生表 老师表 课程表 成绩表 image.png /* Navicat Premium Data Transfer Source Server : localhost ...
- mysql学生班级老师_MySQL全方位练习(学生表 教师表 课程表 分数表)
1.查询"c001"课程比"c002"课程成绩高的所有学生的学号: select a.*from (select* from sc a where a.cno= ...
- 学生表/教师表/课程表/成绩表常见SQL查询
1. 在表中插入符合主键 [sql] /*成绩表*/ CREATE TABLE SC ( Sid INT REFERENCES Student(Sid), /*学生学号*/ Cid IN ...
- 创建学院表 学生表 教师表 课程表 选课记录表
为什么要使用数据库 解决数据持久化问题 高效的管理数据(增删改查) 数据库的分类: 关系型数据库 理论基础:关系代数 具体表象:二维表 行:记录 列:字段 编程语言:SQL(结构化查询语言) DDL ...
- MySQL8.0 小白入门 46条sql语句练习(学生表 教师表 课程表 分数表)
4 Tab for MySQL8.0 1.表说明 2.创建表 3.插入数据 4.查询语句(46条) 1.表说明 – 数据库版本:mysql8 – 数据表说明:student(学生表).teacher( ...
最新文章
- 架构师说了:不想做背锅侠?生产问题要这样查
- 强烈推荐一款完全免费的绿色JRE+Tomcat+MySQL集成开发工具 - JTM
- 【 Thread】创建线程的2种方法
- LOJ-10096(强连通+bfs)
- 大理石在哪儿_如何创建用户体验写作课程而又不失大理石
- 【转】前端开发值得一看的文章
- linux tar 使用
- SpringBoot 阶段总结
- LeetCode(575)——分糖果(JavaScript)
- mysql重装_连我mysql读你文件
- IT行业技术部门人员架构设计
- 即不充值影视Vip,也不去电影院,为何Python爬虫师是这种人?
- ubuntu16如何开wifi
- adb 切换默认桌面,OPPO默认桌面替换教程
- Android实现横竖屏切换,以及手机横竖屏旋转的时候,实现横竖屏切换
- 4g+uim卡是什么卡_你知道SIM卡是什么吗?
- 不惧变化 抓住机遇 | A+CLUB 8月深圳站
- VxWorks下 canOpen移植心得 stm32 - ppc
- 2022广东省安全员B证第三批(项目负责人)考试试题及模拟考试
- 《FLUENT 14.0超级学习手册》——第2章 FLUENT软件介绍2.1 FLUENT软件特点简介
热门文章
- 引用 《大明宫词》经典台词89句
- NCH WavePad Mater for Mac(音乐编辑器)
- Web3.0时代来临。企业该如何无痛接轨、加值商模?
- RateLimiter配合ConcurrentHashMap对用户进行简单限流
- 按键精灵实用案例1:地址转换成经纬度——快速完成多个地址转换
- java基础13—方法
- 解决Tomcat启动失败:严重 [main] org.apache.catalina.util.LifecycleBase.handleSubClassException 初始化组件失败
- 怎么去除广告(百度推广,阿里妈妈推广等)
- c# 从一组数中随机抽取一定个数_C#随机一组不重复的数字
- Wireless_RSSI and SNR