>>>>>>>>>>

练习时间:2016.12.16

编辑时间:2016-12-20-->22:12:08

题:

涉及:多表查询、exists、count()、group by、order by
1.1 关系模式 
学生student;   SNO:学号;   SNAME:姓名;   AGE:年龄 ;   SEX:性别 
课程course:CNO:课程代码,CNAME:课程名称,TEACHER:教师 
学生成绩SC:SNO:学号,CNO:课程代码,SCORE:成绩 

 
 
1.2 要求一 用SQL语言完成表的创建以及数据的插入。 
1.3 要求二 用SQL语言完成如下要求: 
(1) 检索至少选修"程军"老师所授全部课程的学生姓名(SNAME);  
(2) 检索"李强"同学不学课程的课程号(CNO); 
(3) 检索选修不少于3门课程的学生学号(SNO); 
(4) 检索选修全部课程的学生姓名(SNAME)。 
(5) 检索不学"C语言"的学生信息 
 
1.4 要求三 请用SQL语言完成如下查询: 
(1)查询“程军”老师所教授的所有课程; 
(2)查询“李强”同学所有课程的成绩; 
(3)查询课程名为“C语言”的平均成绩; 
(4)查询选修了所有课程的同学信息。 
 
1.5 要求四 
(1)检索王老师所授课程的课程号和课程名。 
(2)检索年龄大于23岁的男学生的学号和姓名。 
(3)检索至少选修王老师所授课程中一门课程的女学生姓名。 
(4)检索李同学不学的课程的课程号。 
(5)检索至少选修两门课程的学生学号。 
(6)检索全部学生都选修的课程的课程号与课程名。 
(7)检索选修课程包含王老师所授课的学生学号。 
(8)统计有学生选修的课程门数。 
(9)求选修K1课程的学生的平均年龄。 
(10)求王老师所授课程的每门课程的学生平均成绩。 
(11)统计每门课程的学生选修人数(超过2人的课程才统计)。要求输出课程号和选修人数,查询结果 按人数降序排列,若人数相同,按课程号升序排列。 
(12)检索学号比李同学大,而年龄比他小的学生姓名。 
(13)检索姓名以李打头的所有学生的姓名和年龄。 
(14)在SC中检索成绩为空值的学生学号和课程号。 
(15)求年龄大于女同学平均年龄的男学生姓名和年龄。 
(16)求年龄大于所有女同学年龄的男学生姓名和年龄。

>>>>>>>>>>
答:
 
########
1.2 要求一......用SQL语言完成表的创建以及数据的插入
#创建student
CREATE TABLE student(
sno INT(10) COMMENT '学号',
sname VARCHAR(10) COMMENT '姓名',
age INT(3) COMMENT '年龄',
sex VARCHAR(1) COMMENT '性别')
 
#insert插入student数据
INSERT INTO student(sno,sname,age,sex) VALUES(1,'李强',18,'男')
INSERT INTO student(sno,sname,age,sex) VALUES(2,'刘丽',188,'女')
INSERT INTO student(sno,sname,age,sex) VALUES(3,'凤凰',19,'女')
INSERT INTO student(sno,sname,age,sex) VALUES(4,'婕拉',20,'女')
INSERT INTO student(sno,sname,age,sex) VALUES(5,'张友',21,'男')
INSERT INTO student(sno,sname,age,sex) VALUES(6,'孙悟空',500,'男')
 
#create创建course
CREATE TABLE course(
cno VARCHAR(10) COMMENT '课程代码',
cname VARCHAR(10) COMMENT '课程名称',
teacher VARCHAR(10) COMMENT '教师')
 
#insert插入course数据
INSERT INTO course(cno,cname,teacher) VALUES('K1','C语言','王华')
INSERT INTO course(cno,cname,teacher) VALUES('K2','C+语言','薛哥')
INSERT INTO course(cno,cname,teacher) VALUES('K3','C++语言','薛哥')
INSERT INTO course(cno,cname,teacher) VALUES('K4','java语言','薛哥')
INSERT INTO course(cno,cname,teacher) VALUES('K5','数据库原理','程军')
INSERT INTO course(cno,cname,teacher) VALUES('K6','linux语言','薛哥')
INSERT INTO course(cno,cname,teacher) VALUES('K7','PHP语言','薛哥')
INSERT INTO course(cno,cname,teacher) VALUES('K8','编译原理','程军')
 
