MySQL 学习笔记(二):数据库更新、视图和数据控制

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 基础准备:在 school 数据库下建立student、course、sc 三个表:create table student( Sno char(9) primary key, Sname char(20) unique, Ssex char(2), Sage int, S...

基础准备:

在 school 数据库下建立student、course、sc 三个表:

create table student(
  Sno char(9) primary key,
  Sname char(20) unique,
  Ssex char(2),
  Sage int,
  Sdept char(20));

create table Course(
  Cno char(4) primary key,
  Cname char(40),
  Cpno char(4),
  Ccredit int);

create table SC(
  Sno char(9),
  Cno char(4),
  Grade int,
  primary key(Sno,Cno),
  foreign key (sno) references Student(sno),
  foreign key (Cno) references Course(Cno));

insert into  student values ('95001','李勇','',20,'CS');
insert into student values ('95002', '刘晨','',19,'IS');
insert into  student values('95003', '王敏', '',18, 'MA');
insert into student values('95004', '张立', '',19, 'IS');

insert into Course values(1,'数据库', 5,4);
insert into Course values(2, '数学', 3 ,2);
insert into Course values(3, '信息系统', 1, 4);
insert into Course values('4', '操作系统', '6', 3);
insert into Course values('5', ' 数据结构', '7', 4);
insert into Course values('6', '数据处理',  '',  2);
insert into Course values('7',  'PASCAL语言', '6', 4);

insert into SC values('95001', '1', 92);
insert into SC values('95001', '2', 85);
insert into SC values('95001', '3', 88);
insert into SC values('95002', '2', 90);
insert into SC values('95002', '3', 80);

 

(一)数据库更新
1. 在school数据库中,确保表之间已经建立关系,用企业管理器建立数据库的关系图(Diagrams)
2. 在course 表中删除cno=1的记录,有什么结果?
  报错:因为有外键约束。
3. 编辑course表和 sc表之间的关系,添加级联删除相关记录和级更新相关记录

create table SC(
          Sno char(9),
          Cno char(4),
          Grade int,
          primary key(Sno,Cno),
          foreign key (sno) references Student(sno) on delete cascade on update cascade,
          foreign key (Cno) references Course(Cno);

重复2的操作,观察course 表和 sc表的变化,有什么结果,为什么?
  没有报错,成功删除 cno = 1行。

 4. 将course表和sc表的课程号为2的都改为22,如何做?(提示:在Diagrams中编辑course表和 sc表之间的关系,选择级联更新相关记录cascade update related fields)

update sc set cno=22 where cno=2;
update course set cno=22 where cno=2;

5. 在SC表中,
(1)将95002同学的成绩都减少10%

update sc set course=80 where sno=95002;

(2) 课程号为3的改为33

update sc set cno=33 where cno=3;

改不了。不能修改子表,只能修改主表。

6.
(1) 在STUDENT表中插入一条新纪录:  95006   李三   男   21   IS

insert into student (sno, sname, ssex, sage, sdept) values (95006,'李三','',21,'IS');

2)在SC表中插入一条新纪录: 95008       3    80

insert into student (sno, cno, grade) values (95008, 3, 80);

 

出错,因为不能修改子表,只能修改主表。

 

(二)建立新用户和数据控制管理
使用命令行界面:
1.创建用户:

CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 

说明:username - 你将创建的用户名, host - 指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost, 如果想让该用户可以从任意远程主机登陆,可以使用通配符%. password - 该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器。

2.授权: 

GRANT privileges ON databasename.tablename TO 'username'@'host' 

说明: privileges - 用户的操作权限,如SELECT , INSERT , UPDATE 等(详细列表见该文最后面).如果要授予所的权限则使用ALL.;databasename - 数据库名,tablename-表名,如果要授予该用户对所有数据库和表的相应操作权限则可用*表示, 如*.*. 

例子:

create user stu1@localhost identified by 'stu1';
grant create view on school.* to stu1@localhost;

当创建过程没问题,提示 Can't find any matching row in the user table
记得刷新一下: flush privileges;

 

3.建立存储过程和函数 建立存储过程sp1

mysql> delimiter $$         #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> create procedure sp1()    
    -> begin 
    -> grant create view on school.* to stu2@localhost;
    -> grant select,update,insert,delete on school.student to stu2@localhost;
    -> grant select,update,insert,delete on school.course to stu2@localhost;
    -> grant select,update,insert,delete on school.sc to stu2@localhost;
    -> end$$
mysql> delimiter ;        #将语句的结束符号恢复为分号    

建立存储过程sp2

mysql> delimiter $$    #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> create procedure sp2()
-> begin
-> grant select on school.student to stu1@localhost;
-> grant select on school.course to stu1@localhost;
-> grant select on school.sc to stu1@localhost;
-> grant insert on school.student to stu1@localhost, stu2@localhost;
-> grant update(Ccredit) on course to stu1;
-> end$$

建立存储过程sp3

mysql> delimiter $$        #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
mysql> create procedure sp3()
    -> begin
    -> revoke select on school.student from stu1@localhost;
    -> revoke select on school.course from stu1@localhost;
    -> revoke select on school.sc from stu1@localhost;
    -> end$$
mysql> delimiter ;        #将语句的结束符号恢复为分号    

grant 语句赋予权限,revoke 语句取消权限。

撤销已经赋予给 MySQL 用户权限的权限revoke

revoke all on *.* from dba@localhost;


和grant类似,只需将关键字to换成from,同样可以针对特定用户特定库撤销特定权限。

MySQL 删除存储过程和函数:
基本的语法格式如下:

DROP {PROCEDURE|FUNCTION} sp_name;  

其中,sp_name参数表示存储过程或函数的名称。
删除存储过程test。SQL代码如下:

drop procedure if exists test;

 

执行存储过程sp1(), sp2(), sp3()

call sp1();
call sp2();
call sp3();

 

(三) 视图建立和操作

1.将查询超过18岁的学生的结果建立视图view1,所有男同学的结果建立view2

create view view1 as select * from student where sage>18create view view2 as select * from student where ssex='';

A.在student中,将CS 改为CC,  view1,view2 有没有同步更改?

update student set sdept='cc' where sdept='cs';

同步更改了。

B.在view1中将女同学改为男同学,student 及view2有没有同步修改?

update view1 set ssex='' where ssex='';

同步更改了。

2. 将查询成绩及格(>=60)的姓名、系名、课程名和成绩的结果建立视图V1
然后对视图V1进行update, delete和insert操作,观察student,course和 sc三张基表的变化.

create view v1 as
select student.sname,student.sdept,course.cname,sc.grade from student,sc,course
where student.sno=sc.sno and course.cno=sc.cno
and grade>=60;

A.在student,course和 sc三表中进行update, delete和insert操作(自己设计测试用例),观察V1视图的变化.    同步变化
B.在V1视图中进行update, delete和insert操作(自己设计测试用例),观察student,course和 sc三张基表的变化.    同步变化

3.将查询超过平均成绩的学号、课程号及成绩的结果建立一个视图V2

create view v2 as select sno, cno,grade from sc where grade >(select avg(grade) from sc) 

A.在sc表中进行update, delete和insert操作(自己设计测试用例),观察V2视图的变化.     同步变化
B.在V2视图中进行update, delete和insert操作(自己设计测试用例),观察sc基表的变化,并且分析原因.     同步变化

 

**结论:view视图是基于表的,当表中的内容更改时,视图中的内容也会更改,当更改视图时,同样表中的内容也会更改,二者互相关联。

 

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
缓存 NoSQL 关系型数据库
13- Redis和Mysql如何保证数据⼀致?
该内容讨论了保证Redis和MySQL数据一致性的几种策略。首先提到的两种方法存在不一致风险:先更新MySQL再更新Redis,或先删Redis再更新MySQL。第三种方案是通过MQ异步同步以达到最终一致性,适用于一致性要求较高的场景。项目中根据不同业务需求选择不同方案,如对一致性要求不高的情况不做处理,时效性数据设置过期时间,高一致性需求则使用MQ确保同步,最严格的情况可能涉及分布式事务(如Seata的TCC模式)。
35 6
|
2天前
|
SQL 关系型数据库 MySQL
MySQL环境搭建——“MySQL数据库”
MySQL环境搭建——“MySQL数据库”
|
2天前
|
SQL NoSQL 关系型数据库
初识MySQL数据库——“MySQL数据库”
初识MySQL数据库——“MySQL数据库”
|
2天前
|
SQL 关系型数据库 MySQL
关系型数据库插入数据的语句
使用SQL的`INSERT INTO`语句向关系型数据库的`students`表插入数据。例如,插入一个`id`为1,`name`为'张三',`age`为20的记录:`INSERT INTO students (id, name, age) VALUES (1, '张三', 20)。如果`id`自增,则可简化为`INSERT INTO students (name, age) VALUES ('张三', 20)`。
5 2
|
2天前
|
SQL 存储 Oracle
关系型数据库查询数据的语句
本文介绍了关系型数据库中的基本SQL查询语句,包括选择所有或特定列、带条件查询、排序、分组、过滤分组、表连接、限制记录数及子查询。SQL还支持窗口函数、存储过程等高级功能,是高效管理数据库的关键。建议深入学习SQL及相应数据库系统文档。
6 2
|
4天前
|
关系型数据库 MySQL 数据库
数据库基础(mysql)
数据库基础(mysql)
|
4天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
32 3
|
5天前
|
存储 关系型数据库 MySQL
【后端面经】【数据库与MySQL】为什么MySQL用B+树而不用B树?-02
【4月更文挑战第11天】数据库索引使用规则:`AND`用`OR`不用,正用反不用,范围中断。索引带来空间和内存代价,包括额外磁盘空间、内存占用和数据修改时的维护成本。面试中可能涉及B+树、聚簇索引、覆盖索引等知识点。MySQL采用B+树,因其利于范围查询和内存效率。数据库不使用索引可能因`!=`、`LIKE`、字段区分度低、特殊表达式或全表扫描更快。索引与NULL值处理在不同数据库中有差异,MySQL允许NULL在索引中的使用。
10 3
|
7天前
|
关系型数据库 MySQL 数据库连接
Django(四):Django项目部署数据库及服务器配置详解(MySQL)
Django(四):Django项目部署数据库及服务器配置详解(MySQL)
29 11
|
16天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)