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;
posted @ 2026-01-21 16:57  lyfa  阅读(2)  评论(0)    收藏  举报