MySQL总纲1

数据库是按照一定格式存储数据的一些文件的组合。

   实际上是一堆文件,这些文件存储了具有特定格式的数据。

数据库管理系统 DataBaseManagement 简称DBMS。

管理数据库中的数据,可以对其进行增删改查。

SQL是结构化查询语言  定义了操作所有关系型数据库的规则                      DBMS--执行--SQL--操作--DB

常用命令  退出MySQL  exit  查看有哪些数据库  show databases;  注意以分号结尾,英文状态

                   使用时某个数据库 use 数据库名;   创建数据库  create database 你想要的名;

                   show tables 展示某个数据库中的表;

数据库最基本的单元是表:table    任何一张表都有行(row)和列(column)

      行被称为数据/记录。     

SQL语句的分类

DDL 数据定义语言 (凡是带有create(新建),drop(删除),alter(修改)的都是DDL)

DDL主要操作的表的结构,不是表中的数据

DML数据操作语言(凡是对表中的数据进行增删改的都是DML)

insert delete update

DQL 数据查询语言(凡是带select关键字的都是查询语言)

DCL数据控制语言  授权(grant) 撤销权限(revoke)

TCL事务控制语言 (包括事务提交commit,事务回滚rollback)

MySQL服务的启动

1手动     2 cmd--services.msc   3  使用管理员打开cmd   net start / stop  mysql    启停命令

登录退出

mysql -uroot -p            exit

还可登录他人    mysql -hip(目标ip地址)-uroot -p连接目标的密码

                         mysql --host=ip --user=root --password=连接目标的密码

SQL语法

SQL语句可以单行或多行书写,以分号结束      不区分大小写

三种注释   单行注释:--(一个空格)注释内容  或  #(不用加空格)注释内容      #是MySQL特有

                 多行注释:/*注释*/

DDL操作数据库

 Retrieve 查询   show databases;查询所有数据库的名称

                         show create database  数据库名称; 查询某个数据库的字符集:查询某个数据库的创建语句

                         查看以my开头的(my后面可有多个字符)数据库    show databases like 'my%';

                         查看以my开头的(my后面只有一个字符)数据库    show databases like 'my_';

            

Create创建     create database  你想要的名;   为了保险可以  create database if not exists 你想要的名;

还可指定创建   例如创建字符集为gbk的数据库     create database if not exists db4 character set gbk;

Drop  删除     drop database 数据库名称; drop database  if  exists 数据库名;

alter修改       alter database 名 charset gbk;

选择数据库    use  数据库名称;

查看当前是哪个数据库  select database();

 

DDL操作表:CRUD(Create创建  Retrieve 查询  Update修改   Delete删除 )

Retrieve 查询       show tables;查询当前数据库所有表的名称 

                    show table status like 'student'\G  查看表状态   \G表示列表信息,后面不用加分号

两种方式

                    desc 表名称; 看表的字段信息;desc student id;只看某项

                    show (full)columns from 数据表名; 看表的字段信息;加full之后可看详细信息

                    

                    show create table student\G查看表的结构,可查看创建时的sql语句

                    show tables like 'my%'; 查看以my开头的(my后面可有多个字符)表

习题

(1)       查看test数据库中所有数据表。

show tables;

(2)       查看当前数据库中Employee数据表的状态。

show table status like 'employee'\G

(3)       查看Department数据表所有字段的信息(两种方式)。

desc department; 

show columns from department;

(4)       查看Employee数据表中age字段的信息。

       desc employee age;

(5)       查看Department数据表详细信息(包括权限、注释等)。

show full columns from department;

(6)       查看Departmen数据表的创建语句。

show create table department\G

                   

               

Create创建     create table 表名(           

                       字段名1  数据类型1,

                       字段名2  数据类型2,

                        ...

                        字段名n  数据类型n  

                      );

mysql的数据类型    数值 日期 字符串

数值  如age int        score double(参数1:总长度,参数2:小数点后保留的位数)

日期  如birthday date

字符串 name char(10)存“张三”会用10个字符空间,因为他不会计算  (存储的性能高  浪费空间)

            name varchar(10)存“张三”会用2个字符空间,他会计算张三占几个字符  (存储性能低  节约空间)

