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 ;中间没有逗号! 
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号