#create创建表SC
CREATE TABLE sc(
sno INT(10) COMMENT '学号',
cno VARCHAR(10) COMMENT '课程代码',
score INT(10) COMMENT '成绩')
 
#insert插入sc数据
INSERT INTO sc(sno,cno,score) VALUES(1,'K1',83)
INSERT INTO sc(sno,cno,score) VALUES(2,'K1',85)
INSERT INTO sc(sno,cno,score) VALUES(5,'K1',92)
INSERT INTO sc(sno,cno,score) VALUES(2,'K5',90)
INSERT INTO sc(sno,cno,score) VALUES(5,'K5',84)
INSERT INTO sc(sno,cno,score) VALUES(5,'K8',80)
 
########
1.3 要求二.....用SQL语言完成如下要求
(1) 检索至少选修"程军"老师所授全部课程的学生姓名(SNAME);
#检索学生姓名
SELECT sname FROM student  
#检索选修 程军 课程的 课程代码
SELECT cno FROM course WHERE `teacher`='程军'
#检索选修课程的代码的学号
SELECT sno FROM sc WHERE cno IN (SELECT cno FROM course WHERE `teacher`='程军')
#结合
SELECT sname FROM student WHERE sno IN (SELECT sno FROM sc WHERE cno IN (SELECT cno FROM course WHERE `teacher`='程军'))
##以上结果为错误的查询方法!正确结果如下(运用exists):
 
SELECT * FROM student WHERE NOT EXISTS (
SELECT * FROM course WHERE teacher = '程军' AND NOT EXISTS(
SELECT * FROM sc WHERE sno=student.`sno` AND cno=course.`cno`))
 
(2) 检索"李强"同学不学课程的课程号(CNO);
SELECT cno FROM course WHERE NOT EXISTS(
SELECT * FROM student WHERE sname = '李强' AND EXISTS (
SELECT * FROM sc WHERE sc.`sno`=student.`sno` AND sc.`cno`=course.`cno`))
 
(2.2)查询所有学生所学的科目编号以及成绩

SELECT st.sno,st.sname,cr.cname,sc.`score`,cr.teacher
FROM student st,sc,course cr
WHERE st.sno=sc.`sno` AND cr.cno = sc.`cno`

(2.3)查询没有选修程军老师课程的学生姓名:
SELECT * FROM student st WHERE NOT EXISTS(
SELECT * FROM course cr WHERE teacher = '程军' AND EXISTS(
SELECT * FROM sc WHERE sc.`cno`=cr.cno AND sc.`sno`=st.sno))
(2.4)找出李强老师学生
SELECT * FROM student st,sc,course cr WHERE sname='李强' AND sc.`sno`=st.`sno` AND sc.`cno`=cr.cno
 
 
(3) 检索选修不少于3门课程cno的学生学号(SNO);
#检索学号select sno from sc
SELECT sno FROM sc GROUP BY sno  HAVING COUNT(*) >= 3
 
(4) 检索选修全部课程的学生姓名(SNAME)
#错误写法:SELECT sname FROM student WHERE sno IN (SELECT sno FROM sc GROUP BY sno  HAVING COUNT(*) >= 3)
#正确写法:
SELECT sname FROM student WHERE NOT EXISTS (
SELECT * FROM course  WHERE NOT EXISTS(
SELECT * FROM sc WHERE sc.sno=student.`sno` AND sc.cno=course.`cno`))
 
(5) 检索不学"C语言"的学生信息(因所有学生都有学习C语言,所以把C语言改为“编译原理”)
#错误写法:SELECT * FROM student WHERE sno IN (SELECT sno FROM sc WHERE cno IN (SELECT cno FROM course WHERE cname <> 'C语言'))
#正确写法:
SELECT * FROM student WHERE NOT EXISTS(
SELECT * FROM course WHERE cname = '编译原理' AND  EXISTS (
SELECT * FROM sc WHERE sc.`sno`=student.`sno` AND sc.`cno`=course.`cno`))
 
 
#########
1.4 要求三 请用SQL语言完成如下查询
(1)查询“程军”老师所教授的所有课程;
SELECT cname FROM course WHERE teacher = '程军'
 