Drop  删除 drop table 表名;   drop table if exists 表名;

alter修改        修改表名 alter table 表名 rename to 新表名;.1.2

                 添加一列 alter table 表名 add 列名 数据类型;.6

                 修改数据类型 alter table 表名 modify 列名 新数据类型;.5

                 修改列名和数据类型  alter table 表名 change 列名 新列名 新数据类型;.4

                 删除列   alter table 表名 drop 列名;.9

习题

1、  将数据表department的表名改成depart,并进行查看。

alter table  department rename to depart;

2、  将数据表depart的表名改成department,并进行查看

alter table  depart rename to department;

3、  将数据表department的字符集改成gbk。

alter table department charset = gbk;     show create table department \G

4、  将数据表employee的“id”字段的字段名改为“emid”,并查看修改结果。

即使不改类类型 也要写int

alter table employee change id emid    int ;desc employee;

5、  将数据表employee的“name”字段的字段类型改为char(10),并查看修改结果。

alter table employee modify name char(10);   desc employee name;

6、  在数据表employee中新增“sex”字段,字段类型为char(2),放在“name”字段之后,并查看修改结果。

alter table employee add sex char(2)  after name  ; desc  employee;

7、  在数据表employee中修改“did”字段位置,放在第一个字段位置,并查看修改结果。

alter table employee modify did int first;  desc employee;

8、  在数据表employee中新增phone char(11),address varchar(60)两个字段。

alter table employee add(phone char(11),address varchar(60));

9、  在数据表employee中删除“sex”字段,并查看结果

alter table employee drop sex;  desc employee;

10、删除数据表department,并查看结果。

   drop tabledepartment;  show tables;

DDL 数据定义语言 (凡是带有create(新建),drop(删除),alter(修改)的都是DDL)

上面这个更好

DDL操作表:CRUD(Create创建  Retrieve 查询  Update修改   Delete删除 )

DML(对表的数据进行增删改)(增insert删delete改update查select)

添加数据-为所有字段添加信息                            

insert into employee values(1001,1,'张三',18);

添加数据-为部分字段添加信息

insert into employee (did,emid,name) values(1002,2,'李四');

添加数据-一次添加多行数据

insert into employee values(1003,4,'李丽',19),(1002,5,'张强',20);

查询数据

查询数据-查询表中全部字段

 select * from employee;  (不要用,这样人们不知道查哪些)

查询数据-查询表中部分字段

查部分 select emid,name from employee;

   

查询数据-简单条件查询

 select * from employee where did=1001;

修改数据

update employee set age=20 where name='张三';

全部改为19

update employee set age=19;

删除数据

delete from employee where emid =5;

全部删除

delete from employee;

习题

1、  创建mydb数据库,在mydb数据库中创建一张电子杂志订阅表(subscribe)。

create database mydb;

2、电子杂志订阅表中要包含4个字段,分别为编号(id  int)、

订阅邮件的邮箱地址(email  varchar(50))、

用户是否确认订阅 (status  int,使用数字表示,1表示已确认,0表示未确认)、

邮箱确认的验证码(code  varchar(10))。

create table subscribe(

    ->id  int,

    ->email  varchar(50),

    ->status  int comment'使用数字表示,1表示已确认,0表示未确认',

    ->code  varchar(10)

    -> );

3、为电子杂志订阅表添加5条数据,如表所示

  

id

email

status

code

1

tom123@163.com

1

TRBXPO

2

lucy123@163.com

1

LOICPE

3

lily123@163.com

0

JIXDAMI

4

jimmy123@163.com

0

QKOLPH

5

joy123@163.com

1

JSMWNL

insertinto subscribe values(1,'tom123@163.com',1,'TRBXPO');

insert into subscribevalues(2,'lucy123@163.com',1,'LOICPE');

insert into subscribe values(3,'lily123@163.com',0,'JIXDAMI');

insert into subscribevalues(4,'jimmy123@163.com',0,'QKOLPH');

insert into subscribevalues(5,'joy123@163.com',1,'JSMWNL');

4、查看表中所有记录信息。

select * from subscribe;

5、查看已经通过邮箱确认的电子杂志订阅信息

