MYSQL基础
DDL语句
数据库相关
- SHOW DATABASES; 展示所有的数据库
- SELECT DATABASE(); 查询当前使用的数据库
- CREATE DATABASE [IF NOT EXISTS] 数据库名 [CHARACTER SET 字符集 ] [COLLATE 排列顺序];
- USE 数据库名 使用哪个数据库
- DROP DATABASE IF EXISTS 数据库名;
表
- CREATE TABLE 表名(
列名 VARCHAR(255) COMMENT '注释',
列名 INT AUTO_INCREMENT PRIMARY KEY,
列名 INT NOT NULL UNIQUE,
FOREIGN KEY(列名) REFERENCES 表名(列名)
) COMMENT '表的注释'; - desc 表名 查看表结构
- show create table 表名 展示建表语句
- 修改表结构
- ALTER 表名 ADD 字段名 字段类型;
- ALTER 表名 MODIFY 字段名 新的字段类型 修改某个字段的类型
- ALTER 表名 CHANGE 旧字段名 新字段名 新字段类型 修改某个列名以及字段类型
- ALTER 表名 RENAME TO 新表名 重命名表名
- 删除表
- DROP TABLE 表名 完全删除表
- TRUNCATE TABLE 表名 删除表中的数据,保留表结构
实际开发中为什么很少用外键?
为什么实际开发中不使用外键_实际开发中会用外键吗-CSDN博客
- 在分布式环境下很难保证数据的插入顺序,调用不同的模块写入数据库时的数据顺序
- 在分库分表时没法使用外键
- 强阻塞 影响插入删除性能
DML语句
增删改查
- INSERT INTO 表名(列名,列名,......) VALUES(值1,值2,值3,......);
- DELETE FROM 表名 WHERE 条件;
- UPDATE 表名 SET 列名=值1,列名2=值2,....... WHERE 更新条件;
- SELECT * FROM 表名 WHERE 查询条件;
DQL 查询语句
基础使用
- SELECT * FROM 表名 WHERE 查询条件;
- SELECT DISTINCT 列名【AS】 别名,列名2【AS】 别名2 FROM 表名 WHERE 查询条件;
- DISTINCT 关键字对查询结果进行去重
- 条件运算符
-
< = >= <= != <>
- BETWEEN......AND.....
- IN(.......)
- LIKE %匹配任意字符 _代表单个字符
- IS NULL
- AND &&
- OR ||
- NOT !
-
聚合函数
- 将一列数据进行纵向的运算,所有的NULL值不参与计算
- count
- max
- min
- avg
- sum
分组查询 GROUP BY
- SELECT * FROM 表名 WHERE 查询条件 GROUP BY 分组列名 【HAVING 分组之后的过滤条件】
- where 和 having 的区别
- where在分组前进行过滤,不符合条件的结果不参与分组,having是分组后对结果集进行过滤
- where不能对聚合函数进行过滤,having可以
排序 ORDER BY
- SELECT * FROM 表名 WHERE 查询条件 ORDER BY 列名1 排序方式1 ,列名2 排序方式2......;
- 排序方式 asc升序 desc降序
分页查询 LIMIT
- LIMIT 起始值,记录数
- 分页查询是数据库的方言,不同的数据库实现可能不同
SELECT语句的执行顺序
- from
- on
- join
- where
- group by
- having
- select
- order by
- limit
DCL 数据控制语言
查询用户
- use mysql;
- select * from user;
添加用户
- create user 用户名@主机名 identified by 密码;
- 主机名 localhost只能本地访问 %代表任意主机能够访问
修改用户密码
- alter user 用户名@主机名 identified with mysql_native_password by 新密码;
删除用户
- drop user 用户名@主机名;
查询用户所拥有的权限
- show grants for 用户名@主机名;
修改用户权限
- grant 权限列表 on 数据库名.表名 to 用户名@主机名;
- grant all on *.* to 用户名@主机名; 授予所有权限
撤销权限
- revoke 权限列表 on 数据库名.表名 from 用户名@主机名;
内置函数
字符串函数
- concat(s1,s2,s3,......) 字符串拼接函数 s1+s2+s3.....
- lower(str) 转小写
- upper(str) 转大写
- lpad(str,n,pad) 左填充 用pad字符串对str进行左填充直到达到n个字符长度
- rpad(str,n,pad) 右填充
- trim() 去掉字符串前后的空格
- substring(str,start,len) 截取子串
数字函数
- round(x,y)求参数x的四舍五入值,保留y位小数
- mod 取模
- rand 返回0~1的随机数
- ceil 向上取整
- floor 向下取整
日期函数
- curdate 当前日期
- curtime 当前时间
- now 当前日期时间
- year(now()) 获取年份
- month(now()) 获取月份
- day(now()) 获取日期
- date_add(起始时间,INTERVAL 时间间隔 时间单位) 例如 date_add(now(),INTERVAL 30 MONTH) 从现在向后加30个月
- datediff(date1,date2) 返回两个日期之间相差的天数
流程控制函数
- if(value,t,f) 如果value为true返回t否则返回f
- ifnull(value1,value2) 如果value1为NULL返回value2否则返回value1
- case when
约束
- 非空 not null
- 唯一 unique
- 主键 primary key
- 外键 foreign key 能保证数据的一致性和完整性
- set null 如果外键指向的记录被删除则会将这个字段置为null
- case 级联 如果外键指向的记录被删除则会将本条数据也删除 很危险啊这种
多表查询
关系
- 1对1 一般用来单表的拆分
- 1对多
连接查询 join on
- 内连接 【inner】join 不写join 表1,表2 这样是隐式内连接 两个表交集的数据
- 左外连接 left join 表1 on 表2 左边表的全部数据和交集的数据
- 右外连接 right join 表1 on 表2 右边表的全部数据和交集的数据
- 自连接 【left/right】join 表A 别名A on 表A 别名B 这种一般用于这个表中存在层级关系那种 例如 员工表字段有 员工ID,领导ID 如果需要查询员工信息和所属领导的信息就用到自连接
联合查询 union union all
- select1 union select2
- union all 将查询的结果直接进行合并
- union 先去重再合并
嵌套查询(子查询)
- 子查询可以放在 from where select之后
- 唉 又想起了以前写又臭又长sql的日子 真是狗屎啊 怎么会有把业务逻辑用sql来实现啊
事务
事务要么全部成功要么全部失败,和java那边学习的事务差不多
操作
- 查看自动提交状态 select @@autocommit
- 设置mysql是否自动提交 mysql默认是自动提交 set @@autocommit = 0/1;
- 开启事务 begin
- 提交 commit
- 回滚 rollback
ACID(面试可能会问)
- **原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败。
- **一致性(Consistency):事务执行前后,数据库的状态保持一致。
- 隔离性(Isolation):多个事务并发执行时,彼此之间互不干扰。
- 持久性(Durability):事务提交后,对数据库的修改是永久性的。
并发事务问题
- 脏读 一个事务读到另一个事务未提交的数据
- 不可重复读 一个数据先后读取同一条数据但是两次返回的结果不同
- 幻读 幻读是指一个事务在读取某个范围内的数据时,其他事务插入了新数据,导致当前事务再次读取时发现了新的“幻影行”。
隔离级别
- 读未提交 READ UNCOMMITTED 允许读取未提交的数据 三种问题都会出现
- 读已提交 READ COMMITTED 只能读取已提交的数据 解决脏读
- 可重复读(mysql 默认) REPEATABLE READ 确保同一事务中多次读取同一数据的结果一致。 解决脏读,不可重复读
- 串行化 SERIALIZABLE 最高隔离级别,确保事务串行执行。解决幻读
- 设置事务隔离级别:
- SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

浙公网安备 33010602011771号