(2)查询“李强”同学所有课程的成绩;
SELECT course.cname,sc.score FROM course,sc WHERE EXISTS(
SELECT * FROM student WHERE sname = '李强' AND EXISTS (
SELECT * FROM sc WHERE sc.`sno`=student.`sno` AND sc.`cno`=course.`cno`))  GROUP BY course.cname
 
(3)查询课程名为“C语言”的平均成绩;
#C语言课程标号: select cno from course where cname = 'C语言'
SELECT AVG(score) FROM sc WHERE cno = (SELECT cno FROM course WHERE cname = 'C语言')
 
(4)查询选修了所有课程的同学信息。
SELECT * FROM student WHERE NOT EXISTS (
SELECT * FROM course  WHERE NOT EXISTS(
SELECT * FROM sc WHERE sc.sno=student.`sno` AND sc.cno=course.`cno`))
 
 
 
 
########
1.5 要求四 
(1)检索王华老师所授课程的课程号和课程名。 
SELECT cno,cname FROM course WHERE teacher = '王华'
 
(2)检索年龄大于23岁的男学生的学号和姓名。 
SELECT sno,sname FROM student WHERE age >= 23 AND sex = '男'
 
(3)检索至少选修王老师所授课程中一门课程的女学生姓名。 
SELECT sname FROM student WHERE EXISTS (
SELECT * FROM course WHERE teacher = '王华' AND EXISTS (
SELECT * FROM sc WHERE sno=student.`sno` AND cno=course.`cno`)) AND sex = '女'
 
(4)检索李强同学不学的课程的课程号。
SELECT cno FROM course WHERE NOT EXISTS(
SELECT * FROM student WHERE sname = '李强' AND EXISTS (
SELECT * FROM sc WHERE sno=student.`sno` AND cno=course.`cno`))
 
(5)检索至少选修两门课程的学生学号。
SELECT sno FROM sc GROUP BY sno HAVING COUNT(*) >= 2
 
(6)检索全部学生都选修的课程的课程号与课程名。
方式一:
SELECT cno,cname FROM course WHERE NOT EXISTS(
SELECT * FROM student WHERE NOT EXISTS(
SELECT * FROM sc WHERE sc.`sno`=student.`sno` AND sc.`cno`=course.`cno`))
方式二:
SELECT cno,cname FROM course WHERE cno IN (
SELECT cno FROM sc GROUP BY cno HAVING COUNT(sno) = (SELECT COUNT(sno) FROM student))
 
(7)检索选修课程包含王华老师所授课的学生学号。
SELECT sno FROM student WHERE EXISTS(
SELECT * FROM course WHERE teacher = '王华' AND EXISTS(
SELECT * FROM sc WHERE sc.`sno`=student.`sno` AND sc.`cno`=course.`cno`))
 
(8)统计所有学生选修的课程门数。
SELECT sname,sc.`sno`,COUNT(cno) FROM student,sc  WHERE  sc.`sno`=student.`sno` GROUP BY sno
 
(9)求选修K1课程的学生的平均年龄。
SELECT AVG(age) FROM student WHERE EXISTS (
SELECT * FROM sc WHERE cno='k1' AND sc.`sno`=student.`sno`)
 
(10)求王华老师所授课程的每门课程的学生平均成绩。 
 
SELECT sno,AVG(score) FROM sc  WHERE EXISTS (
SELECT * FROM course WHERE teacher='程军' AND sc.`cno`=course.`cno` ) GROUP BY cno
(11)统计每门课程的学生选修人数(超过2人的课程才统计)。要求输出课程号和选修人数,查询结果 按人数降序排列,若人数相同,按课程号升序排列。
SELECT COUNT(sno),cno FROM sc GROUP BY cno HAVING COUNT(sno)>=2 ORDER BY COUNT(sno) ASC
 
