之前都是对数据库的数据表进行的操作,
之后都是对表中的数据进行操作:
MySQL数据操作
1. MySQL数据管理DML
1. 外键(不重要)
- 数据库级别外键:不推荐
添加另一个表中的建过来:
-- 在创建表()的最后写:
key `FK_本表属性` (`本表属性`),
constraint `FK_本表属性` foreign key (`本表属性`) references `另外表名`(`另外表的属性`)
或者在表创建之后:
alter table `本表名` add constraint `FK_本表属性` foreign key(`属性名`) references `另外表名`(`另外表属性`)
- 程序级别外键:推荐
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数据库备份的方式:
-
拷贝物理文件
-
SQLyog可视化导出
- 想要导出的表右键备份或导出,
-
命令行导出 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/