select * from subscribe where status=1;

6、只查看所有记录的邮箱地址及状态信息。

select email,status from subscribe;

7、将编号等于4的订阅记录确认状态设置为“已确认”。

update subscribe set status=1 where id=4;

8、将编号等于5的订阅记录邮箱改为“joy666@163.com”,邮箱确认验证码改为“ABMROP”。

update subscribe set email='joy666@163.com',code='ABMROP'where id=5;

9、删除表中未确认的订阅信息。

delete from subscribe where status=0;

DQL 数据查询语言(凡是带select关键字的都是查询语言)

简单查询   上面讲了

为表取别名  (as也可以省略)

select * from student as stu;

为字段取别名    

select stu_id as 学号,stu_name as 姓名 from student;

条件查询

1     带关系运算符的查询

select * from student where stu_credits>=60;

带IN 关键字的查询

select * from course where term in(1,4,5);

用带or的 SELECT * FROM course WHERE term=1 or term = 4 or term = 5;

3    带between and 关键字的查询

select * from score WHERE score BETWEEN 60 and 90;(包含60 和90)

带and 的查询 SELECT * from score WHERE score>=60 AND score <=90 ;

4   空值查询

SELECT * from student WHERE remark IS NULL;

带DISTINCT关键字的查询(重复值会被去掉)

SELECT DISTINCT department FROM student;

带LIKE 关键字的查询

SELECT * FROM student WHERE stu_name LIKE '李%';

带AND 关键字的多条件查询(同组是一般用or,不同组and)

SELECT * from student WHERE sex='女' AND stu_credits=60;

8 带or关键字的查询(同组是一般用or,不同组and)

SELECT * FROM course WHERE credit=2 or credit = 4;

习题

1、  查询course表中所有课程信息。

SELECT * FROM course;

2、  查询所有课程的课程编号、课程名称、学分信息。

SELECT course_id,course_name,credit FROM course;

3、  查询student表中总学分在60分以下的学生的学号、姓名、所在学院信息。

SELECT stu_id,stu_name,department FROM student WHERE stu_credits<60;

4、  查询课程表中所有学分为2、4、6分的课程信息(in方法实现)。

SELECT * FROM course WHERE credit IN (2,4,6);

5、  查询总学分在50-60分之间的学生记录(两种方法实现)。

SELECT * FROM student WHERE stu_credits BETWEEN 50 AND 60 ;

SELECT * FROM student WHERE stu_credits>=50 AND stu_credits<=60;

6、  查询所有考试课程的课程编号。

SELECT DISTINCT course_id FROM score;

7、  查询所有刘姓同学的信息。

SELECT * FROM student WHERE stu_name LIKE '刘%';

8、  查询所有计算机学院女生的信息。

SELECT * FROM student WHERE sex ='女';

9、  查询所有学时为60或72的课程信息。

SELECT * FROM course WHERE class_hour=60 or class_hour=72;

SELECT * FROM course WHERE class_hour in(60,72);

10、查询所有2001年出生的学生的信息。

SELECT * FROM student WHERE birthday LIKE '2002%';

高级查询

1 聚合函数

SELECT COUNT(stu_id) as 学生人数 from student;

2排序-单字段排序

SELECT * FROM student ORDER BY stu_id DESC;

注意  此处的desc和以前学过的desc不一样

3 分组查询-分组统计           技巧:select跟的 就是分组(group by 后面的)的 + 聚合函数

SELECT sex as 性别,count(*) as 人数 from student GROUP BY sex;

having是分组完后的组进行进一步筛选

where 和 having 区别

执行机制不一样:where 是分组之前进行限定,不满足where条件,则不参与分组,而having是分组之后对结果进行过滤

可判断的条件不一样:where 不能对聚合函数进行判断,having 可以

having 靠后 又where不能对聚合函数

原因  执行顺序不一样:where > 聚合函数 >having

注意  分组之后 查询字段(即select后面跟的)为聚合函数和分组字段,查询其他字段无任何意义

3 分组查询-多分组统计  技巧:select跟的 就是分组(group by 后面的)的 + 聚合函数

SELECT department as 学院, sex as 性别,COUNT(*) as 人数 FROM student GROUP BY department,sex;

