MySQL备忘笔记(二)

零、VsCode操作MySQL

大赞!!!vscode果然还是一如既往的优秀,没有让我失望~

1. windows下的插件连接

0、解决密码认证方式问题

8.0以上版本特殊的密码认证方式会导致登录失败,解决方案如下:

控制台输入:

alter user 'root'@'localhost' identified with mysql_native_password by 'root';
flush privileges;

1、下载下列插件

2、在左侧的资源管理器中找到MySQL入口,点击+

host输入MySQL服务器名或ip (根据实际情况输入)

(本地服务器就输入localhost或者127.0.0.1)

user是输入数据库用户名(根据实际情况输入)

password是数据库密码(根据实际情况输入)

port是数据库端口号 默认3306(根据实际情况输入)

登陆成功:

3、建立新的query文件

4、这种结构下软件分窗就显得非常实用了

5、执行query语句快捷键:

执行所有语句:不框选语句情况下按F9

执行单个语句:选择语句情况下按F9

6、执行代码格式化:alt +shift +F

一、数据库的设计

1、多表间的关系

①、一对一

例如:人和身份证的关系

实现方式:在任意一方添加唯一外键指向另一方主键。

image

②、一对多/多对一

例如:一个部门有多个员工,一个员工只有一个部门

实现方式:

在多的一方建立外键并指向一的一方的主键

image

③、多对多

例如:一个学生有多门课程,一门课程有多个学生

实现方式:多对多需要借助第三张中间表,中间表至少包含两个字段,这两个字段作为作为第三张表的外键,分别指向两张表的主键

image

2、数据设计范式

设计数据库需要遵循的规范

六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、

巴斯科特范式(BCNF)、第四范式(4NF)、第五范式(5NF)

要遵循后面的范式,要先遵循前面的范式
我们一般只需要满足前三个范式就可以了

关于范式. 请参考如下视频:
https://www.bilibili.com/video/BV1nx411G7NX?p=86
https://www.bilibili.com/video/BV1p7411A7Lp?p=16
①、第一范式(1NF):

每一列都是不可分割的基本数据项,且必须有主键

意思是列不可以嵌套及混合

只按照第一范式设计当然不行,问题如下:

②、第二范式(2NF):

解决非主属性部分依赖于主关键字。(在1NF基础上消除非主属性对主码的部份依赖)

第二范式要求所有非主键字段完全依赖主键, 不能部分依赖

几个概念:

a:函数依赖

A-->B

在一张表中,如果通过A属性(属性组)的值可以唯一确定B属性的值,则B依赖于A

如:

学号-->姓名 学号可以唯一确定姓名 姓名依赖于学号

学号 !-->分数 只靠学号无法确定分数 分数不依赖于学号

(学号,课程名称)-->分数 (学号,课程名称)可以唯一确定分数,分数依赖于(学号,课程名称)

b:完全函数依赖

A-->B

在一张表中,如果通过A的属性组中的所有值可以唯一确定B属性的值,则B完全依赖于A

例如:

(学号,课程名称)-->分数 (学号,课程名称)可以唯一确定分数,分数依赖于(学号,课程名称)

c: 部分函数依赖

A-->B

在一张表中,如果通过A的属性组中的部分值可以唯一确定B属性的值,则B部分依赖于A

例如:

(学号,课程名称)-->姓名 (学号,)可以唯一确定姓名,姓名部分依赖于(学号,课程名称)

d:传递函数依赖

A-->B-->C

在一张表中,如果通过A属性(属性组)的值可以唯一确定B属性的值,通过B属性(属性组)的值可以唯一确定C属性的值,则C传递函数依赖于A

例如:学号-->系名-->系主任

e:码

在一张表中,如果一个表中的一个属性(属性组)被其他所有属性完全依赖,则称这个属性(属性组)为该表的码。

f:主属性

码中的属性

g:非主属性

非码中的属性

现在我们来消除例子中的部分依赖:

拆分表格后,数据冗余问题解决了,但还有2、3问题

image

③、第三范式(3NF):

一个数据库表中不包含已在其它表中已包含的非主关键字信息 (在2NF基础上消除传递依赖)

还应该添加课程表

二、数据库备份还原

1、命令行

①备份

mysqldump -u用户名 -p密码 数据库名 > 保存的路径

②还原

1)登录数据库服务器

2)创建数据库

3)使用数据库

4)执行: source 文件路径。

2.图形化

①、备份

② 还原

三、多表查询

1、查询笛卡尔积

select * from 表名1,表名2;

这样查询出来的结果是笛卡尔积(A和B的所有组合可能性的集合)。

这样的结果很多无用数据。

2、多表查询的分类

①、内连接查询 //查询两表交集

a)隐式内连接

select 表1.列名,表2.列名 from 表1 别名1,表2 别名2 where 条件;

b)显式内连接

select 字段列表 from 表名1 join 表2 on 条件;

注意:要用内连接查询需要确定:

a)确定从哪些表中查数据

b)条件是什么(判断有效数据)

c)确定需要查询哪些字段

②、外链接查询

a)左外链接 //查询左表所有记录及交集

select 字段列表 from 表1 left join 表2 on 条件;

例:假设有一位新员工还没有部门

如果查内连接交集就查不到了,查左连接就可以查到

b)右外链接 //查询右表所有记录及交集

select 字段列表 from 表1 right join 表2 on 条件;

例:

③、子查询

子查询就是查询中嵌套查询

a)子查询情况1:子查询的结果是单行单列的,此时子查询可以作为条件,使用运算符进行计算。

如:

b)子查询情况2:查询的结果是多行单列的 可以使用运算符in

例如:

