Browse Source

'message'

machinecat520 2 years ago
parent
commit
1ef3288aca
1 changed files with 397 additions and 20 deletions
  1. 397 20
      第十三章、练习题.sql

+ 397 - 20
第十三章、练习题.sql

@@ -662,6 +662,9 @@ WHERE dep.DepName = '网络技术系'
 
 #练习5
 #1、建立数据库test_student
+CREATE DATABASE IF NOT EXISTS test_student;
+
+USE test_student;
 
 #2、建立以下三张表,并插入记录
 #Table:Classes
@@ -695,19 +698,102 @@ WHERE dep.DepName = '网络技术系'
 	CoCo 		病假
 	LILY 		事假
 */
+#创建表一:Classes
+CREATE TABLE classes(
+major VARCHAR(20) NOT NULL,
+class VARCHAR(10) NOT NULL,
+sname VARCHAR(10) NOT NULL,
+sex CHAR(1) DEFAULT '男',
+seat INT UNIQUE NOT NULL
+);
+
+#创建表二:score
+CREATE TABLE score(
+sname VARCHAR(10) NOT NULL,
+english INT NOT NULL,
+math INT NOT NULL,
+chinese INT	NOT NULL
+);
+
+#创建表三:Records
+CREATE TABLE records(
+sname VARCHAR(10) NOT NULL,
+record VARCHAR(10)
+);
+
+#向classes表插入数据
+INSERT INTO classes VALUES
+('计算机网络','1班','张三',DEFAULT,8),
+('软件工程','2班','李四',DEFAULT,12),
+('计算机维护','1班','王五','男',9),
+('计算机网络','2班','LILY','女',15),
+('软件工程','1班','小强',DEFAULT,20),
+('计算机维护','1班','CoCo','女',18);
+
+SELECT * FROM classes;
+
+#向score表插入数据
+INSERT INTO score VALUES
+('张三',65,75,98),
+('李四',87,45,86),
+('王五',98,86,65),
+('LILY',75,86,87),
+('小强',85,60,58),
+('Coco',96,87,70);
+
+SELECT *FROM score;
+
+#向records表插入数据
+INSERT INTO records VALUES
+('小强','迟到'),
+('小强','事假'),
+('李四','旷课'),
+('李四','旷课'),
+('李四','迟到'),
+('Coco','病假'),
+('LILY','事假');
+
+SELECT * FROM records;
 
 #3、写出将张三的语文成绩修改为88的SQL语句
+UPDATE score
+SET chinese = 88
+WHERE sname = '张三';
 
 #4、搜索出计算机维护1班各门课程的平均成绩
+#我做的,不对
+SELECT major,class,AVG(english),AVG(math),AVG(chinese)
+FROM score JOIN classes
+GROUP BY major,class
+HAVING major = '计算机维护' AND class = '1班'
+
+#老师给的参考方法
+SELECT AVG(english),AVG(math),AVG(chinese)
+FROM score
+WHERE sname IN (SELECT sname
+								FROM classes
+								WHERE major = '计算机维护' AND class = '1班');
 
 #5、搜索科目有不及格的人的名单
+SELECT sname
+FROM score
+WHERE english < 60 OR math < 60 OR chinese <60;
 
 #6、查询记录2次以上的学生的姓名和各科成绩
+SELECT score.*
+FROM score JOIN (SELECT sname,COUNT(*)
+									FROM records
+									GROUP BY sname
+									HAVING COUNT(*) >= 2) temp
+ON score.sname = temp.sname;
 
 ######################################################################
 
 #练习6
 #1、建立数据库:test_xuankedb
+CREATE DATABASE IF NOT EXISTS test_xuankedb;
+
+USE test_xuankedb;
 
 #2、建立如下三张表:
 /*
@@ -721,24 +807,86 @@ WHERE dep.DepName = '网络技术系'
 		(Sno,Cno)为关键字。
 */
 
-#3、向Student表增加“入学事件(Scome)”列,其数据类型为日期型。
+#创建学生表
+CREATE TABLE IF NOT EXISTS student(
+sno INT PRIMARY KEY,
+sname VARCHAR(20) NOT NULL,
+ssex CHAR(1) NOT NULL,
+sage INT NOT NULL,
+sdept VARCHAR(40) NOT NULL
+);
+
+DESC student;
+
+#创建课程表
+CREATE TABLE IF NOT EXISTS course(
+cno INT PRIMARY KEY,
+cname VARCHAR(20) NOT NULL,
+cpno VARCHAR(40),
+ccredit INT
+);
+
+DESC course;
+
+#创建成绩表
+CREATE TABLE IF NOT EXISTS sg(
+sno INT,
+cno INT,
+grade INT,
+PRIMARY KEY(sno,cno),
+CONSTRAINT fk_s_stu_sno FOREIGN KEY(sno) REFERENCES student(sno),
+CONSTRAINT fk_s_cou_sno FOREIGN KEY(cno) REFERENCES course(cno)
+);
+
+DESC sg;
+
+#3、向Student表增加“入学时间(Scome)”列,其数据类型为日期型。
+ALTER TABLE student
+ADD scome DATE;
 
 #4、查询选修了3号课程的学生的学号及其成绩,查询结果按分数的降序排列。