(12)检索学号比李强同学大,而年龄比他小的学生姓名。 
SELECT sname FROM student WHERE sno>(SELECT sno FROM student WHERE sname='李强') AND age> (SELECT age FROM student WHERE sname='李强')
 
(13)检索姓名以李打头的所有学生的姓名和年龄。 
SELECT sname,age FROM student WHERE sname LIKE '%李%'
 
(14)在SC中检索成绩为空值的学生学号和课程号。 
SELECT sno,cno FROM student,course WHERE EXISTS (
SELECT * FROM sc WHERE score is NULL AND sc.`sno`=student.`sno` AND sc.`cno`=course.`cno`)
 
(15)求年龄大于女同学平均年龄的男学生姓名和年龄。
SELECT sname,age FROM student WHERE sex = '男' AND age >(SELECT AVG(age) FROM student WHERE sex = '女')
 
(16)求年龄大于所有女同学年龄的男学生姓名和年龄。
SELECT sname,age FROM student WHERE age>(SELECT max(age) FROM student WHERE sex='女') AND sex='男'
>>>>>>>>>>
>>>>>>>>>>
 
查询学号为1的学生 选修了的课程
#方式一:
SELECT * FROM course WHERE cno = (
SELECT cno FROM sc WHERE sno=1)
#方式二:
SELECT * FROM course WHERE  EXISTS (
SELECT * FROM student WHERE sno = 1 AND EXISTS (
SELECT * FROM sc WHERE sc.`sno`=student.sno AND sc.`cno`=course.`cno`))
 
查询学号为1的学生 是否选修“程军”老师的课程
SELECT * FROM course WHERE teacher = '程军' AND EXISTS (
SELECT * FROM student WHERE sno = 1 AND EXISTS (
SELECT * FROM sc WHERE sc.`sno`=student.sno AND sc.`cno`=course.`cno`))
 
查询学号为1的学生 是否选修了“程军”老师的课程,如果没有选修,请输出该同学没有选修的课程信息
SELECT * FROM course WHERE teacher = '程军' AND NOT EXISTS (
SELECT * FROM student WHERE sno = 1 AND EXISTS (
SELECT * FROM sc WHERE sc.`sno`=student.sno AND sc.`cno`=course.`cno`))
 
查看选修了程军老师课程的学生姓名信息:
SELECT * FROM student WHERE EXISTS (
SELECT * FROM course WHERE teacher = '程军' AND  EXISTS (
SELECT * FROM sc WHERE sc.`sno`=student.sno AND sc.`cno`=course.`cno`))
查看没有全部选修程军老师课程的学生信息
SELECT * FROM student WHERE EXISTS (
SELECT * FROM course WHERE teacher = '程军' AND NOT EXISTS (
SELECT * FROM sc WHERE sc.`sno`=student.sno AND sc.`cno`=course.`cno`))
查看没有选修程军老师课程的学生姓名信息:
SELECT * FROM student WHERE NOT EXISTS (
SELECT * FROM course WHERE teacher = '程军' AND EXISTS (
SELECT * FROM sc WHERE sc.`sno`=student.sno AND sc.`cno`=course.`cno`))
查看选修了程军老师所有课程的学生姓名信息:
SELECT * FROM student WHERE NOT EXISTS (
SELECT * FROM course WHERE teacher='程军' AND NOT EXISTS(
SELECT cno FROM sc WHERE sc.`sno`=student.`sno` AND course.`cno`=sc.`cno`))
 
 
(注:个人所写,并不保证全部正确、写法最优,如有意见,欢迎指出)
>>>>>>>>>>

