一、 MySQL数据库基本操作
1、创建表
#创建数据库
CREATE DATABASE teaching CHARSET utf8;
#贴换teaching为当前数据库
USE teaching;
二、数据表的创建
1、创建学生表
CREATE TABLE IF NOT EXISTS student
(
studentno CHAR(11) NOT NULL COMMENT '学号',
sname CHAR(8) NOT NULL COMMENT '姓名',
sex ENUM('男','女') DEFAULT '男' COMMENT '性别',
birthdate DATE NOT NULL COMMENT '出生日期',
entrance INT(3) NULL COMMENT '入学成绩',
phone VARCHAR(12) NOT NULL COMMENT '电话',
email VARCHAR(22) NOT NULL COMMENT '电子邮件',
PRIMARY KEY(studentno)
);
2、创建课程表
CREATE TABLE IF NOT EXISTS coures
(
courseno CHAR(6) NOT NULL COMMENT '课程编号',
cname CHAR(8) NOT NULL COMMENT '课程名称',
TYPE CHAR(2) NOT NULL COMMENT '类型',
period INT(2) NOT NULL COMMENT '总学时',
expa INT(22) NOT NULL COMMENT '实验学时',
term INT(22) NOT NULL COMMENT '开课学期',
PRIMARY KEY (courseno)
);
3、创建成绩表
CREATE TABLE IF NOT EXISTS score
(
studentno CHAR(11) NOT NULL COMMENT '学号',
courseno CHAR(6) NOT NULL COMMENT '课程编号',
daily FLOAT(3,1) DEFAULT 0 COMMENT '平时成绩',
final FLOAT(3,1) DEFAULT 0 COMMENT '期末成绩',
PRIMARY KEY (studentno,courseno)
);
4、创建老师表
CREATE TABLE IF NOT EXISTS teacher
(
teacherno CHAR(6) NOT NULL COMMENT '教师编号',
tname CHAR(8) NOT NULL COMMENT '教师姓名',
major CHAR(10) NOT NULL COMMENT '专业',
prof CHAR(10) NOT NULL COMMENT '职称',
department CHAR(16) NOT NULL COMMENT '部门',
PRIMARY KEY (teacherno)
);
5、创建老师—课程的关系表
CREATE TABLE IF NOT EXISTS teacher_course
(
teacherno CHAR(6) NOT NULL COMMENT '老师编号',
courseno CHAR(6) NOT NULL COMMENT '课程编号',
PRIMARY KEY (teacherno,courseno)
);
6、创建选课表(sc)
CREATE TABLE IF NOT EXISTS sc
(
sc_no INT(6) NOT NULL AUTO_INCREMENT COMMENT '选课的流水号',
studentno CHAR(11) NOT NULL COMMENT '学号',
courseno CHAR(6) NOT NULL COMMENT '课程编号',
teacherno CHAR(6) NOT NULL COMMENT '老师编号',
sc_time TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '选课时间',
PRIMARY KEY (sc_no)
);
三、修改数据库表
1.给学生表的Email后面添加一个字段,为address
ALTER TABLE student ADD address VARCHAR(30) NOT NULL AFTER Email;
2.删除给学生表刚添加address列
ALTER TABLE student DROP address;
3.修改sc的表名 ->se_course
ALTER TABLE sc RENAME TO se_course;
4.将课程表的类型(type) ->enum类型
ALTER TABLE course MODIFY TYPE ENUM('必修','选修')DEFAULT '必修';
5.创建exampl表
CREATE TABLE IF NOT EXISTS exampl
(
today DATETIME COMMENT '当前时间',
NAME CHAR(20) COMMENT '名称'
);
6.删除exampl表
DROP TABLE exampl;
1、使用insert|replace语句添加多行数据
USE teaching;
INSERT INTO student VALUES
('18122221324','何白露','女','2000/12/4','879','13178978999','heyy@sina.com'),
('18125111109','敬横江','男','2000/3/1','789','15678945623','jing@sina.com'),
('18125121107','梁一苇','女','1999/9/3','777','13145678921','bing@126.com'),
('18135222201','凌浩风','女','2001/10/6','867','15978945645','tang@163.com'),
('18137221508','赵临江','男','2000/2/13','789','12367823453','ping@163.com'),
('19111133071','崔依歌','女','2001/6/6','787','12367823453','ping@163.com'),
('19112100072','宿沧海','男','2002/2/4','658','12545678998','su12@163.com'),
('19112111208','韩山川','男','2001/2/14','666','15878945612','han@163.com'),
('19122203567','封月明','女','2002/9/9','898','13245674564','jiao@126.com'),
('19123567897','赵既白','女','2002/8/4','999','13175689345','pingan@163.com'),
('19126113307','梅惟江','女','2003/9/7','787','13245678543','zhu@163.com');
2、使用replace语句在course表中添加多行数据
REPLACE INTO course VALUES
('c05103','电子技术','必修','64','16','2'),
('c05109','C语言','必修','48','16','2'),
('c05127','数据结构','必修','64','16','2'),
('c05138','软件工程','选修','48','8','5'),
('c06108','机械制图','必修','60','8','2'),
('c06127','机械设计','必修','64','8','3'),
('c06172','铸造工艺','选修','42', '16','6'),
('c08106','经济法','必修','48','0','7'),
('c08123','金融学','必修','40','0','5'),
('c08171','会计软件','选修','32','8','8');
3、演示主键冲突。如果表中已经存在的学号(已设为主键)的记录,再次插入相同的学号,会出现以下”主键冲突”。
4、请说出insert和replace的区别
答:(1)当一个表中存在主键或唯一索引时,该数据已经存在,使用insert插入已有的数据则会出现主键冲突,如果不存在,则会直接插入;
(2)Replace要插入的数据中索引值不同于表中任意一条数据的索引值,就增加一条新的数据,等同于insert,否则,替换原来的数据,等同于先delete再insert;
10.13–MySQL作业
1、将学生表数据整体拷贝到student_copy表
INSERT INTO student_copy SELECT * FROM student;
1.2将学生表整体拷贝一份(表结构、数据)
CREATE TABLE student2 (SELECT *FROM student)
2、利用load data 语句将数据装入数据库中
2.1假如teacher表的数据数据已放在“d:\teacher.txt”中,现将teach.txt的数据插入到teacher表中
LOAD DATA LOCAL INFILE "d:\\teacher.txt" INTO TABLE teacher;
2.2将学科成绩导入score表中
LOAD DATA LOCAL INFILE "d:\\score.txt" INTO TABLE score;
SELECT * FROM score;
2.3利用load data语句输入teach_course表数据
LOAD DATA LOCAL INFILE "d:\\teach_course.txt" INTO TABLE tecach_course;
SELECT * FROM tecach_course;
10.14–MySQL作业
1、创建student表的备份表student01
CREATE TABLE student01 AS SELECT * FROM student;
2、给student01添加”照片”列
ALTER TABLE student01 ADD FIELDS MEDIUMBLOB COMMENT '照片';
表结构如图所示:
3、给两位同学添加照片,一个存储照片路径,一个存储照片本身
3.1 存储照片路径
INSERT INTO student01 VALUES
('18122221329','何影两','女','2001\12\9','877','13178978997','heyy1@sina.com','D:\\picture.jpg');
3.2存储照片本身
INSERT INTO student01 VALUES('18122221329','王康太','女','2001\12\9','877','13178978997','heyy1@sina.com',LOAD_FILE('C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Uploads\\picture.jpg'));
10.20–MySQL作业
1、将学号为18137221508的学生的课程号为c08106的平时成绩daily修改为80分
UPDATE score SET daily=80 WHERE studentno='18137221508' && courseno='c08106';
2课程student01中低于700分的入学成绩增加8&,(1+0.8)=1.8
UPDATE student01 SET entrance=entrance * 1.08 WHERE entrance<700;
3、删除student01表中的入学成绩低于750分的及记录
#查询学生表入学成绩<750的记录
SELECT *FROM student01 WHERE entrance<750;
#删除student01表中的入学成绩低于750分的及记录
DELETE FROM student01 WHERE entrance<750;
4、删除dtudent01表中入学成绩最低的2行记录;
DELETE FROM student01 ORDER BY entrance LIMIT 2;
10.21–MySQL作业
1、手工创建数据库teachingtest_0506
2、创建student02表,表结构如下:
3、修改表student02的主键,添加sname为主键
ALTER TABLE student02 ADD PRIMARY KEY(sname);
4、删除student02的主键,再加
ALTER TABLE student02 DROP PRIMARY KEY;
5、修改表student02的主键,添加studentno为主键
ALTER TABLE student02 ADD PRIMARY KEY (studentno);
10.27–MySQL作业
一、手工创建score表,并添加数据
1.表结构如下:
2.表数据如下:
二、手工创建teacher表,并添加数据
1.表结构如下:
2.表数据如下:
三、手工创建student02表,并添加数据
1.表结构如下:
2.表数据如下:
四、手工创建course01表,并添加数据
1.表结构如下:
2.表数据如下:
五、手工创建teach_course表,并添加数据
1.表结构如下:
2.表数据如下:
六、手工创建se_course表,并添加数据
1.表结构如下:
2.表数据如下:
10.28–MySQL作业
1. 给对score表的studentno定义外键,保证只能输入student02表所存在的"studentno"
1.1. DDL语句
ALTER TABLE score ADD CONSTRAINT fk_st_score
FOREIGN KEY(studentno) REFERENCES student02(studentno);
1.2. 执行成功后:
2. 对score表的courseno定义外键,保证只能输入course01表中所存在的"courseno"
2.1. DDL
ALTER TABLE score
ADD CONSTRAINT fk_con_score
FOREIGN KEY(courseno) REFERENCES course01(courseno);)
2.2执行成功后
一、创建score表
1、代码
CREATE TABLE IF NOT EXISTS score01
(
studentno CHAR(11) NOT NULL COMMENT'学号',
courseno CHAR(6) NOT NULL COMMENT '课程编号',
daily FLOAT(3,1) DEFAULT 0 COMMENT '平时成绩',
final FLOAT(3,1) DEFAULT 0 COMMENT '期末成绩',
PRIMARY KEY (studentno,courseno),
FOREIGN KEY(studentno) REFERENCES student02(studentno) ON UPDATE CASCADE ON DELETE CASCADE,
FOREIGN KEY(courseno) REFERENCES course01(courseno) ON UPDATE CASCADE ON DELETE CASCADE
);
2、表结构
3、restrict含义
(1)score01得数据
(2)去student02表中更改
4、Cascade
(1)score1约束
(2)更改student02被引用数据
11.4作业
1、查询teaching数据库course表中的所有数据库
USE teaching;
SELECT * FROM course;
SELECT courseno,cname,TYPE,period,expa,term FROM course;
2、查询student表中的studentno、sname和phone数据
SELECT studentno,sname,phone FROM student;
3、在student表中查询出生日期在2001年以后的学生的学号、姓名、电话和年龄
SELECT yeay(NOW());
SELECT studentno AS '学号',sname AS '姓名',phone AS '手机号',
YEAR(NOW())-YEAR(birthdate) AS '年龄' FROM student WHERE YEAR(birthdate)>2001;
4.查询哪些学生都选修了课程?
SELECT DISTINCT studentno FROM score;
5、查询表student中入学成绩在800分以上的学生的学号、姓名和电话信息
SELECT studentno,sname,phone FROM student WHERE entrance>800;
MySQL-11.10作业
1查询学号是’18122210009’,‘18122221324’,课程号,平时成绩,期末成绩
1.1 SqL:
SELECT studentno,courseno,daily,final FROM score WHERE studentno IN('18122210009','18122221324');
1.2 截图
2.查询选修了课程号为c05109的学生的学号和期末成绩,并且要求平时成绩在80 到 95 之间
2.1 SQL
SELECT studentno,final FROM score WHERE courseno='c05109' AND daily BETWEEN 80 AND 95;
2.2 截图
3.查询选修了课程号为c05109的学生的学号和期末成绩,并且要求平时成绩不在80 到 95 之间
3.1 SQL
SELECT studentno,final FROM score WHERE courseno='c05109' AND daily NOT BETWEEN 80 AND 95;
3.2 截图为证
4 查询姓王的或者姓韩的,学生信息(姓名,生日,邮箱)
4.1 SQL
SELECT sname,birthdate,email FROM student WHERE sname LIKE '王%' OR sname LIKE ' 韩%';
4.2 截图为证
5. 查询名字里含’风’的
5.1 SQL
SELECT * FROM student WHERE sname LIKE '%风%';
5.2 截图为证
6.查询名字是3个汉字,中间是“山"
6.1 SQL
SELECT * FROM student WHERE sname LIKE '_山_';
6.2 截图为证
MySQL-11.11作业
1查询哪些学生都有成绩(哪些学生参加考试了?
1.1Sql
SELECT studentno FROM se_course WHERE score IS NOT NULL;
1.2查询结果集截图
2 查询成绩表中,期中大于90分,期末成绩高于85的学生的学号、课程编号、成绩
2.1 sql
SELECT studentno,courseno,daily,final FROM score WHERE daily>=90 AND final>=85;
2.2 查询结果集截图
3查询计算机学院,具有高级职称的老师的编号、姓名、专业
3.1 sql
SELECT teacherno,tname,major FROM teacher WHERE department='计算机学院' AND(prof='讲师'OR prof='教师');
3.2 查询结果集截图
4.查询入学成绩>500以上的学生的学号、姓名、入学成绩,并安装入学成绩降序排序
4.1 sql
SELECT studentno 学号,sname 姓名,entrance 入学成绩 FROM student02 WHERE entrance>500 ORDER BY entrance DESC;
4.2 查询结果集截图
5.查询入学成绩>500以上的学生的学号、姓名、入学成绩,并按照入学成绩升序排序
5.1sql
SELECT studentno 学号,sname 姓名,entrance 入学成绩 FROM student02 WHERE entrance>850 ORDER BY entrance ASC;
5.2 查询结果集截图
6查询入学成绩>500以上的学生的学号、姓名、入学成绩,按照入学成绩降序,并按照学号
6.1sql
SELECT studentno 学号,sname 姓名,entrance 入学成绩 FROM student02 WHERE entrance>500 ORDER BY entrance DESC,studentno DESC;
6.2查询结果集截图
7.在score表中查询总评成绩大于70分的学生的学号、课程编号、总评成绩,并按照课程编号升序、再按照总评成绩降序排列
#总评成绩= 期中成绩0.2+期末成绩0.8
7.1sql
SELECT courseno 课程号,daily*0.2+final*0.8 AS '总评',studentno 学号
FROM score WHERE daily*0.2+final*0.8>70 ORDER BY courseno,daily*0.2+final*0.8 DESC;
7.2查询结果集截图
8对score表进行分组,求出各学生平均总评成绩,平均总评成绩保留2位小数
8.1sql
SELECT studentno 学号,ROUND(AVG(daily*0.3+final*0.7),2) AS '平均分' FROM score GROUP BY studentno;
8.2查询结果集截图
MySQL-11.17作业
1.使用group by关键字和group_concat()函数对score表中的studentno字段进行分组查询。可以查看选学该门课程的学生学号。
1.1 SQL
SELECT courseno,studentno,GROUP_CONCAT(studentno) AS "选修该课程的学 号列表" FROM score GROUP BY courseno;
1.2 查询结果集截图
2.查找出选修课程的学生数在2名以上的课程
2.1 SQL
SELECT courseno,GROUP_CONCAT(studentno) AS "选修" FROM score GROUP BY courseno HAVING COUNT(studentno)>=2;
2.2 查询结果集截图
3.查询选课在2门以上且各门课程期末成绩均高于75分的学生的学号及其总成绩,查询结果按总成绩降序列出。
3.1 SQL
SELECT studentno 学号,SUM(daily*0.3+final*0.7) AS '总分' FROM score WHERE final>=75 GROUP BY studentno HAVING COUNT(*) >=2 ORDER BY 总分 DESC;
3.2 查询结果集截图
4. 获取前3条成绩记录
4.1 SQL
SELECT* FROM score LIMIT 0,3; -- 0:偏移量(跳过0条);3:条数
4.2 查询结果集截图
5.获取成绩表的第4、5、6条,者3条记录
5.1 SQL
SELECT* from score LIMIT 3,; -- 跳过前3条,取3条
5.2 查询结果集截图
6.查询score表中,期末成绩final高于70分的,按照平时成绩daily进行升序排列,从编号2开始,查询5条记录
6.1 SQL
SELECT * FROM score WHERE final>=70 ORDER BY daily ASC LIMIT 2,5;
6.2 查询结果集截图
7. 查询目前所有学生的期末总分
7.1 SQL
SELECT SUM(final) AS '期末总分' FROM score;
7.2 查询结果集截图
8. 获取目前所有学生的期末最高分
8.1 SQL
SELECT MAX(final) AS '期末最高分' FROM score;
8.2 查询结果集截图
9获取目前所有学生的期末最低分
9.1 SQL
SELECT MIN(final) AS '期末最低分' FROM score;
9.2 查询结果集截图
10获取目前有多少个学生有成绩
10.1 SQL
SELECT COUNT(*) AS '选修课程学生总数' FROM score;
10.2 查询结果集截图
11. 获取目前所有学生的平均期末成绩
11.1 SQL
SELECT AVG(final)AS '期末平均成绩' FROM score;
11.2 查询结果集截图
12. 通过查询求18级学生的总数
12.1 SQL
#方案一:
SELECT COUNT(studentno) AS '18级学生数' FROM student2 WHERE SUBSTRING(studentno,1,2)='18'; -- 1:从第一位开始截取;2:截取个数
#方案二:
SELECT COUNT(studentno) AS '18级学生数' FROM student2 WHERE studentno LIKE'18%';
12.2 查询结果集截图
MySQL-11.18作业
1.查询score表中学生的期末总成绩大于100分的学生学号、总期末成绩及平均期末成绩。
1.1 SQL
SELECT studentno,AVG(final) AS '期末平均成绩',SUM(final) AS '期末总成绩'
FROM score
GROUP BY studentno
HAVING SUM(final)>100;
1.2 查询结果集
2.查询选修课程号为c05109号课程的期末最高分、最低分及之间相差的分数。
2.1 SQL
SELECT MAX(final) 最高分,
MIN(final) 最低分,
MAX(final)-MIN(final) AS 分差
FROM score
WHERE (courseno='c05109');
2.2 查询结果集
3.查询score表中每一门课的期末平均值和所有成绩的平均值以及所有科目的期中、期末平均分
3.1 SQL
SELECT courseno,AVG(daily) AS 期末平均分,
AVG(daily) AS 期末平均分
FROM score
GROUP BY courseno WITH ROLLUP;
3.2 查询结果集
4.查询选修课程号为c05109的学生的学号、姓名和期末成绩。
– 内联
– 方案1
4.1 SQL
SELECT student.studentno,sname,final
FROM student
INNER JOIN score
ON student.studentno=score.studentno
WHERE score.courseno='c05109';
4.2 查询结果集
– 方案2
4.3 SQL
SELECT student.studentno,sname,final
FROM student,score
WHERE student.studentno=score.studentno
AND score.courseno='c05109';
4.4 查询结果集