3 分组查询-分组汇总   

SELECT department as 学院, sex as 性别,COUNT(*) as 人数 FROM student GROUP BY department,sex with ROLLUP;

3 分组查询- 查询结果限量

SELECT * FROM student LIMIT 2,2;(第一个2是从第三个开始,第二个2是查询2条)

拓展  分页查询

习题

1、统计各学院的人数。

SELECT department as 学院,count(*) as 人数 from student GROUP BY department;

2、  统计各学期的总学分。

SELECT term as 学期,sum(credit) as 学分 from course GROUP BYterm;

3、  统计成绩表中各门课程的最高分。

SELECT course_id as 课程,max(score) as 最高总学分 from score GROUP BY course_id;

4、  统计计算机学院的人数。

SELECT department as 学院,count(*) as 人数 from student GROUP BYdepartment HAVING department='计算机学院';

5、  将成绩表中的记录先按课程降序排序,再按学号升序排序。

SELECT * FROM score ORDER BY course_id desc,stu_id asc;

6、  统计平均分在75分以上的课程的课程号、平均分。

SELECT course_id as 课程编号 ,AVG(score) as 平均分 from score GROUP BY course_id HAVING AVG(score)>'75';

7、  统计各学院男女生的人数。

SELECT department as 学院, sex as 性别,COUNT(*) as 人数 FROM student GROUP BY department,sex;

8、  统计每个学生的各科成绩平均分并汇总。

SELECT stu_id as 学生编号 ,avg(score) as 平均分 FROM score GROUP BY stu_id with ROLLUP;

9、查询课程表中的前3条记录。

SELECT course_name FROM course LIMIT 3;

10、查询课程表中从第6条记录开始的2条记录。

SELECT course_name FROM course LIMIT 5,2;

多表查询

1连接查询

内连接查询(内连接查询根据匹配条件返回第一个表与第二个表所有匹配成功的记录)

显式

SELECT student.stu_id,stu_name,course_id,score from student INNER JOIN score on student.stu_id=score.stu_id;

隐式

SELECT DISTINCT course.course_id,course_name from course,score WHERE course.course_id=score.course_id;

2外连接查询

3子查询

1 SELECT * FROM score WHERE stu_id=(SELECT stu_id FROM student WHERE stu_name='王红');

  红的是内层查询  

适用于单行单列

2 SELECT * FROM student WHERE stu_id in(SELECT stu_id FROM score WHERE course_id='101') ;

 红的是内层查询

适用于多行单列

SELECT stu_id,stu_name FROM student WHERE EXISTS(SELECT * FROM score WHERE score<'60' AND student.stu_id = score.stu_id);  注意:为什么是select*而不是select stu_id  ,因为exists只返回true或false

4  SELECT * FROM score WHERE course_id = ANY(SELECT course_id FROM course WHERE term=1);

5   带all关键字的子查询

SELECT * FROM score WHERE score>all(SELECT score FROM score WHERE course_id=108);

拓展   多行多列是用于做虚拟表

1、          查询所有选修课程的课程编号、课程名称。(两种方法实现)

SELECT DISTINCT course.course_id,course_name from course INNER JOIN score on course.course_id=score.course_id;

SELECT DISTINCT course.course_id,course_name from course,score WHERE course.course_id=score.course_id;

2、          查询所有成绩在85分以上的学生的学号、姓名、课程编号及成绩。

SELECT student.stu_id,stu_name,course_id,score FROM student INNER JOIN score on score.stu_id = student.stu_id AND score>85;

3、          实现第1题的左连接查询。

SELECT DISTINCT score.course_id,course_name from course LEFT JOIN score on course.course_id=score.course_id;

4、          查询选修“数据结构”课程的学生的学号。

SELECT stu_id FROM score WHERE course_id =(SELECT course_id FROM course WHERE course_name='数据结构');

5、          查询学号为“190101”的学生所选修课程的课程信息。

SELECT * FROM course WHERE course_id in(SELECT course_id FROM score WHERE stu_id ='190101');

SELECT * FROM course WHERE course_id =ANY(SELECTcourse_id FROM score WHERE stu_id ='190101');

6、          查询不及格学生的基本信息。

