mysql笔记

mysql笔记

实验一

1:学会使用MySQL语句创建数据库、创建表、使用主键约束、外键约束、添加常用约束

2:学会使用MySQL语句查看表结构与修改表名、修改字段名与字段数据类型、添加与删除字段、修改字段的排列位置、删除表的外键约束

3:学会使用MySQL语句插入数据、更新数据、删除数据

**二、**实验内容:

1.1: 在命令行中连接MySQL,并创建一个名为MyDb的数据库。

mysql -uroot -p123123 -h127.0.0.1 #连接MySQL

create database MyDb;
show databases;

1.2: 在命令行中操作,创建数据库TestDb,在TestDb下创建表t_emp,表结构如下:

mysql笔记_第1张图片

USE TestDb;

CREATE TABLE t_emp ( id INT, name VARCHAR(32), deptId INT, salary FLOAT);

1.3: 在数据库MyDb中,创建两张表t_user1,t_user2,表结构如下,请为两张表分别创建主键约束,t_user1的主键为userId,t_user2的主键为联合主键,将字段name和phone作为t_user2的联合主键。

mysql笔记_第2张图片
mysql笔记_第3张图片

use MyDb;

CREATE TABLE t_user1(userId int primary key,name varchar(32),password varchar(11), phone varchar(11), email varchar(32));

