多表查询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(学生表、教师表、课程表、成绩表)多表查询相关推荐

  1. Mysql 学生信息经典50题

    Mysql 学生信息经典50题 练习数据 数据表 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学 ...

  2. mysql:设有一数据库,包括四个表:学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)。四个表的结构分别如表1-1的表(一)表(四)所示

    设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)表(四)所示,数据如表1-2的表( ...

  3. MySQL 学生表(Student)、课程表(Course)、成绩表(Score)以及教师信息表(Teacher)

    设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表(四)所示,数据如表1-2的表 ...

  4. 学生表课程表成绩表教师表

    . Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 ...

  5. MySQL全方位练习(学生表 教师表 课程表 分数表)

    一.创建表并初始化数据 1.表说明 student(学生表).teacher(教师表).course(课程表).sc(分数表) 2.创建表 [sql]  view plain copy create  ...

  6. mysql建立班级表_mysql数据表设计-班级表 学生表 老师表 课程表 成绩表

    mysql数据表设计- 班级表 学生表 老师表 课程表 成绩表 image.png /* Navicat Premium Data Transfer Source Server : localhost ...

  7. mysql学生班级老师_MySQL全方位练习(学生表 教师表 课程表 分数表)

    1.查询"c001"课程比"c002"课程成绩高的所有学生的学号: select a.*from (select* from sc a where a.cno= ...

  8. 学生表/教师表/课程表/成绩表常见SQL查询

    1. 在表中插入符合主键 [sql]  /*成绩表*/  CREATE TABLE SC   (   Sid INT REFERENCES Student(Sid), /*学生学号*/  Cid IN ...

  9. 创建学院表 学生表 教师表 课程表 选课记录表

    为什么要使用数据库 解决数据持久化问题 高效的管理数据(增删改查) 数据库的分类: 关系型数据库 理论基础:关系代数 具体表象:二维表 行:记录 列:字段 编程语言:SQL(结构化查询语言) DDL ...

  10. MySQL8.0 小白入门 46条sql语句练习(学生表 教师表 课程表 分数表)

    4 Tab for MySQL8.0 1.表说明 2.创建表 3.插入数据 4.查询语句(46条) 1.表说明 – 数据库版本:mysql8 – 数据表说明:student(学生表).teacher( ...

最新文章

  1. 架构师说了:不想做背锅侠?生产问题要这样查
  2. 强烈推荐一款完全免费的绿色JRE+Tomcat+MySQL集成开发工具 - JTM
  3. 【 Thread】创建线程的2种方法
  4. LOJ-10096(强连通+bfs)
  5. 大理石在哪儿_如何创建用户体验写作课程而又不失大理石
  6. 【转】前端开发值得一看的文章
  7. linux tar 使用
  8. SpringBoot 阶段总结
  9. LeetCode(575)——分糖果(JavaScript)
  10. mysql重装_连我mysql读你文件
  11. IT行业技术部门人员架构设计
  12. 即不充值影视Vip,也不去电影院,为何Python爬虫师是这种人?
  13. ubuntu16如何开wifi
  14. adb 切换默认桌面,OPPO默认桌面替换教程
  15. Android实现横竖屏切换,以及手机横竖屏旋转的时候,实现横竖屏切换
  16. 4g+uim卡是什么卡_你知道SIM卡是什么吗?
  17. 不惧变化 抓住机遇 | A+CLUB 8月深圳站
  18. VxWorks下 canOpen移植心得 stm32 - ppc
  19. 2022广东省安全员B证第三批(项目负责人)考试试题及模拟考试
  20. 《FLUENT 14.0超级学习手册》——第2章 FLUENT软件介绍2.1 FLUENT软件特点简介

热门文章

  1. 引用 《大明宫词》经典台词89句
  2. NCH WavePad Mater for Mac(音乐编辑器)
  3. Web3.0时代来临。企业该如何无痛接轨、加值商模?
  4. RateLimiter配合ConcurrentHashMap对用户进行简单限流
  5. 按键精灵实用案例1:地址转换成经纬度——快速完成多个地址转换
  6. java基础13—方法
  7. 解决Tomcat启动失败:严重 [main] org.apache.catalina.util.LifecycleBase.handleSubClassException 初始化组件失败
  8. 怎么去除广告(百度推广,阿里妈妈推广等)
  9. c# 从一组数中随机抽取一定个数_C#随机一组不重复的数字
  10. Wireless_RSSI and SNR