SELECT * FROM student WHERE EXISTS(SELECT * FROM score WHERE score<'60' AND student.stu_id = score.stu_id);

SELECT * FROM student WHERE stu_id in(SELECT stu_idFROM score WHERE score<60);

SELECT * FROM student WHERE stu_id =ANY(SELECT stu_idFROM score WHERE score<60);    

视图

从一个或多个表导出来的表,它是一种虚拟存在的表,表的结构和数据都依赖于基本表。可以像操作基本表一样操作试图

创建视图

CREATE view stu_view2(学号,姓名) as SELECT stu_id,stu_name from student;

SELECT * FROM stu_view2;(括号中是起别名)

查看视图信息

指查看数据库中已经存在的视图的定义

desc

查看视图状态信息

查看创建视图的语句

修改视图

修改视图是指修改数据库中存在的视图的定义。例如,当即本表中某些字段发生变化时,视图必须修改才能正常使用

以下两种方法通用

1 替换已有视图

CREATE or REPLACE view stu_view1 as SELECT stu_id,stu_name,sex from student;

SELECT * FROM stu_view1;

2 使用alter——view修改视图

ALTER VIEW stu_view1 as SELECT stu_id,stu_name,sex FROM student WHERE sex='女';

SELECT * FROM stu_view1;

删除视图

视图数据操作

通过视图来查询、添加、修改或删除基本表(也就是原表,因为视图当中其实没有元素)中的数据

1 添加数据

2 修改数据

3 删除数据

作业

1、  创建视图“course_view”,查看所有课程的course_id,course_name,并起别名为课程编号、课程名称。

CREATE view course_view(课程编号,课程名称) as SELECT course_id,course_name from course;

2、  创建视图“cj_view”,查看所有学生选修课程的学号、课程名称、成绩。

CREATE VIEW cj_view(编号,课程名称,成绩) as SELECT DISTINCT course.course_id,course_name,score from

course,score WHERE course.course_id=score.course_id;

3、  修改视图“course_view”为查看所有课程的course_id,course_name,term。

CREATE or REPLACE view course_view as SELECT course_id,course_name,term from course;

4、  删除视图“cj_view”。

drop view cj_view;

5、  向视图“course_view”中插入一条记录(‘202’,‘人工智能’,4)。

INSERT INTO course_view VALUES ('202','人工智能',4);

6、  修改视图“course_view”中课程编号为‘202’的课程的开课学期为3。

UPDATE course_view set term='3' WHERE course_id='202';

7、  删除视图“course_view”中课程名称为‘人工智能’的记录。

DELETE FROM course_view WHERE course_name='人工智能';

8、  查看视图“course_view”创建信息。

show CREATE view course_view;

9、  查看视图“course_view”字段信息。

desc course_view;

视图检查