+SELECT sno,grade
+FROM sg
+WHERE cno = 3
+ORDER BY grade DESC;
 
 #5、查询学习1号课程的学生最高分数、平均成绩。
+SELECT MAX(grade),AVG(grade)
+FROM sg
+WHERE cno = 1;
 
 #6、查询与“李洋”在同一个系学习的学生。
+SELECT *
+FROM student
+WHERE sdept = (SELECT dept
+							 FROM student
+							 WHERE sname = '李洋'
+							 );
 
 #7、将计算机系全体学生的成绩置零。
+UPDATE sg
+set grade = 0
+WHERE sno IN (SELECT sno
+							FROM student
+							WHERE sdept = '计算机系');
 
 #8、删除学生表中学号为05019的学生记录。
+DELETE FROM student
+WHERE sno = 05019
 
 #9、删除计算机系所有学生的成绩记录。
+DELETE FROM sg
+WHERE sno IN (SELECT sno
+							FROM student
+							WHERE dept = '计算机系');
 
 ######################################################################
 
 #练习7
 #1、建立数据库:test_library
+CREATE DATABASE IF NOT EXISTS test_library;
+
+USE test_library;
 
 #2、建立如下三个表:
 /*
@@ -751,7 +899,34 @@ WHERE dep.DepName = '网络技术系'
 	种类bsortno(int)、出版社编号pressid(int)
 */
 
-#3、给sort表中添加一系列属性:描述describes(varchar)
+#创建表一
+CREATE TABLE press(
+pressid INT PRIMARY KEY,
+pressname VARCHAR(30),
+address VARCHAR(50)
+);
+
+#创建表二
+CREATE TABLE sort(
+sortno INT PRIMARY KEY,
+scount INT
+);
+
+#创建表三
+CREATE TABLE book(
+bid INT PRIMARY KEY,
+bname VARCHAR(20),
+bsortno INT,
+pressid INT,
+CONSTRAINT fk_p_b_pid FOREIGN KEY(pressid) REFERENCES press(pressid),
+CONSTRAINT fk_s_b_sno FOREIGN KEY(bsortno) REFERENCES sort(sortno)
+);
+
+#3、给sort表中添加一列属性:描述describes(varchar)
+ALTER TABLE sort
+ADD describes VARCHAR(30);
+
+DESC sort;
 
 #4、向三个表中各插入几条数据
 #表一:press
@@ -770,24 +945,88 @@ WHERE dep.DepName = '网络技术系'
 */
 #表三:book
 /*
-	bid 	bname			bsortno		pressid
-	1			红与黑		11				100
-	2			幻城			12				102
-	3			希腊神话	13				102
+	bid 	bname					bsortno		pressid
+	1			红与黑				11				100
+	2			幻城					12				102
+	3			希腊神话			13				102
+	4			一千零一夜		13				102
 */
 
+#向表一插入数据
+INSERT INTO press VALUES
+(100,'外研社','上海'),
+(101,'北大出版社','北京'),
+(102,'教育出版社','北京');
+
+#向表二插入数据
+INSERT INTO sort VALUES
+(11,50,'小说'),
+(12,300,'科幻'),
+(13,100,'神话');
+
+#向表三插入数据
+INSERT INTO book VALUES
+(1,'红与黑',11,100),
+(2,'幻城',12,102),
+(3,'希腊神话',13,102),
+(4,'一千零一夜',13,102);
+
 #5、查询出版社id为100的书的全部信息
+SELECT * FROM press;
+SELECT * FROM sort;
+SELECT * FROM book;
+
+SELECT *
+FROM book
+WHERE pressid = 100;
 
 #6、查询出版社为外研社的书的全部信息
+SELECT *
+FROM book
+WHERE pressid = (
+									SELECT pressid
+									FROM press
+									WHERE pressname = '外研社'
+									);
 
 #7、查询图书数量(scount)大于100的种类
+SELECT *
+FROM sort
+WHERE scount > 100;
 
 #8、查询图书种类最多的出版社信息
+#我做的
+SELECT *
+FROM press
+WHERE pressid = (
+									SELECT pressid
+									FROM book
+									GROUP BY bsortno
+									ORDER BY count(*) DESC
+									LIMIT 0,1
+									);
+
+#老师给的参考答案
+#方式一(报错,无法运行)
+SELECT * FROM press WHERE pressid=(
+		SELECT temp.pressid FROM 
+		(SELECT pressid,MAX(t,c) FROM (SELECT pressid,COUNT(*) AS c FROM book GROUP BY pressid ORDER BY c DESC) AS t) AS temp);
+		
+#方式二(可以运行)
+SELECT * FROM press WHERE pressid = (
+SELECT pressid
+FROM (SELECT pressid,bsortno FROM book GROUP BY pressid,bsortno) temp
+GROUP BY pressid
+ORDER BY COUNT(*) DESC
+LIMIT 0,1);
 
 ######################################################################
 
 #练习8
 #1、建立数据库:test_tour
