|
@@ -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 = '青年旅行社'
|
|
|
+ );
|
|
|
|
|
|
|
|
|
|