CASCADED级联检查(不仅关心自身视图的条件,还有满足基于的student_view01 条件

插入的成绩需满足   <60   >50

LOCAL非级联检查(只关心自身视图的条件

插入的成绩只需满足  >50

表约束

约束是作用于表中列上的规则,用于限制加入表的数据

约束的存在保证了数据库中数据的正确性、有效性和完整性

注意:

检查约束是MySQL不具备的功能

主键约束

主键约束可以唯一标识表中的记录,每个数据表最多只有一个主键约束,定义为主键的字段不能有重复且值不能为NULL值

非空约束

唯一约束

默认约束

作业

1、  为“course1”表的课程名称字段添加唯一性约束。

alter TABLE course1 add UNIQUE(course_name);

2、  为“course1”表的学分字段设置默认值约束为4。

alter TABLE course1 MODIFY credit int DEFAULT4 ;

3、  为“student1”表的性别字段设置默认值约束为“男”。

alter TABLE student1MODIFY sex char(2) DEFAULT'男';

4、  删除上题创建的性别字段默认值约束。

alter TABLE student1MODIFY sex char(2);

5、  为“score1”表的学号、课程编号字段创建主键约束。

ALTER TABLE score1 add PRIMARY key (stu_id,course_id);

外键约束

是在从表上添加的外键约束

第一种方式

在创建表是添加

第二种方式

把索引也给删除,因为在创建外键约束时会有一个索引

自增长

修改下一次的自增值

不再使用自动增长

重新使用自动增长

字符集与校对集

1、  建立score表与student表之间的外键约束,要求拒绝主表删除外键关联字段,并且主表中更新记录时,同时自动更新从表中对应的记录

ALTER TABLE score ADD CONSTRAINT FK_ID FOREIGN KEY(stu_id) REFERENCES student(stu_id) on DELETE RESTRICT on UPDATE CASCADE;

2、  建立score表与course表之间的外键约束,要求拒绝主表删除外键关联字段,并且主表中更新记录时,同时自动更新从表中对应的记录。

ALTER TABLE score ADD CONSTRAINT FK_course_ID FOREIGN KEY(course_id) REFERENCES course(course_id) on DELETE RESTRICT on UPDATE CASCADE;

3、  在student表、score表和course表中各插入一条记录,其中stu_id=100001,course_id=101。

INSERT INTO student(stu_id,stu_name) VALUES ('100001',0);

INSERT INTO score(stu_id,course_id) VALUES ('100001',101);

INSERT INTO course(course_id,course_name) VALUES(101,0);

4、  将course表中course_id改为102,观察score表中是否同步修改。

UPDATE course set course_id='102' WHERE course_name='0';

5、  删除student表中学生记录观察score表结果。

DELETE FROM student where stu_name='0';

6、  插入“软件1班”、“0,软件2班”、“6,软件3班”3条记录,观察字段自增长情况。

INSERT INTO class(class_name) VALUES('软件一班');

INSERT INTO class VALUES(0,'软件2班');

INSERT INTO class VALUES(6,'软件3班');

自定义函数

存储过程

1、  创建存储过程proc1,查看学生表中所有计算机学院学生的信息并执行

delimiter $$

    create procedure proc1()

    begin

    select* from student WHERE department='计算机学院';

    end

    $$     delimiter ;

    call proc1();

2、创建带输入参数的存储过程proc2,查询指定课程号(作为输入参数)的学生成绩信息并执行。

delimiter

$$

     create procedure proc2(in courseid char(3))

     begin

     select score from score where course_id=courseid;

     end

     $$

     delimiter ;

     call proc2('101');

3、创建并执行带输入参数的存储过程p_xs,查询指定学号(作为输入参数)的学生姓名、课程编号、成绩。

delimiter

$$

     create procedure p_xs(in stuid VARCHAR(30))

     begin

    SELECT stu_name,course_id,score from student INNER JOIN score on student.stu_id=score.stu_id where student.stu_id=stuid;

  end

     $$

     delimiter ;

        call p_xs('190101');

4、  查看存储过程proc1的创建信息。

show create procedure proc1\G

5、  查看存储过程proc2的状态信息

show procedure status like 'proc2'\G

6、  为存储过程添加注释。

alter PROCEDURE p_xs COMMENT'注释内容';

7、  删除存储过程proc1。

DROP PROCEDURE p_xs;

8、  创建函数fun1,返回指定字符串的长度并执行。

delimiter

$$

create

function fun1(str varchar(30)) returns int

 begin

 return CHAR_LENGTH(str);

 end

$$

delimiter ;

select fun1('sss');     

9、  查看函数fun1的创建语句。

show create function fun1\G

10、  查看函数fun1的状态信息。

show function status like'fun1'\G

数据库设计

表关系

一对一     一对多(多对一)   多对多

一对多(多对一)部门 和 员工

                         一个部门对应多个员工,一个员工对应一个部门

实现方式  在多的一方(从表)建立外键   指向一的(主表)一方的主键

多对多   商品和订单

           一个商品对应多个订单,一个订单包含多个商品

实现方式  建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

一对一  用户 和 用户详情

            一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能

实现方式 在任意一方加入外键,关联另一方主键,并且设置外键为唯一(UNIQUE)

课后作业

1、有若干工厂,每个工厂生产多种产品,且每一种产品可以在多个工厂生产,每个工厂按照固定的计划数量生产产品;每个工厂聘用多名职工,且每名职工只能在一个工厂工作,工厂聘用职工有聘用期和工资。工厂的属性有工厂编号、厂名、地址,产品属性有产品编号、产品名、规格,职工的属性有职工号、姓名。

(1)根据上述语义画出ER图。

(2)将ER模型转换成关系模型,并指出每个关系模式的主键。

(1)

(2)

1.先看工厂与产品是M:N的关系

工厂(工厂编号,厂名,地址)

产品(产品编号,产品名,规格)

生产(工厂编号产品编号,计划数量     )

2.工厂与职工是1:m的关系

工厂(工厂编号,厂名,地址)        

职工(职工号,姓名,工厂编号)

修改

有三个实体,得到三种关系模式

工厂(工厂编号,厂名,地址)

产品(产品编号,产品名,规格)

职工(职工号,姓名)

有两个关系,得到两种关系模式

m:n:生产(工厂编号产品编号,计划数量)

1:n:职工(职工号,姓名,工厂编号,聘期,工资)

由于“工厂-职工”的联系“聘用”是1:N,它对应的关系模式与职工实体相同,所以,这个关系模式与职工关系模式可以合并

工厂(工厂编号,厂名,地址)

产品(产品编号,产品名,规格)

职工(职工号,姓名,工厂编号,聘期,工资)

生产(工厂编号产品编号,计划数量)

事务简介

数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令

事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功过,要么同时失败

事务是一个不可分割的工作逻辑单元

当选中begin一起运行时,它会当作事务,当其中有错误导致其无法运行时,数据不会提交,即只有在当前表中可以查询数据的变化,但在其他的表中不会查询到数据的变化。rollback是事务回滚(恢复到更改前的数据),当选中begin时才可以回滚。commit是 提交事务,即将数据提交,这样在别的表中也可以访问。

事务保存点   

savepoint   名称;

rollback to savepoint   保存点名称;

这个可以回滚到事务保存点的状态,而不至于直接回滚到最原始的状态

事务的四大特性

原子性(Atomicity) 事务是不可分割的最小单位,要么同时成功,要么同时失败

一致性(Consistency)事务完成时,必须使所有的数据保持一致状态

隔离性(Isolation) 多个事务之间,操作的可见性

持久性(Durability) 事务一旦提交或回滚,它对数据库中的数据的改变是永久的

数据安全

-- 1添加和删除用户

-- (1) 添加用户

CREATE USER user1@localhost IDENTIFIED by'123';

CREATE USER user2@localhost IDENTIFIED by'123';

-- (2) 修改密码

set PASSWORD for user1@localhost='111';

-- (3) 删除用户

drop user user1@localhost;

-- 授予权限和回收权限(在root用户下操作)

-- 权限排名

--  用户权限>数据库权限>表权限>列权限

-- 2 授予权限

--   (1) 授予表权限

GRANT SELECT on studb.student to user1@localhost;

--   (2) 授予列权限(只能对stu_name这一列进行修改)

GRANT UPDATE(stu_name)  on studb.student to user1@localhost;

--   (3)授予数据库权限(第一条对数据库只有查询的权限,第二条全部权限都有)

GRANT SELECT on studb.* to user1@localhost;

GRANT all on studb.* to user1@localhost;

--   (4) 赋予用户权限(对所有数据库的数据表都有创建 修改 删除的权限)

GRANT CREATE,ALTER,DROP ON *.* to user1@localhost;

--   (4.1)赋予创建用户的权限

GRANT CREATE user ON *.* to user1@localhost;

    2.1  权限的转移

首先在root用户下授予user1 用户在sell表上的selec权限

GRANT SELECT on studb.student to user1@localhost with grant option;

接着在user1用户中创建用户2(因为在第(4.1)步中已经赋予了创建用户的权限),然后将权限直接转给用户2就可以

-- 2.2 收回权限

--   (1) 收回特定权限

 REVOKE SELECT on studb.student from user1@localhost;

--   (2) 回收用户的所有权限

REVOKE ALL PRIVILEGES,GRANT OPTION from user1@localhost;

--  3 数据库备份和恢复

--      (1)    查看备份默认保存路径

    show VARIABLES LIKE '%secure%';

         备份

    SELECT * FROM course  into OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/myfile.txt';

--       还原

    LOAD data INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/myfile.txt' into TABLE course;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值