+CREATE DATABASE IF NOT EXISTS test_tour;
+
+USE test_tour;
 
 #2、建立如下两个表
 #agency旅行社表:
@@ -809,6 +1048,29 @@ WHERE dep.DepName = '网络技术系'
 	Count 					报名人数				INT					YES
 */
 
+#创建旅行社表
+CREATE TABLE agency(
+id INT PRIMARY KEY,
+`name` VARCHAR(20) NOT NULL,
+address VARCHAR(100) NOT NULL,
+areaid INT
+);
+
+DESC agency;
+
+#创建旅行线路表
+CREATE TABLE travel(
+tid INT PRIMARY KEY,
+time VARCHAR(50) NOT NULL,
+`position` VARCHAR(100) NOT NULL,
+money FLOAT,
+aid INT NOT NULL,
+count INT,
+CONSTRAINT fk_tr_aid FOREIGN KEY travel(aid) REFERENCES agency(id)
+);
+
+DESC travel;
+
 #3、添加记录
 #agency表数据
 /*
@@ -824,29 +1086,144 @@ WHERE dep.DepName = '网络技术系'
 	3				8天			水长城			6000		102		11
 */
 
+#向表agency添加记录
+INSERT INTO agency(id,`name`,address) VALUES
+(101,'青年旅行社','北京海淀'),
+(102,'天天旅行社','天津海院');
+
+SELECT * FROM agency;
+
+#向表travel添加记录
+INSERT INTO travel VALUES
+(1,'5天','八达岭',3000,101,10),
+(2,'7天','水长城',5000,101,14),
+(3,'8天','水长城',6000,102,11);
+
+SELECT * FROM travel;
+
 #4、查出旅行线路最多的旅社
+#我做的,分了四步,后一步的代码都包含了前一步的代码
+#第一步:对旅行线路表中的旅行社进行分组
+SELECT aid,COUNT(*) AS c
+FROM travel
+GROUP BY aid
+
+#第二步:在第一步的分组结果中,取旅行社统计数量最大值的数量和id
+SELECT MAX(new.c),new.aid
+FROM (
+			SELECT aid,COUNT(*) AS c
+			FROM travel
+			GROUP BY aid
+			) AS new
+			
+#第三步:从第二步的表中取出旅行社的id
+SELECT maxsheet.aid
+FROM (SELECT MAX(new.c),new.aid
+			FROM (
+						SELECT aid,COUNT(*) AS c
+						FROM travel
+						GROUP BY aid
+						) AS new
+			) as maxsheet;
+
+#第四步:根据第三步取出的旅行社id,在旅行社表中查出旅行社信息
+SELECT *
+FROM agency
+WHERE id = (SELECT maxsheet.aid
+						FROM (SELECT MAX(new.c),new.aid
+									FROM (
+												SELECT aid,COUNT(*) AS c
+												FROM travel
+												GROUP BY aid
+												) AS new
+									) as maxsheet
+						);
+
+#老师给的参考答案
+SELECT *
+FROM agency INNER JOIN (SELECT t.aid,MAX(t.c) FROM (SELECT aid,COUNT(*) AS c FROM travel GROUP BY aid) AS t) temp
+ON agency.id = temp.aid;
 
 #5、查出最热门的旅行线路(也就是查询出报名人数最多的线路)
+#我做的
+SELECT *
+FROM travel
+ORDER BY count DESC
+LIMIT 0,1;
+
+#老师提供的答案
+SELECT *
+FROM travel
+WHERE count = (
+								SELECT MAX(count)
+								FROM travel
+							);
 
 #6、查询花费少于5000的旅行线路
+SELECT *
+FROM travel
+WHERE money < 5000;
 
 #7、找到一次旅行花费最昂贵的旅行社名
+#先找到最贵的费用是多少
+SELECT MAX(money)
+FROM travel;
+
+#再查找最贵费用的旅行社aid							
+SELECT aid
+FROM travel
+WHERE money = (
+								SELECT MAX(money)
+								FROM travel
+								);
+
+#然后根据旅行社aid查找旅行社名称
+SELECT name
+FROM agency
+WHERE id = (
+						SELECT aid
+						FROM travel
+						WHERE money = (
+														SELECT MAX(money)
+														FROM travel
+														)
+						);
+
+#老师给的答案
+SELECT name
+FROM agency
+WHERE id = (
+							SELECT aid
+							FROM travel
+							WHERE money = (
+															SELECT MAX(money)
+															FROM travel
+														)
+						);
 
 #8、查出青年旅社所有的旅行线路都玩一遍需要多少时间
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+#先查出青年旅社的id
+SELECT id
+FROM agency
+WHERE name = '青年旅行社';
+
+#根据旅行社id在线路表进行查找求和
+SELECT SUM(time)
+FROM travel
+WHERE aid = (
+							SELECT id
+							FROM agency
+							WHERE name = '青年旅行社'
+							);
+
+#老师给的答案
+SELECT SUM(time)
+FROM travel
+WHERE aid = (
+							SELECT id
+							FROM agency
+							WHERE name = '青年旅行社'
+						);