当前位置:首页 > IT技术 > 数据库 > 正文

[数据库 03] 数据操作
2021-11-30 22:52:28

之前都是对数据库的数据表进行的操作,

之后都是对表中的数据进行操作:

MySQL数据操作


1. MySQL数据管理DML

1. 外键(不重要)

  1. 数据库级别外键:不推荐

添加另一个表中的建过来:

-- 在创建表()的最后写:
key `FK_本表属性` (`本表属性`),
constraint `FK_本表属性` foreign key (`本表属性`) references `另外表名`(`另外表的属性`)

或者在表创建之后:

alter table `本表名` add constraint `FK_本表属性` foreign key(`属性名`) references `另外表名`(`另外表属性`) 
  1. 程序级别外键:推荐

2. DML语言(数据操作)

插入 insert:

-- 插入一个值
insert into `表名`(`属性1`,`属性2`) values(`属性1的值`,`属性2的值`)
-- 插入多行值
insert into `表名`(`属性1`,`属性2`) values(`属性1的值`,`属性2的值`),(`属性1的值`,`属性2的值`)

修改 update:修改数据一定要走索引(where后的数据是索引,否则事务未提交走的是表级锁

update `表名` set  `属性`="要修改的值" where `key` = 某个值 
-- 修改一行的多个值
update `表名` set `属性1`="value1",`属性2`="value2" where `key` = 某个值

where后的条件:=, <, >, <>是不等于,between...and...., and, or,

删除delete:

delete from `表名` where `属性`=`某个值`
-- 删除一张表的记录,
truncate `表名`

delete table `表名 和 truncate的区别

truncate更专业,auto_insc等属性重新计z数,而delete删除整张表的记录时,自增不重新计数。truncate不会影响事务

使用delete的区别:

InnoDB:自增存储在内存中,当重启mysql后,自增也从初始值开始,mysql80修复了;

MyISAM: 自增存储在文件中,重启mysql也从上一次删除的后续值进行

2. DQL查询语句

*** 重要***

select [ALL| DISTINCT] {table.field [as anotherName]} from
table_name
[left|right|inner join table2_name]
-- 顺序不能变
[where ]
[group by] -- 指定结果按照哪几个字段分组
[having] -- 过滤分组的记录必须满足的次要条件
[order by]
[limit {offset, row_count}];

1. 查询 去重

select语句:远古笔记

new:

--  函数concat(a, b), 可以做连接
select concat("name:", StudentName) as 新名字 from student;
-- 返回的结果为:
| 新名字|
|name:赵四|
-- select 语句也可以跟计算、系统变量、version()函数、等
select version();
select @@auto_increment_increment

2. 条件子句

条件:

where sno >1000 and sno < 2000;
where sno between 1000 and 2000;
where sno >1000 && sno < 2000;

模糊查询:

where name like '刘%'  -- like后面的一定要用单引号包起来

_ 匹配单个字符,% 匹配0~多个字符

in, is null, is not null

3. 联表查询JOIN

内连接(两边都符合条件)

自连接

外连接(左外,右外)

左外:左表为主表,左表中的数据全部出现,右边必须满足条件,所以左表会匹配到右表中没有的null(对右表更严格)

4. 分页 LIMIT 和排序 ORDER BY

分页:用于前端分页显示

  • 缓解数据库压力

limit语法:

-- limit 起始值,页面展示的数据条数
第n页:
limit (n-1)*pageSize, pageSize
eg:
1-100个数据
limit 0, 5 -- 第0个数据到第4个数据
limit 5, 5 -- 第5个数据到第9个数据(第二页)
limit 10,5 -- 第10个数据到第14个数据(第三页)

5. 子查询(不用)

本质:在where语句中,嵌套一个查询语句

select from
where xxx = (子查询语句) -- 先执行子查询,后执行外查询 

3. 函数

1. 常用函数

-- 数学运算
select abs(-8) -- 绝对值
select ceiling(9.4) -- 向上取整(常用),结果为10
select floor(9.4) -- 向下取整 9
select rand() -- 返回一个[0,1) 的随机数
-- 字符串
select char_length("") -- 字符串长度
替换,反转,大小写,用在操作中

-- 时间和日期函数
select current_date() -- 获取当前日期
select now() -- 获取 YYYY MM DD HH mm ss
select year(now()) -- 获取年,页可以获得月,日,时,分,秒
-- 系统
select system_user() -- 获取使用数据库的用户
select user() -- 同上
select version() 

2. 聚合函数

远古笔记

3. 数据库级别MD5加密

message digest algorithm 5th

MD5 不可逆

-- 写法
表: id name pwd
-- 插入时加密
insert into testTable values (1, "firstName", MD5("123456"))
-- (校验) 对用户传入的数据加密,比对加密后的值, 如果查出来就匹配
select * from testTable 
where name = "xiaoming" and pwd = MD5("用户的输入密码")

4. 事务

要么都成功,要么都失败

将一组SQL放到一个批次中去执行

事务原则:远古笔记 ACID

Transaction : 事务

Atomicity : 要么都成功,要么都失败

Consistency(最终一致性)事务前后数据完整性保证一致

Isolation :并发访问时,互不干扰

Durability : 事务一旦提交,写入数据库不可逆


事务级别:

丢失修改数据:t1修改,每提交,被t2修改给覆盖

读脏数据:t1修改,没有提交的时候t2读,t1回滚了,t2读到脏数据

不可重复读: t1读,没提交,t2修改,t1发现前后读不一致

幻读:同上,t2修改增加了一列

-- mysql默认开始事务,如果要手动提交事务, 手动关闭:
set autocommit = 0;
-- 事务开启:
start transaction;
	insert ....
	insert ...

commit; -- 提交 or
rollback; -- 回滚
-- 事务结束
set autocommit = 1;

-- 不重要
savepoint 保存点名
rollback to savepoint 保存点名 -- 也可以设置保存点, 最后回滚到保存点去。(事务没提交,保存点也没用)
release savepoint 保存点名 -- 删除保存点

5. 索引

** B+树

两个连接:用explain命令查看使用索引时搜索的行数(对比不同)

CodingLabs - MySQL索引背后的数据结构及算法原理

(13条消息) 【MySQL优化】——看懂explain_漫漫长途,终有回转;余味苦涩,终有回甘-CSDN博客_explain

索引:帮助Mysql高效获取数据的数据结构,(索引是数据结构)

1. 索引分类:

  • 主键索引:primary key
    • 一张表只能由一个主键索引,但主键索引可以是多列
  • 唯一索引: unique key
    • 唯一索引是被索引的列中,不允许有相同的行值;一个表可以有多个列是唯一索引
  • 常规索引: key/index
    • 默认
  • 全文索引: FullText
    • 特定的引擎才有,MyISAM有

2. 测试索引:

explain 执行语句; -- 可以显示查询次数等

3. 索引原则:

  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量不需要加索引
  • 索引一般加在常用来查询的字段上。

索引的数据结构:


Hash类型的索引

BTree:InnoDB 默认

6. 权限管理和备份

1. 用户管理

SQLyog可视化管理:(点击小人,新建用户,下一页是权限选择)

sql管理:找mysql下的user表本质还是对mysql.user进行增删改查

-- 创建一个用户
CREATE USER kuangsheng IDENTIFIED BY '123456';
-- 修改密码
SET PASSWORD = PASSWORD('xinmima') -- 修改当前版本密码
SET PASSWORD FOR kuangsheng = PASSWORD('xinmima') -- 修改某用户密码
-- 重命名用户名
RENAME
-- 用户授权
GRANT 
-- 撤销权限
REVOKE
-- 删除用户
DROP USER

2. 数据库备份

保证数据不丢失,数据转移

Mysql数据库备份的方式:

  1. 拷贝物理文件

  2. SQLyog可视化导出

    • 想要导出的表右键备份或导出,
  3. 命令行导出 mysqldump

    # mysqldump -h主机,-u用户名,-p密码 ,数据库 表,> 导出到的地址/文件名
    mysqldump -hlocalhost -uroot -p123456 school student > 地址/文件名
    # 导入:在cmd中登录到mysql>下,:
    source 地址/文件名.sql
    

7. 数据库的归约,三大范式

前端: ant design网站

1NF(原子性):数据库中每一列都是不可分割的原子数据项

2NF:(对主键没有部分依赖):每张表只描述一件事情

3NF: (直接依赖, 没有传递依赖

规范性和性能问题

本文摘自 :https://www.cnblogs.com/

开通会员,享受整站包年服务立即开通 >