mysql查询练习题-2016.12.16的更多相关文章

  1. 2016/3/16 45道MySQL 查询练习题

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

  2. mysql 查询 练习题及答案

    CREATE DATABASE school;USE school;/*1.创建student表格*//*id为主键 非空 唯一 */CREATE TABLE student (id INT(10) ...

  3. Qracle、Sql server 、mysql查询练习题

    1. select * from emp; 2. select empno, ename, job from emp; 3. select empno 编号, ename 姓名, job 工作 fro ...

  4. mysql查询练习题

    建库建表 a.建立一个公司数据库(gongsi)    CREATE DATABASE gongsi b.建立一张部门表(部门编号b_id,部门名称b_name) ,             其中b_ ...

  5. U3D笔记11:47 2016/11/30-15:15 2016/12/19

    11:47 2016/11/30Before you can load a level you have to add it to the list of levels used in the gam ...

  6. mysql数据库优化课程---12、mysql嵌套和链接查询

    mysql数据库优化课程---12.mysql嵌套和链接查询 一.总结 一句话总结:查询user表中存在的所有班级的信息? in distinct mysql> select * from cl ...

  7. MySQL查询练习2

    MySQL查询练习2 导读: 本次MySQL的查询语句是本人考试题目: 所有题目都已通过: 该查询练习并没有sql文件进行检查: 如果有书写以及其他错误欢迎指出. 题目正文: 1.找出借书超过5本的借 ...

  8. 【Python全栈-后端开发】MySQL数据库-练习题

    MySQL数据库-练习题 一.表关系 请创建如下表,并创建相关约束 二.操作表 1.自行创建测试数据 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 3.查询平均成绩大于60分的同学的学号 ...

  9. MySQL 查询练习记录

    MySQL 查询练习记录 最近在复习mysql,在b站上找了一个感觉还不错的视频,把视频中查询练习相关的内容记录了下来,以便自己日后查阅和复习. 视频连接:https://www.bilibili.c ...

随机推荐

  1. 耗时两月,NHibernate系列出炉

    写在前面 这篇总结本来是昨天要写的,可昨天大学班长来视察工作,多喝了点,回来就倒头就睡了,也就把这篇总结的文章拖到了今天. nhibernate系列从开始着手写,到现在前后耗费大概两个月的时间,通过总 ...

  2. 360浏览器遇到文档模式是IE7的解决办法

    这段时间遇到了360浏览器在加载java项目时,默认的文档模式是IE7,使得网页加载下拉框出现问题. 解决的方法是: 在显示的jsp页面加上 <meta http-equiv="X-U ...

  3. Java线程的概念

    1.      计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...

  4. Ubuntu Server 14.04 集成

    方便工作出差显示项目整合了下平时常用软件: OS: Ubuntu Server 14.04 VM:VMware Workstation 12.1.0 (不同版本好像会不兼容) 已经安装软件: 1. s ...

  5. C和指针 第十五章 二进制I/O

    二进制I/O 数据写入到文件效率最高的是用二进制形式写入,二进制输出避免了在数值转换为字符串过程中,所涉及的开销和精度损失,但而精致并非人眼所能阅读,所以这个技巧只有当数据被另一个程序按顺序读取才能使 ...

  6. HDU4738 tarjan割边|割边、割点模板

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4738 坑点: 处理重边 图可能不连通,要输出0 若求出的结果是0,则要输出1,因为最少要派一个人 #inc ...

  7. Tomcat 内存优化设置

    vi /tomcat7.0/bin/catalina.sh 开发环境 #!/bin/sh JAVA_OPTS='-Xms128m -Xmx512m -XX:PermSize=128m' 服务器: #! ...

  8. 中文编程语言Z语言开源正式开源!!!

    (Z语言基于.NET环境,源码中有很多高技术的代码,让更多的人知道对大家有会有很好的帮助,请管理员一点要批准放在首页) 本人实现的中文编程语言Z语言现在正式开源,采用LGPL协议. 编译器核心的网址为 ...

  9. 如何灵活运用Linux 进程资源监控和进程限制

    导读 每个 Linux 系统管理员都应该知道如何验证硬件.资源和主要进程的完整性和可用性.另外,基于每个用户设置资源限制也是其中一项必备技能. 在这篇文章中,我们会介绍一些能够确保系统硬件和软件正常工 ...

  10. Mac地址

    Mac地址是每张网卡的唯一标识符,也叫物理地址.硬件地址或链路地址,由网络设备制造商生产时烧在网卡的ROM中,可以修改.现在的Mac地址一般都采用6字节48bit(还有2字节16bit的Mac地址,多 ...