一,SQL语句的特点
不区分大小写,分为 DDL,DML,DQL,DCL 四个分支,注释格式为:
- /* */多行注释,
- #单行注释
注:
- DDL(Data definition Language)数据库定义(比如说表,数据库)
- DML(Data Mainpulation Language)数据库表的增删改
- DQL(Data Query Language)数据库数据的查询
- DCL(Data control Language)数据库权限的设置
二,数据类型
2.1 数字类型
| 整型类型 | 占用字节 |
|---|---|
| tinyint | 1 |
| smallint | 2 |
| mediumint | 3 |
| int | 4 |
| bigint | 8 |
| 浮点数类型 | 占用字节 |
|---|---|
| float | 4 |
| double | 8 |
| dectmal | 自定义 |
注: 浮点数写成
float(精度, 标度) 这种
123.45 这个数的精度是 5,标度是 2
dectmal 的大小取决于我们自己定义的精度和标度
2.2 字符串类型
| 字符串类型 | 占用字节 |
|---|---|
| char | 自定义 |
| varchar | 自定义 |
注: 字符串的写法是:
char(字节数)
其中 char 和 varchar 的区别
char(10) 即使你本身数据占用了 1 个字符其他会用空格补成 10 个字符的
varchar(10) 如果存储 1 个字符的他就占用一个字符
char 的性能会高一些,varchar 的性能会低一些因为 varchar 使用的时候要计算大小
| 二级制数据类型 | 文本数据类型 |
|---|---|
| tinyblob | tingtext |
| mediumblob | mediumtext |
| blob | text |
| longblob | longtext |
注:
- blob数据类型一般用来存储二进制数据比如说安装包,视频,音乐等
- text数据类型一般用来存储长文本内容
2.3 日期类型
| 日期数据类型 | 占用大小 | 描述 |
|---|---|---|
| date | 3 | 年-月-日 |
| time | 3 | 时-分-秒 |
| datetime | 8 | 年-月-日-时-分-秒- |
| year | 1 | 年 |
| timestamp | 4 | 年-月-日-时-分-秒 |
注:timestamp 最大是 2038 年 -1 月 -19 号
三,DDL语法
3.1 对数据库的操作
创建数据库
Create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则];
删除数据库
Drop database [if exists] 数据库名;
查询数据库
查询所有数据库
show databases;
查询当前所处的是哪个数据库
select database();
进入数据库
Use 数据库名;
3.2 对表的操作
查询表内有哪些字段
Desc 表名;
显示数据库内的所有表
Show tables;
查询表的创建语法是什么
Show create table;
创建表
Create table 表名(
字段1 数据类型 [comment 注释内容] [约束条件],
.......
字段n 数据类型 [comment 注释内容] [约束条件]
)[comment 注释内容] [charset 字符集] [engine=引擎名];
删除表
Drop table [if exists] 表名;
对表字段的添加
Alter table 表名 add 字段名 数据类型 [comment 注释] [约束条件];
对表字段的删除
Alter table 表名 drop 字段名;
对表字段的修改
Alter table 表名 change 旧字段 新字段 类型 [comment 注释] [约束条件];
对表的名字修改
Alter table 表名 rename to 新表名;
四,DML语法
4.1 Insert(插入数据)
语法
insert into 表名(字段列表) values(值列表),(值列表),(值列表).....;
如果要给全部字段添加值那么, 字段列表可以不加
insert into 表名 values(值列表);
注:字符串和日期要加引号,字段和值要一一对应
4.2 Update(更新数据)
语法
Update 表名 set 字段=值,字段=值.... [where 条件];
注:如果不加 where 条件就会对整个字段进行修改
4.3 Delete(删除数据)
语法
Delete from 表名 [where 条件];
注:
- 如果不加where条件就会删除全部数据
- delete是对表的整行进行删除
- 要删除一行内的某个字段数据,用update将其设置为none即可
五,DQL语法(重点)
5.1 基本查询
语法
select 字段列表 from 表名;
注:*,可以代表所有字段,一般不用 * 因为可能触发回表查询(详见索引应用)
5.2 条件查询
语法
select 字段列表 from 表名 where 条件;
条件:
| 符号 | 描述 |
|---|---|
| > | 大于 |
| < | 小于 |
| = | 等于 |
| >= | 大于等于 |
| <= | 小于等于 |
| !=或者<> | 不等于 |
| between A and B | 在a到b之内(包含A,B) |
| IN(值列表) | 在这些值之中(只要满足其中一个值即可) |
| Like '占位符' | %代表任意字符, _ 代表一个字符 |
| is NULL | 是null |
| 逻辑运算符 | 描述 |
|---|---|
| and 或写成&& | 多个条件同时成立 |
| or 或写成 || | 或者 |
| Not 或者写成 ! | 否定 |
注: 关于 is null 和 is none 涉及到 mysql 特有的三值逻辑
5.3 三值逻辑
5.3.1 Null的含义
NULL 用于表示缺失的值或遗漏的未知数据,不是某种具体类型的值。
数据表中的 NULL 值表示该值所处的字段为空,值为 NULL 的字段没有值,尤其要明白的是:NULL 值与 0 或者空字符串是不同的。
在日常建表的过程中,应该习惯加上 not null 约束来限制 null 的产生
5.3.2 两种NULL
在 SQL 中虽然只存在一种 null 但是我们讨论的时候将其分为两种 null,分别是:
- 未知(unknown)
就好比一个人带了墨镜我们不知道他眼睛是什么颜色这就叫未知 - 不适用(not applicable,inapp licable)。
就好比一个冰箱带了墨镜,或者问你男人生孩子的次数,这种情况就叫不适用
5.3.3 三值逻辑
主流语言 (c,c++,php 等) 只有 true 和 false 的俩个逻辑值,但是在 SQL 中还存在另外一个逻辑值unknown。组成了:对 (true),错 (false),不知道 (unknown)
unknown 分为:
- 逻辑值unknown,作为null的unknown
- 逻辑值unknown是一个明确的布尔值
- 作为null的unknown既不是值也不是变量
例如x=x,当x是逻辑值unknown的时候返回true,如果是作为null的unknown的时候返回的是unknown
5.3.4 逻辑值unknown的情况
假定 x 和 y 是 unknown,则 not x 也为 unknown,其他的记住优先级即可
-
AND 的情况:false > unknown > true
-
OR 的情况:true > unknown > false
比如 false and unknown 返回的就是 false 因为 false 的比较级更高!true and unknown 返回的是 unknown 因为 unknown 的比较级更高!or,同理。
5.3.5 = null和 is null的区别
对 NULL 使用比较谓词后得到的结果总是unknown。而查询结果只会包含 WHERE 子句里的判断结果为true的行,不会包含判断结果为 false 和 unknown 的行。
NULL 既不是值也不是变量。NULL 只是一个表示没有值的标记,而比较谓词只适用于值。故使用比较词给 null 是没有意义的!所以必须单独的使用 is null 来进行判定!
5.4 聚合函数
常见的聚合函数
| 名字 | 描述 |
|---|---|
| count(字段A) | 统计数量 |
| max(字段A) | 最大值 |
| min(字段A) | 最小值 |
| avg(字段A) | 平均数 |
| sum(字段A) | 求和 |
用法:select 聚合函数 from 表名,聚合函数一般配合分组查询使用
聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM( 字段名称))”形式的调用。
5.4 分组查询
语法
select 字段列表 from 表名 where 条件 group by 要分组的字段 having 条件;
注:
- 如果不用group by分组的话就是把全部数据放到同一组的意思
- where是分组前的过滤。Having是分组后的过滤
- 如果使用了分组查询,一半字段列表就是所分组的字段和一个聚合函数,其他的无意义。
- 执行顺序是 where->聚合函数->having
- 分组查询就好比将一个父表根据字段分成多个子表然后进行查询操作
- having后面可使用聚合函数作为查询条件,where不行。
5.5 排序查询
语法
select 字段列表 from 表名 order by 字段名 排序方法,字段名,排序方法....;
| 名子 | 描述 |
|---|---|
| Desc | 降序 |
| Asc | (默认)升序 |
注: 如果第一个字段值相同就按第二个字段进行排序
5.6 分页查询
语法
select 字段列表 from 表名 limit 起始索引 要查询记录条数;
起始索引值 = (要查询的页数–1)* 查询记录数
例如第二页有 10 条记录数, 起始索引就是 (2-1)*10=10
如果查询第一页数据直接 limit 10,不需要写起始索引
5.6 SQL执行顺序
5.6.1 编写顺序
select 字段列表 from 表名 where 条件 group by 分组字段名 having 条件 order by 排序字段 排序 limit 起始索引 查询记录数;
5.6.2 程序执行顺序
- from 表名 ->选择表
- where 条件 ->筛选表
- group by 字段 ->将表分组(相当于分成多个子表)
- having 条件 ->对已经分组后的表再一次进行条件筛选
- select 字段 ->选择要查询的字段
- order by 字段 顺序 ->选择表的排序
- limit 起始索引 查询记录数- >对完成后的表进行分页
六,DCL语法
6.1 管理用户
查询用户
在 mysql 中所有的用户都存在系统 mysql 数据库中, 故查询用户就查询mysql 的 user 表即可
Use mysql;进入
Select * from user;查询用户
创建用户
Create user '用户名'@'主机名' identified by '访问密码' ;
其中 主机名一般为一段 ip 地址,也可以写 localhost 代表本机
% 代表任意主机
修改访问密码
Alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';
删除用户
Drop user '用户名'@'主机名' ;
6.2 设置权限
显示用户有哪些权限
Show grants for '用户名'@'主机名';
给予用户权限
Grant 权限列表 on 数据库.表 to '用户名'@'主机名';
Grant all on 数据库1.* to '用户名'@'主机名'; #将数据库1中所有表的权限给用户
撤销用户权限
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
多个权限用逗号分割,* 代表所有权限
常见的权限
| 权限 | 说明 |
|---|---|
| ALL,ALL PRIVILEGES | 所有权限 |
| select | 查询数据权限 |
| INSERT | 插入数据权限 |
| Update | 更新数据权限 |
| Delete | 删除数据权限 |
| Alter | 修改表的权限 |
| Drop | 删除,数据库/视图/表的权限 |
| Create | 创建数据库/表的权限 |