c)子查询情况2:查询的结果是多行多列的 把子查询当作虚拟表供查询

四、事务

1、事务

①、概念

如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。

A给B要划钱,A的账户-500元,B的账户就要+500元,这两个update语句必须作为一个整体来执行,不然A扣钱了,B没有加钱这种情况很难处理。

②、操作

a)开启手动事务:start transaction

b)提交:commit

c)回滚:rollback

注意:1.即使没有提交,你在本query最后查询数据也会发现变化了,但当你退出软件重启数据库发现没有改变,你看到的只是临时数据。只有commit后才是真正的数据。上图中的数据是我重启后的数据

2.commit和rollback只能执行一个,需要类似于PHP类的后台程序做判断,数据库本身只提供语句,不能再query中写判断。

③、mysql不开启手动提交事务时,是默认自动提交的,每条语句都会提交一次。

修改自动提交:

a)查看事务的默认提交方式:

SELECT @@autocommit;

b)修改为手动提交

set @@autocommit=0;

c)如果改为手动提交 必须commit才会提交数据

2、事务的四大特征

a)原子性:不可分割的最小操作单位,要么同时成功,要么同时失败

b)持久性:当数据提交或回滚时,会持久化的改变数据

c)隔离性:多个事务之间项目独立

d)一致性:事务操作前后总量不变。

3、事务的隔离级别

事务有隔离性,但是多个事务同时操作同一批数据,会引发一些问题,设置不同的隔离级别可以解决这些问题

引发的问题:

a)脏读:一个事务读取到另一个事务没有提交的数据

b)虚读(不可重复读):同一个事务中两次读取到的同一数据不一样

c)幻读:一个事务操作数据表中所有数据,另一个事务添加数据,则第一个事务查询不到自己的修改(MySQL中不存在)

隔离级别:

a)read uncommited 读未提交

此级别下,可出现:脏读、虚读、幻读

b)read commited 读已提交

此级别下,可出现:虚读、幻读

c)repeatable read 可重复读 (MySQL默认)

此级别下,可出现 幻读

d)serializable:串行化

此级别下,无问题。但效率最低。

查询隔离级别:

select @@tx_isolation;   /*mysql 8.0以后弃用*/
select @@transaction_isolation;/*mysql 8.0以后用*/

设置隔离级别:

set global transaction isolation level read committed;

注意:设置后需要重启生效,上图中我已经重启。

五、DCL

DCL用来管理数据库用户、授权

1、管理用户

①、添加用户:

create  user '用户名'@'主机名' identified by "密码";  /*注意,必须用单引号!*/

②、删除用户:

drop user'用户名'@'主机名';

③、修改用户密码:(8.0以后新方法)

alter user 'root'@'localhost'IDENTIFIED BY 'MyNewPass';
flush privileges;

④、查询用户:

a)切换到mysql数据库

我不知道为什么workbench里不显示这个数据库,但他真的有

b)查询user表

use mysql;
show databases;
select * from user;

⑤、忘记root密码怎么办?

1.cmd执行(管理员权限) :net stop MySQL

2.无验证方式启动mysql服务:mysql --skip-grant-tables

3.打开新的cmd窗口,输入mysql 直接回车登录成功

4.再新cmd中使用mysql数据库 :use mysql;

5.修改root密码。

6.关闭所有cmd

7.打开任务管理器 结束 mysqld.exe 这个进程

8.重启服务,新密码登录

2、权限管理

①、查询权限

show grants for '用户名'@'服务器';

<figcaption class="Image-caption" style="margin-top: 0.66667em; padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">这个用户除了登录没有任何权限</figcaption>

查询root发现他的权限无限大

②、授予权限

grant select on 数据库.表名 to '用户名'@'主机名';

授权后只有这张表他可以看

授予所有权限

grant ALL on *.* to '用户名'@'主机名';

常用权限有:

show privileges;显示结果---(权限操作分类)
    all(谨慎,包含管理数据库的权限)    授予某个级别特定的所有权限,除了grant option权限:表示自己有的权限授权给别人
    alter   允许使用alter table语句        级别:global、database、table(1、2、3)
    alter routine  允许修改或删除存储例程  级别:global、database、table(1、2、3)
    create   允许创建数据库和表
    create tablespace   允许创建、修改、删除表空间和日志文件组  级别:global
    create temporary tablespace  允许创建临时表   级别:global、database
    create user   允许使用create user、drop user、rename user、revoke all privileges语句    级别:global
    create viwe   允许创建和修改视图
    shutdown   允许使用mysqldmin shutdown    级别:global
    delete  允许删除表中的行
    drop    允许删除数据库、表、视图
    event   允许使用事件   mysql的时间调度-linux下的crontab
    execute 允许用户执行存储过程
    file    允许用户使用load data infile读写文件  级别:global
    grant option  允许把自己有的权限授权给其他用户或者从其他用户那里废除  级别:global、database、table、procedure、proxy
    index    允许创建或删除索引
    insert   允许向表中插入行
    lock tables 允许使用lock tables语句   级别:global、database
    process 允许使用show processlist语句查看正在运行的进程  级别:global

    proxy   允许用户代理  级别
    references  允许使用外键    级别:global、database、table、column
    reload  允许使用flush语句  级别:global
    select  允许查询表        级别:global、database、table、column
    show databases 允许使用show databases语句  级别:global
    show view 允许使用show create view语句     级别:global
    super  允许使用其他管理语句
    trigger   允许触发器操作
    update  允许更新表中的行      级别:global、database、table、column
    usage   "no privileges"的同义词

③、撤销权限

revoke select on 数据库.表名 from '用户名'@'主机名';
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343