CREATE TABLE t_user2(name varchar(32), phone varchar(11), email varchar(32),primary key(name,phone));` 

1.4: 创建两张表如下,给t_student表添加外键约束,外键为classId,外键名称为fk_stu_class1。

mysql笔记_第4张图片
mysql笔记_第5张图片

use MyDb;

create table t_class(id int primary key,name varchar(22));

create table t_student(id int primary key,name varchar(22),classId int,constraint fk_stu_class1 foreign key(classId) references t_class(id));

1.5: 在数据库MyDb中创建表t_user,表结构如下:

mysql笔记_第6张图片

use MyDb;

create table t_user(id int primary key auto_increment, username varchar(32) not null UNIQUE, sex varchar(4) default '男') default charset=utf8;

2.1: 根据提示,在编辑器补充代码:

l 把数据表tb_emp改名为jd_emp;

l 查看该数据库下数据表的列表;

l 查看数据表jd_emp的基本结构。

USE company;

alter table tb_emp rename to jd_emp;

show tables;

desc jd_emp;

2.2: 根据提示,在编辑器补充代码:

l 把数据表tb_emp的字段Id改名为prod_id,数据类型不变;

l 把数据表tb_emp字段Name的数据类型改为varchar(30)。

数据表结构如下:

mysql笔记_第7张图片

USE Company;

alter table tb_emp change Id prod_id int(11);

alter table tb_emp modify Name varchar(30);

2.3: 根据提示,在编辑器补充代码:

l 在数据表tb_emp的Name字段后添加字段Country,数据格式为varchar(20);

l 删除数据表tb_emp中的字段Salary。

数据表结构如下:

mysql笔记_第8张图片

USE company;

alter table tb_emp add Country varchar(20) after name;

alter table tb_emp drop Salary;

2.4: 根据提示,在编辑器补充代码:

l 将数据表tb_emp的Name字段移至第一列,数据格式不变;

ALTER table tb_emp MODIFY Name VARCHAR(25) FIRST;

l

l 将DeptId字段移至Salary字段的后边,数据格式不变。

ALTER table tb_emp MODIFY DeptId INT(11) AFTER Salary;

数据表结构如 2.3 中图片所示:

2.5: 我们已经为你建立了主表tb_dept和子表tb_emp,在表tb_emp上添加了名称为emp_dept的外键约束,外键名称为DeptId,依赖于表tb_dept的主键Id,下面那是两张表的结构展示:

mysql笔记_第9张图片

请你根据提示,在编辑器Begin-End中补充代码:

l 删除数据表tb_emp的外键约束emp_dept。

ALTER table tb_emp DROP FOREIGN KEY emp_dept;

3.1: 我们为你新建了一个空数据表tb_emp,请你为它同时添加3条数据内容。空数据表结构如下,注意字段3 为DeptId,倒数第二个字母为大写的i:

mysql笔记_第10张图片

需要你同时添加的数据内容为:(注意,是同时插入多条记录)

mysql笔记_第11张图片

INSERT INTO tb_emp(Id,Name,DeptId,Salary)VALUES (1,'Nancy',301,2300),(2,'Tod',303,5600),(3,'Carly',301,3200);

3.2: 我们为你新建了一个数据表tb_emp,并添加了3条数据内容。3条数据内容如下表所示:

mysql笔记_第12张图片

l 请你将Carly改为Tracy,相应的,301改为302,3200.00改为4300.00。

UPDATE tb_emp SET Name='Tracy',DeptId=302,Salary=4300 WHERE id=3;

3.3: 请你将3.2图中Salary大于3000的数据行删除。

DELETE FROM tb_emp WHERE Salary>3000;

三、实验步骤:

1、mysql -uroot -p123123 -h127.0.0.1 #连接MySQL
​`create database MyDb;`
​`show databases;`
2、USE TestDb;
CREATE TABLE t_emp ( id INT, name VARCHAR(32), deptId INT, salary FLOAT);
3、use MyDb;
CREATE TABLE t_user1(userId int primary key,name varchar(32),password varchar(11), phone varchar(11), email varchar(32));
CREATE TABLE t_user2(name varchar(32), phone varchar(11), email varchar(32),primary key(name,phone)); 
4、use MyDb;create table t_class(id int primary key,name varchar(22));
create table t_student(id int primary key,name varchar(22),classId int,constraint fk_stu_class1 foreign key(classId) references t_class(id));
5、create table t_user(id int primary key auto_increment, username varchar(32) not null unque, sex varchar(4) default '男') default charset=utf8;
二、
1、USE company;
alter table tb_emp rename to jd_emp;
 show tables; 
 desc jd_emp;
 2、USE Company;alter table tb_emp change Id prod_id int(11);
 alter table tb_emp modify Name varchar(30);
 3、USE company;alter table tb_emp add Country varchar(20) after name;alter table tb_emp drop Salary;
 4、ALTER table tb_emp MODIFY Name VARCHAR(25) FIRST;
 ALTER table tb_emp MODIFY DeptId INT(11) AFTER Salary;
 5、ALTER table tb_emp DROP FOREIGN KEY emp_dept;
 三、
 1、INSERT INTO tb_emp(Id,Name,DeptId,Salary)VALUES (1,'Nancy',301,2300),(2,'Tod',303,5600),(3,'Carly',301,3200);
 2、UPDATE tb_emp SET Name='Tracy',DeptId=302,Salary=4300WHERE id=3;
 3、DELETE FROM tb_emp WHERE Salary>3000;

实验二

1:观察查询结果, 体会SELECT语句实际应用。

2:熟练掌握简单表的数据查询、数据排序和数据连接查询的操作方法。

3:熟练掌握表的复杂查询。

**二、**实验内容:

1: 我们为你新建了一个数据表tb_emp,结构如下:

mysql笔记_第13张图片

a) 请你查询字段Name和Salary的内容;

SELECT Name,SalaryFROM tb_emp;

b) 请你查询整张表的内容

SELECT *FROM tb_emp;

c) 请你查询当Id不等于1时,字段Name和Salary的内容;

SELECT Name,Salary FROM tb_emp WHERE id!=1;

d) 请你查询当字段Salary范围在3000~5000时,字段Name和Salary的内容。

SELECT Name,Salary FROM tb_emp WHERE Salary BETWEEN 3000 AND 5000;

2.1 我们为你新建了一个数据表tb_emp,结构同题 1 中所示。

a) 请你查询所有Name以字母C为起始的员工的Name和Salary的内容;

SELECT Name,Salary FROM tb_emp WHERE Name LIKE "C%";

2.2 我们为你新建了一个数据表tb_emp,内容如下:

mysql笔记_第14张图片

a) 使用关键字IS NULL返回数据表中字段DeptId为NULL的所有字段的内容,注意,返回的是指定行所有字段的内容;

 SELECT *  FROM tb_emp  WHERE DeptId IS NULL;

b) 使用关键字DISTINCT返回数据表中字段Name不重复的内容,注意,只需返回字段Name的内容。

  SELECT DISTINCT Name  FROM tb_emp;

2.3 我们为你新建了一个数据表tb_emp,结构同题 1 中所示。

a) 使用关键字AND返回数据表中字段DeptId为301并且薪水大于3000的所有字段的内容,其中DeptId的倒数第二个字母为i的大写;

 SELECT *  FROM tb_emp  WHERE DeptId LIKE "301" AND Salary>3000;

b) 使用关键字IN返回数据表中字段DeptId为301和303的所有字段的内容。

  SELECT *  FROM tb_emp  WHERE DeptId IN("301","303");

3.1 我们已经为你提供了学生成绩表:

tb_score表数据:

mysql笔记_第15张图片

a) 查询学生成绩表中1班同学的所有信息并以成绩降序的方式显示结果。

SELECT * FROM tb_score WHERE class_id =1 ORDER BY score DESC;

3.2 我们已经为你提供了班级表信息:

tb_class表数据:

mysql笔记_第16张图片

a) 对班级表中的班级名称进行分组查询

SELECT * FROM tb_class GROUP BY class_id;

3.3 我们已经为你提供了学生成绩表:

tb_score表数据:

mysql笔记_第17张图片

a) 查询班级中第2名到第5名的学生信息,并根据学生成绩进行降序排序。

SELECT * FROM tb_score ORDER BY score DESC LIMIT 1,4;

4.1 我们为你提供了两张表,内容如下:

tb_student表数据:

mysql笔记_第18张图片

tb_class表数据:

mysql笔记_第19张图片

a) 查询数据表中学生姓名以及对应的班级名称,将其对应的列名分别另命名为studentName和className。

SELECT stu.name studentName,cla.name className FROM tb_student stu join tb_class cla on stu.class_id=cla.id;

b) 分别使用左外连接和右外连接查询数据表中所有学生姓名和对应的班级名称,查询结果列分别另命名为studentName和className。(注意:请使用 tb_student 作为左表,tb_class 作为右表。)

SELECT stu.name studentName,cla.name className FROM tb_student stu left join tb_class cla on stu.class_id=cla.id;
SELECT stu.name studentName,cla.name classNameFROM tb_student stu right join tb_class cla on stu.class_id=cla.id;

4.2 我们为你提供了两张表,内容如下:

tb_student表数据:

mysql笔记_第20张图片

tb_class表数据:

mysql笔记_第21张图片

a) 查询所有班级里分数在90分以上的学生的姓名和学生的成绩以及学生所在的班级,其中学生的姓名和学生所在班级分别另命名为studentName和className。

SELECT stu.name studentName,stu.score,cla.name classNameFROM tb_student stu join tb_class cla on stu.class_id=cla.idWHERE score>90ORDER BY score DESC;

5.1 我们为你提供了tb_emp表,数据如下:

mysql笔记_第22张图片

a) 查询大于所有平均年龄的员工姓名与年龄。

SELECT name,ageFROM tb_empWHERE age>(SELECT AVG(age) FROM tb_emp);

5.2 我们为你提供了如下数据表:

tb_salary表数据:

mysql笔记_第23张图片

a) 查询薪资表中比Java最高工资高的所有员工职位名称和薪资;

SELECT position,salaryFROM tb_salaryWHERE salary>ALL(SELECT salary FROM tb_salary WHERE position="Java");

b) 查询薪资表中比Java最低工资高的所有员工职位名称和薪资;

SELECT position,salaryFROM tb_salaryWHERE salary>ANY(SELECT salary FROM tb_salary WHERE position="Java");

c) 查询薪资表中职位为Java的所有员工职位名称和薪资。

SELECT position,salaryFROM tb_salaryWHERE position IN("Java");

6 根据提供的表和数据:

mysql笔记_第24张图片
mysql笔记_第25张图片
mysql笔记_第26张图片
mysql笔记_第27张图片

a) 查询平均成绩小于60分的同学的学生编号(s_id)、学生姓名(s_name)和平均成绩(avg_score),要求平均成绩保留2位小数点。(注意:包括有成绩的和无成绩的)

SELECT stu.s_id,stu.s_name,ROUND(AVG(sco.s_score),2) as avg_scoreFROM student stu join score sco on stu.s_id=sco.s_id GROUP BY sco.s_id,stu.s_id HAVING avg_score<60union SELECT stu.s_id,stu.s_name,0 as avg_score FROM student as stuWHERE stu.s_id not in(SELECT distinct s_id FROM score);

b) 查询与s_id=01号同学学习的课程完全相同的其他同学的信息(学号s_id,姓名s_name,性别s_sex)。

SELECT * FROM student stuWHERE NOT EXISTS (  SELECT s_id FROM course cou  WHERE NOT EXISTS (​    SELECT c_id FROM score sco ​    WHERE stu.s_id=sco.s_id AND cou.c_id=sco.c_id  ))AND s_id<>"01";//第二种select * from student where s_id in (select s_id from score where c_id in(select c_id from score where s_id="01")group by s_id having count(*)=(select count(*) from score where s_id="01") and s_id!="01");

c) 查询各科成绩,进行排序并显示排名,按学生编号(s_id)、课程编号(c_id)、学生成绩(s_score)和排名(rank)进行输出,具体效果请查看测试集。

select a.* ,count(b.s_score)+1 rank from score a left join score bon a.c_id = b.c_id and a.s_score < b.s_scoregroup by a.c_id,a.s_idorder by a.c_id,count(b.s_score);

d) 查询选修“张三”老师所授课程的学生中,成绩最高的学生信息(具体输出信息请查看测试说明)及其成绩。

select a.*,b.s_score,b.c_id,c.c_name from student aINNER JOIN score b ON a.s_id = b.s_idINNER JOIN course c ON b.c_id=c.c_idwhere b.c_id =(select c_id from course c,teacher d where c.t_id=d.t_id and d.t_name='张三')and b.s_score in (select MAX(s_score) from score where c_id='02');

e) 查询两门及其以上不及格课程的同学的学号(s_id)、姓名(s_name)及其平均成绩(avg_score),要求计算平均成绩后为整数。

select a.s_id,a.s_name,ROUND(AVG(b.s_score)) avg_score from student aINNER JOIN score b ON a.s_id = b.s_idwhere a.s_id in (select s_id from score where s_score<60 GROUP BY s_id having count(*)>=2)GROUP BY a.s_id,a.s_name; 

7.1 我们为你提供了一张tb_class表,内容如下:

mysql笔记_第28张图片

根据此表数据:

a) 查询该表中一共有多少条数据;

select count(*) from tb_class;

b) 查询此表中367 班有多少位学生,以班级id和对应人数格式输出。

select count(*) from tb_class;

7.2 我们为你提供了一张tb_class表,内容如下:

mysql笔记_第29张图片

根据此表数据:

a) 查询该表中学生的总成绩。

select sum(score) from tb_class;

b) 查询学生语文课程的总分数。

select course,sum(score) from tb_class where course="语文";

c) 查询表中该班级三位同学语文和英语课程的平均分数以及对应的课程名。

select course,avg(score) from tb_classwhere course="语文";select course,avg(score) from tb_classwhere course="英语";

d) 分别查询语文和英语课程中的最高分数

select course,max(score) from tb_class where course="语文";

select course,max(score) from tb_class

where course=“英语”;

e) 分别查询语文和英语课程中的最低分数。

select course,min(score) from tb_class where course="语文"; select course,min(score) from tb_class where course="英语";

8.1 对年级Id和性别进行分组,分别统计表中2、3、4年级的男生总人数和女生总人数。

student表数据结构如下:
mysql笔记_第30张图片

要求输出结果显示如下

mysql笔记_第31张图片

select gradeId,sex,count(*) from studentgroup by gradeId,sex limit 1,4;

8.2 给定数据表tb_grade格式如下:
mysql笔记_第32张图片

a) 我们要评选三好学生,条件是至少有两门课程在90分以上(包括90分)才能有资格,请列出符合的学生的学号(sno)及其90分以上(包括90分)科目总数;

select sno,count(*) from tb_grade where score>=90 group by sno having count(*)>=2;

b) 学校评选先进学生,要求平均成绩大于90分(包括90分)的学生都有资格,并且语文课必须在95分以上(包括95分),请列出有资格的学生的学号(sno)及其科目的平均分。

select sno,avg(score) from tb_gradewhere sno in (select sno from tb_grade where pno="语文"and score>=95)group by sno having avg(score)>90 ;

实验三

(1)掌握创建视图的SQL语句的用法。

(2)掌握修改视图的方法。

(3)熟悉视图更新与基本表更新的区别与联系;认识视图的作用。

(4)熟悉索引的作用,以及不同类型索引的区别。

(5)学会用SQL语句对表创建和删除索引

二、实验内容步骤:

建立的名为school的数据库,在数据库中添加如书本79、80页的student,course,sc三张表,并添加数据

,然后完成以下实验内容:

(1)用SQL语句,定义信息系学生基本情况视图V_IS。

CREATE VIEW V_IS AS SELECT * FROM student WHERE Sdept='IS';

(2)用SQL语句,将Student,Course 和SC表中学生的学号,姓名,课程号,课程名,成绩定义为视图V_S_C_G。

CREATE VIEW V_S_C_G AS SELECT student.Sno,student.Sname,course.Cno,course.Cname,SC.Grade FROM student,course,SC WHERE student.Sno=SC.SnoAND course.Cno=SC.Cno;

(3)用SQL语句,将各系学生人数,平均年龄定义为视图V_NUM_AVG。

CREATE VIEW V_NUM_AVG(A_num,A_age) AS SELECT COUNT(*),AVG(Sage) FROMstudent GROUP BY Sdept;

(4)用SQL语句,定义一个反映学生出生年份的视图V_YEAR。

CREATE VIEW V_YEAR (Sno,Sname,Sbirth)AS SELECT Sno,Sname,2020-SageFROM student;

(5)用SQL语句,将各位学生学号、选修课程的门数及平均成绩定义为视图V_AVG_S_G。

CREATE VIEW V_AVG_S_G(Sno,Num_of_course,A_grade) AS SELECT Sno,COUNT(*),AVG(Grade)FROM SC GROUP BY Sno;

(6)用SQL语句,将各门课程的课程号、选修人数及平均成绩定义为视图V_AVG_C_G。

CREATE VIEW V_AVG_C_G(Cno,Num_of_student,A_grade) AS SELECT Cno,COUNT(*),AVG(Grade)FROM SC GROUP BY Cno;

(7)用SQL语句完成以下视图操作,查看结果,并分析原因。

①通过视图V_IS,将学号为“201215125”的学生姓名更改为“张小立”,并查看结果;

UPDATE V_IS SET Sname='张小立' WHERE Sno='201215125';

②通过视图V_IS,新增加一个学生记录 (‘201215126’,‘黄笑’,19, ‘男’,‘IS’),并查看结果。

INSERT INTO V_IS VALUES('201215126','黄笑','男',19,'IS');

在这里插入图片描述

③通过视图V_IS,新增加一个学生记录 (‘201215127’,‘李霞’,19, ‘女’,‘MA’),并查看结果。

INSERT INTO V_IS VALUES('201215127','李霞', '女',19,'MA');

在这里插入图片描述

mysql笔记_第33张图片

④通过视图V_IS,删除学号为“201215126”的学生信息,并查看结果。

DELETE FROM V_IS WHERE Sno='201215126';

在这里插入图片描述

mysql笔记_第34张图片

⑤通过视图V_S_C_G,将学号“201215122”的姓名改为“刘晓晨”,能否实现?若无法实现说明原因。

UPDATE V_S_C_G SET Sname='刘晓晨' WHERE Sno='201215122';

可以实现,因为它是不允许更新的视图,它的系统不支持更新但仍可能可更新

mysql笔记_第35张图片

⑥通过视图V_AVG_S_G,将学号“201215121”的平均成绩改为90,能否实现?若无法实现说明原因。

UPDATE V_AVG_S_G SET A_grade=90 WHERE Sno='201215121';

不能实现,因为对这个视图的更新无法转换成对基本表的更新,是不可更新视图,且用到group by

⑦修改视图V_IS定义,添加WITH CHECK OPTION语句,然后用update语句修改“201215125”的学生所在系,改为’MA’, 能否实现?若无法实现说明原因。

ALTER VIEW V_IS AS SELECT * FROM student WHERE Sdept='IS'WITH CHECK OPTION;

UPDATE V_IS SET Sdept=‘MA’ WHERE Sno=‘201215125’;无法实现,因为有WITH CHECK OPTION后视图进行增删改关系数据库管理系统会自动加上Sdept='IS的条件,update命令会操作不兼容报错

(8)写出SQL语句:利用表和前面所建视图,查询平均成绩为86分以上的学生学号、姓名和成绩;

SELECT Sno,Sname,Grade FROM V_S_C_G WHERE Sno IN (SELECT Sno FROM V_S_C_G GROUP BY Sno HAVING AVG(Grade)>86);

(9)写出SQL语句:利用表和前面所建视图,查询成绩大于课程平均成绩的学生学号、课程号和成绩;

mysql笔记_第36张图片在这里插入图片描述

SELECT SC.Sno,SC.Cno,SC.Grade FROM SC,V_AVG_C_G WHERE Sno IN(SELECT Sno WHERE SC.Cno=V_AVG_C_G.Cno HAVING SC.Grade>V_AVG_C_G.A_grade);

在这里插入图片描述

(10)写出SQL语句:利用表和前面所建视图,按系分组统计平均成绩80分以上的人数,按降序排列。

SELECT Sdept,COUNT(*) FROM Student  WHERE Sno IN (SELECT k.Sno FROM  V_S_C_G k GROUP BY k.Sno HAVING AVG(Grade)>80) GROUP BY Sdept;

在这里插入图片描述

(11)为student表创建一个复合索引i_sdept_sno,以院系升序、学号降序

CREATE INDEX i_sdept_sno ON student(Sdept ASC,Sno DESC);

(12)在student表的sname列上建立普通降序索引。

CREATE INDEX i_Sname ON student(Sname DESC);

(13)在course表的cname列上建立唯一索引。

CREATE UNIQUE INDEX i_Cname ON Course(Cname);

(14)删除索引i_sdept_sno。

DROP INDEX i_sdept_sno ON student;

实验四

(1)掌握数据库约束的概念;

(2)熟悉MySQL 的完整性约束技术。

(3)了解MySQL 的违反完整性处理措施。

(4)了解登录账户的管理理念与具体方法。

(5)了解数据库用户的管理的要则。

(6)了解用户权限管理的内涵与方法。

二、实验内容与步骤***

*1. 测试完整性*

运行附录中的SQL语句,理解SQL语句中包含的完整性定义。然后执行下面的SQL语句,说明是否能正常运行,若无法执行,请说明原因。

*(1)**对dept表进行数据增删改,并检查完整性规则*

Dept的定义如下:

create table Dept(dno CHAR(2)  PRIMARY KEY,dname VARCHAR(20) NOT NULL UNIQUE);

*增加数据**:*

INSERT INTO dept VALUES('D1','计科系');——正常运行INSERT INTO dept VALUES('D2','电信系');——正常运行INSERT INTO dept VALUES(NULL,'机械系');——违反主键dno不能为空的规则

*原因*:不能将值NULL插入列‘dno’,表‘dept’;列不允许有NULL值。Insert失败,语句已终止。

INSERT INTO dept VALUES('D2','机械系');——违反主键dno中UNIQUE 

****原因:****违反了主键约束,因为主键自动定义了UNIQUE,不能插入重复键。

INSERT INTO dept VALUES('D3',NULL);——违反dname不能为空的规则

****原因:****不能将值NULL插入列‘dname’,表‘dept’;列不允许有NULL值。Insert失败,语句已终止。

INSERT INTO dept VALUES('D3','计科系');——违反dname中UNIQUE

****原因:****违反了约束,因为定义了UNIQUE,不能插入重复键。

INSERT INTO dept VALUES('D3','机械系');——正常运行

*删除数据**:*

DELETE FROM dept WHERE dno='D3';——正常运行

*修改数据**:*

UPDATE dept SET dname='计算机科学系' WHERE dno='D1';——正常运行UPDATE dept SET dname='电信系' WHERE dno='D1';——违反dname中UNIQUE

****原因:****违反了约束,因为定义了UNIQUE,不能插入重复键。

UPDATE dept SET dname=NULL WHERE dno='D1';——违反dname不能为空的规则

****原因:****不能将值NULL插入列‘dname’,表‘dept’;列不允许有NULL值。UPDATE失败,语句已终止。

*(**2**)**对student表进行数据增删改,并检查完整性规则*

Student的定义如下:

create table Student(sno CHAR(2) PRIMARY KEY,sname VARCHAR(20) NOT NULL,ssex CHAR(2) NOT NULL CHECK(ssex in('男','女')),sage INT NOT NULL,dno CHAR(2) NOT NULL, FOREIGN KEY (dno) REFERENCES dept(dno) ON DELETE CASCADE ON UPDATE CASCADE);

*增加数据**:*

INSERT INTO student VALUES('S1','张刚','男',20,'D1');——正常运行INSERT INTO student VALUES('S2','李梅','女',21,'D2');——正常运行INSERT INTO student VALUES('S2','吴敏','男',20,'D1');——违反了主键sno的UNIQUE

****原因:****违反了主键约束,因为主键自动定义了UNIQUE,不能插入重复键。

INSERT INTO student VALUES(NULL,'吴敏','男',20,'D1');

——违反了主键sno不能为空的原则

*原因*:不能将值NULL插入列‘sno’,表‘student’;列不允许有NULL值。Insert失败,语句已终止。

INSERT INTO student VALUES('S3','吴敏','男',NULL,'D1');

——违反了sage不能为空的原则

****原因:****不能将值NULL插入列‘sage’,表‘student’;列不允许有NULL值。INSERT失败,语句已终止。

INSERT INTO student VALUES('S3','吴敏','M',20,'D1');

****原因:****违反CHECK规则,INSERT语句与CHECK约束冲突,导致语句已终止。

INSERT INTO student VALUES('S3','吴敏','男',20,'D3');

****原因:****无法添加或更新子行:外键约束失败

INSERT INTO student VALUES('S3','吴敏','男',20,'D1');

——正常运行

*删除数据**:*

DELETE FROM student WHERE sno='S3';

——正常运行

*修改数据**:*

UPDATE student SET sname='赵强',dno='D2' WHERE sno='S1'; ——正常运行UPDATE student SET ssex='F' WHERE sno='S1'; ——违反了ssex的CHECK规则

****原因:****有约束冲突。

UPDATE student SET sno='S2' WHERE sno='S1'; 

——违反了主键sno的UNIQUE

****原因:****违反了主键约束,因为主键自动定义了UNIQUE,不能插入重复键。

UPDATE student SET dno='D3' WHERE sno='S1';

——违反了dno的外键规则

****原因:****无法添加和更新子行,外键约束失败。

UPDATE dept SET dno='D3' WHERE dno='D1';

​ 检查dno的外键ON UPDATE规则,观察运行后效果。——正常运行

在这里插入图片描述

DELETE FROM dept WHERE dno='D2';

​ 检查dno的外键ON DELETE规则,观察运行后效果。

****——****正常运行

在这里插入图片描述

*2. 测试数据库安全性*

*(1)**创建账户并授予权限。*

以root连接数据库,创建数据库dbtest,并在dbtest下创建表tbtest。创建账户usertest,设置登录口令为 123456 。

create database dbtest;use dbtest;create table tbtest(sno int, sname varchar(10));create user usertest@'localhost' identified by '123456'; 

以账户usertest连接数据库,测试对表tbtest的select权限,如果没有权限,请授予相应的权限。

GRANT SELECT ON dbtest.tbtest TO 'usertest'@'%' IDENTIFIED BY '123456';

以账户usertest连接数据库,测试对表tbtest的insert权限,如果没有权限,请授予相应的权限。

GRANT INSERT ON dbtest.tbtest TO 'usertest'@'%' IDENTIFIED BY '123456';

以账户usertest连接数据库,测试对表tbtest的update权限,如果没有权限,请授予相应的权限。

GRANT UPDATE ON dbtest.tbtest TO 'usertest'@'%' IDENTIFIED BY '123456';

以账户usertest连接数据库,试运行use dbtest; create table tbtest1,如果没有权限,请授予相应的权限。

GRANT CREATE ON dbtest.* TO 'usertest'@'%' IDENTIFIED BY '123456';

以账户usertest连接数据库,试运行create database dbtest1,如果没有权限,请授予相应的权限。

GRANT CREATE ON dbtest1.* TO 'usertest'@'%' IDENTIFIED BY '123456';

回收用户usertest的所有权限。

REVOKE SELECT ON dbtest.* FROM usertest@'%';REVOKE CREATE ON dbtest1.* FROM usertest@'%';REVOKE CREATE ON dbtest.* FROM usertest@'%';REVOKE SELECT,CREATE,UPDATE,INSERT ON dbtest.tbtest FROM usertest@'%';

*(**2**)**数据库角色的使用。*

*以root连接数据库,创建数据库角色role**1**。*

CREATE ROLE role1;

在这里插入图片描述

*授予数据库角色(role1)在数据库dbtest上对所有表的权限*

GRANT ALL ON dbtest.* TO 'role1';

*授予数据库账户(usertest)角色(role1)**。*

GRANT role1 TO usertest@localhost;

在这里插入图片描述

*回收数据库账户(usertest)角色(role1)**。*

REVOKE 'role1' FROM 'usertest'@'localhost';

*删除数据库角色(role1)**。*

DROP role 'role1';

*删除用户(usertest)**。*

DROP USER 'usertest'@'localhost';

三、实验总结***

Role的操作要在mysql版本8.0以上才能用

要注意@后面是’%’还是’localhost’。

实验五

(1)了解存储过程的概念

(2)掌握创建、执行存储过程的方法

(3)了解查看、修改和删除存储过程的方法

(4)了解触发器的概念

(5)掌握创建、查看与删除触发器的方法

**二、**实验内容与步骤:

创建数据库"shiyan5",进入"shiyan5"并根据课本 例3.5、例3.6、例3.7 创建表Student、Course、SC 并添加 图3.2(a) (b) © 中对应的数据。

*(一)存储过程*

1.创建一个名为 query1 的存储过程,完成的功能是:在Student表中查询系号为"CS"的学生信息(使用select *)。(20分)

DELIMITER //  CREATE PROCEDURE query1()BEGIN SELECT *from student where Sdept="CS";  END;//DELIMITER ;

2.创建一个名为 query2 的存储过程,完成的功能是:根据传入的学生编号,在 SC 表中查询该学生对应平均成绩的段位,并将学号和对应段位(Lv)输出(select Sno, Lv)。(20分)

段位设定:

PLATINUM (Grade>=90)GOLD (80<= Grade <90)SILVER(Grade <80)t(11))Begin   declare Lv varchar(20);  declare AvgGrade float;  select avg(Grade) into AvgGrade   from SC  where Sno= Sno_  group by Sno;  IF AvgGrade > 90 THEN​    SET Lv='PLATINUM';  ELSEIF (AvgGrade >=80 AND AvgGrade <90) THEN​    SET Lv='GOLD';  ELSEIF AvgGrade<80 THEN​    SET Lv='SILVER';  END IF;  select distinct Sno, Lv from SC where Sno=Sno_;END //delimiter ;call query2("201215121");

3.创建一个名为 query3 的存储过程,完成的功能是:根据传入的学生编号,在Student表中查询此学生信息(使用select *)。使用存储过程 query3 查询学号为"201215121"的学生信息。(20分)

DELIMITER //  CREATE PROCEDURE query3(IN ss char(9))BEGINSELECT *from studentwhere Sno = ss;END;//DELIMITER ; call query3("201215121");

4.在数据库"shiyan5"中查询我们已经创建过的存储过程,并查看存储过程 query3 的定义。(5分)

SHOW PROCEDURE STATUS WHERE db='shiyan5';SHOW CREATE PROCEDURE query3;  5.将存储过程 query3 删除。(5分)DROP PROCEDURE query3;

*(二)触发器*

1.创建一个BEFORE触发器,要求实现以下功能:在 SC 表上创建一个插入类型的触发器,名为 t1,当要插入的记录中Grade值大于100时,将Grade的值置为100并插入;当要插入的记录中Grade值小于0时,将Grade的值置为0并插入。(20分)

DELIMITER //  CREATE TRIGGER t1 BEFORE INSERT ON SC FOR EACH ROWBEGINIF NEW.Grade < 0 THENSET NEW.Grade = 0;ELSEIF NEW.Grade > 100 THENSET NEW.Grade = 100;END IF;END //  DELIMITER ;

2.查看当前数据库的全部触发器,并查看触发器 t1 的定义。(5分)

SHOW TRIGGERS;SHOW CREATE TRIGGER t1;

3.删除触发器 t1。(5分)

DROP TRIGGER t1;

你可能感兴趣的:(mysql,数据库,database)