MySQL总结
目录
mysql启动
net start mysql80#在终端管理员中
mysql停止
net stop mysql80
mysql登陆
mysql [-h 127.0.0.1] [-P 3306] -u root -p
#127.0.0.1本机地址
- DDL语句(Data Definition Language)数据定义语言,用来定义数据库对象(数据库,表,字段)
- DML语句(Data Manipulation Language)数据操作语言,用来对数据库表中的数据进行增删改
- DQL语句(Data Query Language)数据查询语言,用来查询数据库中表的记录
- DCL语句(Data Control Language)数据控制语言,用来创建数据库用户,控制数据库的访问权限
DDL语句
查询所有数据库
SHOW DATABASES;
查询当前数据库
SELECT DATABASE();
切换数据库
USE 数据库名;
创建数据库
CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则];
创建表
CREATE TABLE 表名(
字段1 字段1类型[COMMENT '字段1的注释'],
字段2 字段2类型[COMMENT '字段2的注释'],
......
字段n 字段n类型[COMMENT '字段n的注释']#此处无','
)[COMMENT 表注释];
删除表
DROP DATABASE[IF EXISTS] 数据库名;
查询当前数据库所有表
SHOW TABLES;
查询表结构
DESC 表名;
查询指定表的键表语句
SHOW CREATE TABLE 表名;
123.45 精度:5 标度:2
age tinyint unsigned#无符号
score double(4,1)#长度为4,小数点后1位
定长字符串char(10)#满不满都是10B的空间,不满的用空格补位 性能较高
变长字符串varchar(10)#依据内容计算空间
记录birthday可以用date数据类型
添加字段
ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束];
修改数据类型
ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度);
修改字段名和字段类型
ALTER TABLE 表名 CHANGE 旧字段名 新字段名 类型(长度) [COMMENT 注释] [约束];
删除字段
ALTER TABLE 表名 DROP 字段名;
修改表名
ALTER TABLE 表名 RENAME TO 新表名;
删除表
DROP TABLE [IF EXISTS] 表名;
删除指定表,并重新创建该表
TRUNCATE TABLE 表名;
DML语句
给指定字段添加数据
INSERT INTO 表名(字段名1,字段名2,...)VALUES (值1,值2,...);
给全部字段添加数据
INSERT INTO 表名 VALUES (值1,值2,...);#需要注意一一对应
批量添加数据
INSERT INTO 表名(字段名1,字段名2,...) VALUES (值1,值2...),(值1,值2,...),(值1,值2...);
INSERT INTO 表名 VALUES(值1,值2...)(值1,值2...)(值1,值2,...);
UPDATE 表名 SET 字段名1=值1,字段名2=值2,...[WHERE 条件];#没写条件就代表要修改整张表的数据
DELETE FROM 表名 [WHERE 条件];#不加条件会删除整张表的所有数据
DQL语句
查询多个字段
SELECT 字段1,字段2,字段3... FROM 表名;
SELECT * FROM 表名;
设置别名
SELECT 字段1 [AS 别名1] 字段2 [AS 别名2]...FROM 表名;#AS可以省略
去重
SELECT DISTINCT 字段列表 FROM 表名;
查询特定数据
SELECT 字段列表 FROM 表名 WHERE 条件列表;
like 模糊匹配
'_'匹配单个字符
'%'匹配任意个字符
查询两个emp表中name两个字的人的信息
select * from emp where name like '__';
排序
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2;
排序方式:ASC 升序(默认值) DESC 降序
分页查询
SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数;
起始索引从0开始,起始索引等于(查询页码 - 1)* 每页显示记录数;
如果是第一页数据,起始索引可以省略不写
分组查询
SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING [分组后过滤条件];
where在分组之前进行过滤,不满足where不参与分组
having是分组之后对结果进行过滤
where不能对聚合函数进行判断,而having可以
where > 聚合函数 > having
DCL语句
查询用户
use mysql;
select * from user;
创建用户
CREATE USER ‘用户名’ @'用户名主机' IDENTIFIED BY '密码';
修改用户密码
ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码';
删除用户
DROP USER '用户名'@'主机名';
查询权限
SHOW GRANTS FOR '用户名'@'主机名' ;
授予权限
GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';
撤销权限
REVOKE 权限列表 ON 数据库.表名 FROM '用户名'@'主机名'
多表查询
笛卡尔积:集合A和集合B的所有组合情况 A * B
在多表查询时应消除无效的笛卡尔积
内连接
查询的是两张表交集的地方
隐式内连接
SELECT 字段列表 FROM 表1,表2 WHERE 条件...;
显示内连接
SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件 ...;
外连接
左外连接
SELECT 字段列表 FROM 表一 LEFT [OUTER] JOIN 表二 ON 条件...;
左外连接相当于查询表1(左表)的所有数据 包含表一和表二交集部分的数据
右外连接
SELECT 字段列表 FROM 表二 RIGHT [OUTER] JOIN 表二 ON 条件...;
右外连接可以转换为左外连接
自连接
必须起别名
SELECT 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件...;
自连接查询,可以是内连接查询,也可以是外连接查询
函数
字符串函数
concat(s1,s2,...sn)#字符串拼接
lower(str)
upper(str)
lpad(str,n,pad)左填充,pad对str左边进行填充,达到n的长度
rpad(str,n,pad)
trim(str)去除头部和尾部的空格
substring(str,start,len)#返回str从start开始len长度的字符串
数值函数
ceil(x)向上取整
floor(x)向下取整
mod(x)取模
rand()返回0~1的随机数
round(x,y)x四舍五入的值,保留y位小数
日期函数
curdate()返回当前日期
curtime()返回当前时间
now()返回当前日期和时间
year(date)获取指定date的年份
month(date)获取指定date的月份
day(date)获取指定date的日期
date_add(date,interval expr type)返回一个日期/时间值加上一个时间间隔expr后的时间值
datediff(date1,date2)返回date1和date2之间的天数 date1-date2
流程控制函数
if(value,t,f)如果value为t返回true否则false
ifnull(value1,value2)value1不为空则返回value1,否则返回value2
case when [val1] then [res1] ... else [default] end 如果val1为true则返回res1,...否则返回default
case [expr] when [val1] then [res1] ... else [default] end 如果expr的值等于val1,返回val1,...否则返回default默认值
聚合函数
将一列数据作为一个整体,纵向计算
函数名 | 作用 |
count | 统计数量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
null不参与聚合函数运算
约束
非空约束
NOT NULL
指示某列不能存储NULL值
唯一约束
UNIQUE
指示某列的每行必须有唯一的值
主键约束
PRIMARY KEY
NOT NULL 与 UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更快速的找到表中的一个特点的记录。
自增 AUTO_INCREMENT
默认约束
DEFAULT
指定没有给列赋值时的默认值
检查约束
CHECK
保证列中的值符合指定的条件
外键约束
FOREIGN KEY
保证一个表中的数据匹配另一个表中的值的参考完整性
在创建表时添加外键
create table 表名(
字段名 数据类型,
...
[constraint] [外键名称] foreign key(外键字段名) references 主表(主表列名);
);
创建表之后添加外键
alter table 表名 add constraint 外键名称 foreign key (外键字段名称) references 主表(主表列名);
删除外键
alter table 表名 drop foreign key 外键名称;
外键更新以及删除的规则
行为 | 功能 |
NO ACTION | 当父表中更新/删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许更新/删除。(与RESTRICT一致) |
RESTRICT | 当父表中更新/删除对应记录时,首先检查该记录是否有对应外键,如果有则不允许更新/删除。(与NO ACTION一致) |
CASCADE | 当父表中更新/删除对应记录时,首先检查该记录是否有对应外键,如果有,则也更新/删除外键在子表中的记录。 |
SET NULL | 当父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则将子表中的该外键值设置为NULL。(需要该外键值允许取NULL) |
SET DEFAULT | 父表有变更时,子表将外键设置成一个默认的值(InnoDB不支持) |
更新指令
ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;
更新为第三个
alter table emp add constraint fk_emp_dept_id foreign kry (dept_id) references dept(id) on update cascade on dalete cascade;
子查询
在sql语句中嵌套select语句,称为嵌套查询,又称为子查询
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
子查询外部可以是INSERT/UPDATE/DELETE/SELECT中的任意一个
子查询类型 | 功能 |
标量子查询 | 子查询返回的结果是单个值(数字,字符串,日期等) |
列子查询 | 返回的结果是一列 |
行子查询 | 子查询返回的结果为一行 |
表子查询 | 返回的结果为多行多列 |
常用操作符 | 功能 |
IN | 在指定的集合范围内多选一 |
NOT IN | 不在指定的范围内 |
ANY | 子查询返回列表中,有任意一个满足即可 |
SOME | 与ANY等同,使用SOME的地方都可以用ANY |
ALL | 子查询返回列表的所有值都必须满足 |
<> | 不等于 |
事务操作
是一组操作的集合,是一个不可分割的工作单位,会把所以操作作为一个整体一起向系统提交或者撤销请求,即要么同时成功要么同时失败
查看/设置事务提交方式
方式1
SELECT @@autocommit;#如果是自动提交则为1
SET @@autocommit 0;#改为手动提交
提交事务
COMMIT;
回滚事务
ROLLBACK;
方式二
开启事务
START TRANSACTION 或者BEGIN;
提交事务
COMMIT;(事务执行成功)
回滚事务
ROLLBACK;(事务执行失败)
事务四大特性(ACID)
- 原子性:事务是不可分割的最小操作单元,要么全部成功,要么全部失败
- 一致性:事务完成时,必须使所有的数据都保持一致状态
- 隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行
- 持久性:事务一旦提交或回滚,他对数据库中的数据的改变就是永久的
事务的隔离级别
并发事务问题
脏读:一个事务读到另一个事务还没有提交的数据
不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称不可重复读
幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据好像已经存在,好像出现了'幻影'
隔离级别 | 脏读 | 不可重复读 | 幻读 |
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable Read(默认) | × | × | √ |
Serializable | × | × | × |
查看事务的隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED(性能高,不安全)|READ COMMITTED|REPEATABLE READ|SERIALIZABLE(安全,性能低)}
#session代表会话级别,global代表对所有窗口有效
mysql体系结构
- 连接层
- 服务层
- 引擎层
- 存储层
存储引擎
默认存储引擎:InnoDB
show engines;#展示当前数据库支持的存储引擎
存储引擎特点
特点 | InnoDB | MyISAM | Memory |
存储限制 | 64TB | 有 | 有 |
事务安全 | 支持 | - | - |
锁机制 | 行锁 | 表锁 | 表锁 |
B+tree锁 | 支持 | 支持 | 支持 |
Hash索引 | - | - | 支持 |
全文索引 | 支持(5.6版本后) | 支持 | - |
空间使用 | 高 | 低 | N/A |
内存使用 | 高 | 低 | 中等 |
批量插入速度 | 低 | 高 | 高 |
支持外键 | 支持 | - | - |
存储引擎选择
在选择存储引擎时,应根据应用系统的特点选择合适的存储引擎。
InnoDB:是Mysql的默认存储引擎,支持事务,外键。如果应用对事务的完整性有较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新,删除操作,那么InnoDB存储引擎是比较合适的选择。
MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性,并发性要求不是很高,那么MyISAM存储引擎时比较合适的选择。
MEMORY:将所有的数据保存到内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。
Innodb与MyISAM区别
Innodb支持事务,MYISAM不支持,Innode支持行锁,MyISAM只支持表锁,Innodb支持外键,MyISAM不支持
索引
优势 | 劣势 |
提高数据检索的效率,降低数据的IO成本 | 索引列也是要占用空间的 |
通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗 | 索引大大提高了查询效率,同时也降低了更新表的速度,如进行INSERT,UPDATE,DELETE时效率降低 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix