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 数据库名;

 

操作表

  1. C(create):创建

    创建表语法:

    create table 表名(
       列名1  数据类型,
       列名2  数据类型,
       …………
       列名n  数据类型
    );
    最后一个列不需要加逗号

    复制一个表:

    create table 表名 like 被复制的表名;
  2. R(Retrieve): 查询

    查询某个数据库中所有的表名称:

    show tabales;

    查询表结构:

    desc 表名;
  3. U(Update): 修改

    修改表名

    alter table 表名 rename to 新得表名

    修改表的字符集

    alter table 表名 character  set 字符集;

    添加一列

    alter table 表名 add 列名 数据类型;

    修改列名称 类型

    alter table 表名 change 列名 修改后的新列名 新数据类型

    只改数据类型

    alter table 表名  modify 列名 新的数据类型

    删除列

    alter table 表名 drop 列名;

     

  4. 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 的区别
    1. where在分组之前进行判断,如果不满足,则不会参与分组。

    2. having在分组之后判断,如果不满足,则不会显示出来

    3. 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 ;

    中间没有逗号!

posted @   牛杂刻师傅  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示