MySql笔记
什么是数据库
数据库(DB,database)概念:数据仓库,安装在操作系统之上的,可以存储大量的数据
作用:存储数据,管理数据
分类:
关系型数据库(SQL)
-
MySQL Oracle SQL server DB2…
通过表和表之间,行与列之间的关系进行数据的存储
非关系型数据库(NoSql)
-
redis MongDB
对象存储,通过对象自身的属性来决定
Mysql简介
MySQL是一个关系型数据库(DBMS),Oracle旗下产品,是一个开源的数据库管理软件
体积小,速度快,使用成本低
建议:安装MySQL不要使用exe安装,会进注册表,卸载很麻烦 使用压缩包安装会简单很多
- DML(Data Manipulation Language),即数据操纵语言,最常用的增删改查就属于DML,操作对象是数据表中的记录;
- DDL(Data Definition Language),即数据定义语言,例如建数据库、建表等,都属于数据定义语言,也是今天本文的主角;
- DCL(Data Control Language),数据控制语言,如Grant、Rollback等等,常见于数据库安全管理,多数人一般很少用。
- DQL (Data Query Language)数据查询语言
操作数据库
操作数据库->操作数据表->操作表中的数据
MySQL关键字不区分大小写
CREATE DATABASE [IF NOT EXISTS] 数据库名; --[]代表可选
DROP TABLE IF EXISTS 数据库名; --删除数据库
USE 数据库名; --切换数据库
SHOW DATABASE; --查看所有的数据库
数据库的列类型
数值型:
- tinyint 很小的数据 1个字节
- smallint 比较小的数据 2个字节
- mediumint 中等大小的数据 3个字节
- int 标准的正数 4个字节 (常用)
- bigint 较大的数据 8个字节
- float 浮点数 4个字节
- double 双精度浮点数 8个字节(会有精度问题)
- decimal 字符串形式的浮点数 (金融计算的时候一般使用decimal)
字符串:
- char 字符串固定大小 0-255
- varchar 可变字符串 0-65535(常用 相当于String)
- tinytext 微型文本 0-2^8-1
- text 文本 0-2^16-1
时间日期:
- Data YYYY-MM-DD 日期
- time HH:mm:ss 时间
- datatime YYYY-MM-DD HH:mm:ss 最常用的时间格式
- timestamp 时间戳 1970.1.1到现在的毫秒数
- year 年份表示
数据库的字段属性:
- unsigned 无符号整数 如果使用 则声明该列不能为负数
- zerofill 0填充 不足的位数使用0填充
- 自增(AUTO_INCREMENT) 自动在上一条记录的基础上+1 通常用来设计唯一的主键(可以自定义设置主键自增的起始值和步长) 必须是整数类型
- 非空 NULL 和 NOT NULL 如果字段为not null则不允许为空
数据库引擎
INNODB 默认使用 安全性高 支持事务 支持多表多用户操作
MYISAM 节约空间 速度较快
所有的创建和删除操作尽量加上判断
--修改表名
ALTER TABLE 旧表名 RENAME AS 新表名
--增加表的字段
ALTER TABLE 表名 ADD 字段名 列属性
--修改表的字段
ALTER TABLE 表名 MODIFY 字段名 列属性 --修改约束
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 --修改字段名
(MDIFY一般用来修改表的字段类型和约束 CHANGE用来修改字段名)
--删除表的字段
ALTER TABLE 表名 DROP 字段名
--删除表
DROP TABLE IF EXISTS 表名
--添加外键约束
ALTER TABLE 表名
ADD CONSTRAINT 约束名 FOREIGN KEY (`字段名`) REFERENCES `表名`(`字段名`);
--添加数据
INSERT INTO 表名(字段名) VALUES('值')
--插入多个字段,用逗号分隔
INSERT INTO 表名(字段名1,字段名2...) VALUES('值','值2',...),
('值','值2',...)
注意:
1.字段与字段之间用英文逗号隔开
2.字段名可以省略,但是后面的值需要一一对应
3.可以同时插入多条数据,VALUES后面的值需要用 , 隔开即(),()
--修改
UPDATE 表名 SET 列名='值',列名='值' WHERE 条件
--删除
DELETE FROM 表名 WHERE 条件
TRUNCATE命令,完全清空一个数据库表,表的结构和索引不变
TRUNCATE TABLE 表名
DELETE 和TRUNCATE的区别:
相同点:
都能删除数据,不会影响表结构
不同点:
TRUNCATE 重新设置自增列,计数器会归零
TRUNCATE不会影响事务
--查询语句(重点)
SELECT 字段 FROM 表名 --根据字段查询 *是通配符
--去重 DISTINCT(去除select语句查询出来的重复语句)
SELECT DISTINCT * FROM 表名
where条件子句
检索数据中符合条件的值
模糊查询
like结合%(%代表任意个字符) _(一个字符)
in :在某个范围内(具体的一个值或多个值)
联表查询
SELECT 字段名 FROM 表名
INNER JOIN 表名
ON 连接条件
分页和排序
ORDER BY(排序)
排序分为升序(ASC)和降序(DESC)
例:
SELECT 字段名 FROM 表名
INNER JOIN 表名
ON 连接条件
ORDER BY 字段 DESC/ASC
分页:可以缓解数据库压力,给别人的体验也更好
LIMIT 起始位置,pagesize
SELECT 字段名 FROM 表名
INNER JOIN 表名
ON 连接条件
ORDER BY 字段 DESC/ASC
LIMIT 起始位置,pagesize --起始位置等于(当前页-1)*pagesize
--数据总数/pagesize=总页数
分组:GROUP BY
HAVING
例:
SELECT 字段名...
FROM 表名
INNER JOIN 表名
ON 连接条件
GROUP BY 字段名 --根据什么来分组
HAVING 次要条件
子查询
本质上是在where语句中嵌套一个查询语句
事务
要么都成功 要么都失败
将一组sql 放在一个批次中去执行
事务原则:ACID原则
**原子性(原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。) **
一致性 (事务前后数据的完整性必须保持一致。)
隔离性 (事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。)
持久性(持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响)
参考链接:(16条消息) 事务ACID理解_dengjili的博客-CSDN博客_事务acid
隔离会导致一些问题:
如脏读
不可重复读
虚读
mysql是默认开启事务自动提交的
--关闭默认提交
set autocommit=0 --0是关闭 1是开启
start transaction; --开启事务
执行sql
commit --提交事务
rollback --回滚事务
set autocommit=1;
--首先开启事务 然后执行sql 如果执行完毕则提交事务
否则回滚事务 保持事务的原子性 一致性 持久性
索引
索引是帮助mysql高效获取数据的数据结构
分类:
- 主键索引 PRIMARY KEY
- 唯一标识 主键不可重复 只能有一个列作为主键
- 唯一索引 UNIQUE KEY
- 避免重复的列出现 唯一索引可以重复 多个列都可以标识为唯一索引
- 常规索引 KEY/INDEX
- 默认的
- 全文索引 FullText
- 在特定的数据库引擎下才有 快速定位数据
--在一张表中 主键索引只能有一个 唯一索引可以有多个
--增加一个全文索引
ALTER TABLE 表名 ADD FULLTEXT INDEX 索引名(列名)
--给表中的某个字段添加一个常规索引
CREATE INDEX 索引名 ON 表(字段)
索引在数据量少的时候用处不大,但是数据达到百万条时,区别就很明显了
索引原则
- 索引不是越多越好
- 不要对经常变动的数据加索引
- 数据量少的时候不需要加索引
- 索引一般加载经常用来查询的字段上
数据库三大范式
三大范式就是为了规范数据库的设计
第一范式:
要求数据库的每一列都是不可再分的原子数据项(保证数据的原子性)
第二范式:
前提:满足第一范式
每张表只描述一件事情
第三范式
前提:满足第一范式和第二范式
确保数据中的每一列都和主键直接相关,而不能间接相关