MYSQL的回忆录(适合有基础的小伙伴看,没基础的看着估计够呛)
SQL分类
MYSQL的数据类型
Text 类型
数据类型 | 描述 |
---|---|
CHAR(size) | 保存固定长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的长度。最多 255 个字符。 |
VARCHAR(size) | 保存可变长度的字符串(可包含字母、数字以及特殊字符)。在括号中指定字符串的最大长度。最多 255 个字符。注释:如果值的长度大于 255,则被转换为 TEXT 类型。 |
TINYTEXT | 存放最大长度为 255 个字符的字符串。 |
TEXT | 存放最大长度为 65,535 个字符的字符串。 |
BLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。 |
MEDIUMTEXT | 存放最大长度为 16,777,215 个字符的字符串。 |
MEDIUMBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。 |
LONGTEXT | 存放最大长度为 4,294,967,295 个字符的字符串。 |
LONGBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。 |
ENUM(x,y,z,etc.) | 允许你输入可能值的列表。可以在 ENUM 列表中列出最大 65535 个值。如果列表中不存在插入的值,则插入空值。注释:这些值是按照你输入的顺序存储的。可以按照此格式输入可能的值:ENUM('X','Y','Z') |
SET | 与 ENUM 类似,SET 最多只能包含 64 个列表项,不过 SET 可存储一个以上的值。 |
Number 类型:
数据类型 | 描述 |
---|---|
TINYINT(size) | -128 到 127 常规。0 到 255 无符号*。在括号中规定最大位数。 |
SMALLINT(size) | -32768 到 32767 常规。0 到 65535 无符号*。在括号中规定最大位数。 |
MEDIUMINT(size) | -8388608 到 8388607 普通。0 to 16777215 无符号*。在括号中规定最大位数。 |
INT(size) | -2147483648 到 2147483647 常规。0 到 4294967295 无符号*。在括号中规定最大位数。 |
BIGINT(size) | -9223372036854775808 到 9223372036854775807 常规。0 到 18446744073709551615 无符号*。在括号中规定最大位数。 |
FLOAT(size,d) | 带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DOUBLE(size,d) | 带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 |
DECIMAL(size,d) | 作为字符串存储的 DOUBLE 类型,允许固定的小数点。 |
* 这些整数类型拥有额外的选项 UNSIGNED。通常,整数可以是负数或正数。如果添加 UNSIGNED 属性,那么范围将从 0 开始,而不是某个负数。
Date 类型:
数据类型 | 描述 |
---|---|
DATE() | 日期。格式:YYYY-MM-DD注释:支持的范围是从 '1000-01-01' 到 '9999-12-31' |
DATETIME() | *日期和时间的组合。格式:YYYY-MM-DD HH:MM:SS注释:支持的范围是从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59' |
TIMESTAMP() | *时间戳。TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的描述来存储。格式:YYYY-MM-DD HH:MM:SS注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC ………………不写的话自动生成当前系统时间 |
TIME() | 时间。格式:HH:MM:SS注释:支持的范围是从 '-838:59:59' 到 '838:59:59' |
YEAR() | 2 位或 4 位格式的年。注释:4 位格式所允许的值:1901 到 2155。2 位格式所允许的值:70 到 69,表示从 1970 到 2069。 |
* 即便 DATETIME 和 TIMESTAMP 返回相同的格式,它们的工作方式很不同。在 INSERT 或 UPDATE 查询中,TIMESTAMP 自动把自身设置为当前的日期和时间。TIMESTAMP 也接受不同的格式,比如 YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD 或 YYMMDD。
DDL
数据定义语言,用来定义数据库对象;数据库,表,列等,关键字,create,drop,alter等
操作数据库(CRUD)
1,C(Create):创建
创建数据库:
create database 数据库名;
第二种,先判断是否存在同名数据库:
create database if not exists 数据库名;
第三种,指定字符集的创建方法:
create database 数据库名 character set 字符集;
第二种和第三种可以连起来用
练习:
创建一个名叫db1的数据库,判断是否存在,并设置字符集为gbk
create database if not exists db1 character set gbk;
2,R(Rertieve):查询
查询所有数据库的名称:
show databases;
查看创建某个数据库的语句(字符集):
show create datebase 数据库名;
3,U(Update):修改
修改数据库的字符集
alter database 数据库名 character set 字符集;
这里做个小说明,utf-8 只能写成 utf8
4,D(Delete):删除
删除数据库:
drop database 数据库名;
这里也可以和创建哪里一样,先判断一下存不存在,再进行删除
5,使用数据库
查询当前正在使用的数据库名称
select database();
使用数据库
use 数据库名;
操作表
-
C(create):创建
创建表语法:
create table 表名( 列名1 数据类型, 列名2 数据类型, ………… 列名n 数据类型 ); 最后一个列不需要加逗号
复制一个表:
create table 表名 like 被复制的表名;
-
R(Retrieve): 查询
查询某个数据库中所有的表名称:
show tabales;
查询表结构:
desc 表名;
-
U(Update): 修改
修改表名
alter table 表名 rename to 新得表名
修改表的字符集
alter table 表名 character set 字符集;
添加一列
alter table 表名 add 列名 数据类型;
修改列名称 类型
alter table 表名 change 列名 修改后的新列名 新数据类型
只改数据类型
alter table 表名 modify 列名 新的数据类型
删除列
alter table 表名 drop 列名;
-
D(Delete): 删除
删除表:
drop table 表名;
同样可以先判断是否存在
drop table if exists 表名;
DML
数据操作语言,用来对数据库中表的数据进行增删改,关键字,insert,delete,updata等
添加数据:
语法:
insert into 表名(列名1,列名2,……列名n) values(值1,值2,……值n);
注意事项:
-
列名和数据要一一对应
-
如果表名后,不定义列名,则默认给所有列添加值,例
insert into 表名 values(值1,值2,……值n)
-
输了数字类型,其他类型都需要使用引号引起来,单双引号都可以
-
删除数据:
语法:
delete from 表名 where 条件;
注意事件:
如果不加条件,则删除表中所有数据,
如果真的有这种删除所有数据的需求也请不要这样用,
因为表中有多少条数据,计算机就会执行多少次命令,如果数据太多,会导致很卡,
建议使用:
truncate table 表名
意思是删除表,然后创建一个一模一样的空表 这样的话计算机的执行次数就会少很多!效率高
修改数据:
语法:
update 表名 set 列名1 = 值1 , 列名2 = 值2 , …… where 满足的条件
注意事项:
如果不加条件,会将表中,列的值全部修改!
DQL
数据查询语言,用来处查询数据库中表的记录(数据),关键字:select,where
查询的具体语法:
select
字段列表(列名)
from
表名列表
where
条件列表
group by
分组字段
having
分组之后的条件
order by
排序
limit
分页限定
基础查询:
查询表内所有数据
select * from 表名;
查询多个字段
select
列名1,
列名2,
…………
列名n
from
表名;
去除重复的结果集
select distinct
列名
from
表名;
-------------------------------
查询结果完全相同时,才会去重,查多个列的时候,同一排必须有所字段都一样才能去重!
列计算
select
准备做计算的列名1,
准备做计算的列名2,
准备做计算的列名1+准备做计算的列名2
from
表名;
------------------------------------
如果存在有null的数据
建议使用
ifnull(准备做计算的列名2,如果有null替换的数据)
替换上面的代码为:
select
准备做计算的列名1,
准备做计算的列名2,
准备做计算的列名1+ifnull(准备做计算的列名2,0)//这里如果有null替换成0
from
表名;
起别名
select
列名1 AS 想展示的新列名1,
列名2 AS 想展示的新列名2
from
表名
条件查询
where子句后跟条件 ,运算符
-
>,<,<=,>=,=,<>
-
between……and
-
in(集合)
-
LIKE
-
IS NULL
-
AND 或 &&
-
or 或 ||
-
not 或 !
查询 age 字段大于20的数据
select * from 表名 where age>20;
查询 age 字段不等于20的数据
select * from 表名 where age!=20; select * from 表名 where age<>20; ---------------------------- 这两个都是不等于
查询 age 等于 20 的数据
select * from 表名 where age=20;
查询age 大于等于20 ,小于等于30
select * from 表名 where age>=20 && age<=30; select * from 表名 where age>=20 AND age<=30; select * from 表名 where age BETWEEN 20 AND 30; --------------------------------- 这三个都可以查到条件上面的
查询 age 为 19 , 25 , 22岁的数据
select * from 表名 where age =19 OR age=25 or age=22; select * from 表名 where age in(19,25,22); ----------------------------------- 还是一样,两个都能查到
查询age 为null的数据
这里要注意的是,null值不能用 = !=去判断,所以只能用is select * from 表名 age is null; 如果查询不为null select * from 表名 age is not null;
模糊查询LIKE
占位符:
_ :单个字符
% : 多个任意字符
假设查询name字段,姓马的人
select * from 表名 where name like '马%';
查询name字段 第二个是 化 的人
select * from 表名 where name like '_化%';
查询name 字段 是三个字的人
select * from 表名 where name like '___';//这里是三个_号
查询 name 字段包涵 马 的人
select * from 表名 where name like '%马%';
排序查询
语法: order by 子句
order by 排序字段 排序方式
也可以多个字段排序
order by 排序字段1 排序方式1,排序字段2 排序方式2
例1:按age排序
select * from 表名 order by age; 在不写排序方式的时候默认为升序 ASC 升序,默认额的 DESC 降序 select * from 表名 order by age DESC;
例2:按age排序,如果age相同,按math排序
select * from 表名 order by age DESC, math DESC;
聚合函数
将一列数据作为一个整体,进行一个计算
1,count : 计算个数
2,max :计算最大值
3,min : 计算最小数
4,sum :计算和
5,avg : 计算平均数
注意:聚合函数的计算,会排除null值
例1:判断 name 一共有多个条数据
select count(name) from 表名;
因为有可能存在空值,所以最好还是用ifnull 则为:
select count(ifnull(name,'无')) from 表名;
这里我把name字段里为null的值替换成了'无'
例2:找出 age 字段里的最大值和最小值
最大值:select max(age) from 表名; 最小值:select min(age) from 表名;
例3:计算 math 字段所有数据的和
select sum(math) from 表名;
例4:计算 age 字段的平均年龄
select avg(math) from 表名;
分组查询
语法: group by 分组字段;
注意,分组后的字段,只能写 分组字段 和 聚合函数字段
例1: 按照sex分组,然后查分组后的age的平均值
select sex, avg(age) from 表名 group by sex;
例2:按sex分组,然后查看男女的人数
select sex, count(sex) from 表名 group by sex;
例3:按例1分组,但age大于18才能参与分组
select sex, avg(age) from 表名 WHERE age>18 group by sex;
例4:按例1分组,并且查看男女人数,而且age大于18才能参与,并且在分组后,人数大于2才能显示
select sex, avg(age), count(sex) from 表名 where age>18 group by sex Having count(sex)>2;
where 和 having 的区别
-
where在分组之前进行判断,如果不满足,则不会参与分组。
-
having在分组之后判断,如果不满足,则不会显示出来
-
where不能进行聚合函数的判断,having可以进行聚合函数的判断
分页查询
语法: limit 开始的索引,每页查询的条数
例1: 每页显示3条记录
select * from 表名 limit 0,3;
公式:开始的索引=(当前页码-1)* 每页显示的条数
分页的操作是一个"方言",现在这个分页的语法,只在MYSQL里才能使用
-
约束
概念:对表中的数据进行限定,保证数据的完整性,正确性,有效性
-
约束的分类
-
主键约束:primary key
-
非空约束: not null
-
唯一约束:unique
-
外键约束: foreign key
非空约束的使用方法
1,创建表时使用约束,例
create table 表名( id int, name varchar(20) not null ----name不能为空 );
2,删除非空约束
alter table 表名 modify 列名 对应的数据类型;
3,创建表后添加非空约束
alter table 表名 modify 列名 对应的数据类型 not null;
唯一约束的使用方法
1,创建表时使用
create table 表名( id int unique, name varchar(20) );
2,创建表后使用
alter table 表名 modify 列名 对应的数据类型 nuique; 这里有可能会因为已经存在重复数据,导致添加不进去,所以得注意一下
3,删除唯一约束
alter table 表名 drop index 列名;
注意:
唯一约束可以有null,但只能又一条为null
主键约束
注意:添加主键约束,则表示非空且唯一!
一张表只能又一个主键!
主键就是表中的唯一标识
1,在创建表的时候添加主键约束
create table 表名( id int primary key, ------给id添加主键约束 name varchar(20) );
2,在创建后添加主键约束
alter table 表名 modify 列名 int primary key;
3,删除主键
alter table 表名 drop primary key;
自动增长
概念:如果某一列是数字类型,使用 auto_increment 可以来完成自动增长
例:在创建表的时候可以使用自动增长
create table 表名( id int primary key auto_increment, name varchar(20) );
注意:自动增长是根据上一条数据进行的判断,如果手动输入一个数,下一个数会根据上一个数加1
删除自动增长
alter table 表名 modify 列名 对应的数据类型;
添加自动增长
alter table 表名 modify 列名 对应的数据类型 auto_increment;
外键约束
外键可以为null,但不能为不存在的外键值
在创建表时可以添加外键
create table 表名( …… 外键列, constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称) );
这里的主表得先创建才行!
删除外键
alter table 表名 drop FOREIGN KEY 外键名; 这个外键名不是例名,在自己起的那个名称!
添加外键
alter table 表名 ADD constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称);
级联操作
这个需要在添加的时候设置级联
级联更新:
在上面那个添加外键后面添加 on update cascade ;
效果:修改主键值后,对应关联列,也会改变
添加代码如下:
alter table 表名 ADD constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)on update cascade ;
级联删除:
效果:删除主键后,对应关联列,也会删除(那一排都删除了)
在添加外键后面添加 on delete cascade;
alter table 表名 ADD constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)on delete cascade ;
级联更新和级联删除可以一起用
代码如下:
xxxxxxxxxx alter table 表名 ADD constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)on delete cascade on update cascade ;
中间没有逗号!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现