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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 基础准备:在 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视图是基于表的,当表中的内容更改时,视图中的内容也会更改,当更改视图时,同样表中的内容也会更改,二者互相关联。

 

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
SQL 存储 运维
从建模到运维:联犀如何完美融入时序数据库 TDengine 实现物联网数据流畅管理
本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品。文章从一个具体的业务场景出发,分析了企业在面对海量时序数据时的挑战,并提出了利用 TDengine 高效处理和存储数据的方法,帮助企业解决在数据采集、存储、分析等方面的痛点。通过这篇文章,作者不仅展示了自己对数据处理技术的理解,还进一步阐释了时序数据库在行业中的潜力与应用价值,为读者提供了很多实际的操作思路和技术选型的参考。
19 1
|
11天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
14天前
|
前端开发 JavaScript 数据库
获取数据库中字段的数据作为下拉框选项
获取数据库中字段的数据作为下拉框选项
44 5
|
15天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
39 3
|
15天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
42 3
|
15天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
57 2
|
22天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
24天前
|
存储 关系型数据库 MySQL
mysql怎么查询longblob类型数据的大小
通过本文的介绍,希望您能深入理解如何查询MySQL中 `LONG BLOB`类型数据的大小,并结合优化技术提升查询性能,以满足实际业务需求。
89 6
|
28天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
190 15
|
29天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。

热门文章

最新文章

推荐镜像

更多