SQL语句的特点
- 不区分大小写
- 分为DDL,DML,DQL,DCL四个分支
- 注释格式为/* */多行注释和#单行注释
注:
DDL(Data definition Language)数据库定义(比如说表,数据库)
DML(Data Mainpulation Language)数据库表的增删改查
DQL(Data Query Language)数据库数据的查询
DCL(Data control Language)数据库权限的设置
数据类型
数字类型
整型类型 | 占用字节 |
---|---|
tinyint | 1 |
smallint | 2 |
mediumint | 3 |
int | 4 |
bigint | 8 |
浮点数类型 | 占用字节 |
---|---|
float | 4 |
double | 8 |
dectmal | 自定义 |
注:
浮点数写成
float(精度,标度)这种
123.45这个数的精度是5,标度是2
dectmal的大小取决于我们自己定义的精度和标度
字符串类型
字符串类型 | 占用字节 |
---|---|
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数据类型一般用来存储长文本内容
日期类型
日期数据类型 | 占用大小 | 描述 |
---|---|---|
data | 3 | 年-月-日 |
time | 3 | 时-分-秒 |
datatime | 8 | 年-月-日-时-分-秒- |
year | 1 | 年 |
timestamp | 4 | 年-月-日-时-分-秒 |
注:
timestamp最大是2038年-1月-19号
DDL语法
1.对数据库的操作
创建数据库
Create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则];
删除数据库
Drop database [if exists] 数据库名;
查询数据库
查询所有数据库
show databases;
查询当前所处的是哪个数据库
select database();
进入数据库
Use 数据库名;
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语法
Insert(插入数据)
语法
insert into 表名(字段列表) values(值列表),(值列表),(值列表).....;
如果要给全部字段添加值那么,字段列表可以不加
insert into 表名 values(值列表);
注:
符串和日期要加引号,字段和值要一一对应
Update(更新数据)
语法
Update 表名 set 字段=值,字段=值.... [where 条件];
注:
如果不加where条件就会对整个字段进行修改
Delete(删除数据)
语法
Delete from 表名 [where 条件];
注:
- 如果不加where条件就会删除全部数据
- delete是对表的整行进行删除
- 要删除一行内的某个字段数据,用update将其设置为none即可
DQL语法
基本查询
语法
select 字段列表 from 表名;
注:
*可以代表所有字段,一般不用*因为可能触发回表查询(详见索引应用)
条件查询
语法
select 字段列表 from 表名 where 条件;
一些条件:
符号 | 描述 |
---|---|
> | 大于 |
< | 小于 |
= | 等于 |
>= | 大于等于 |
<= | 小于等于 |
!=或者<> | 不等于 |
between A and B | 在a到b之内(包含A,B) |
IN(值列表) | 在这些值之中(只要满足其中一个值即可) |
Like '占位符' | %代表任意字符, _ 代表一个字符 |
is NULL | 是null |
逻辑运算符 | 描述 |
---|---|
and 或写成&& | 多个条件同时成立 |
or 或写成 || | 或者 |
Not 或者写成 ! | 否定 |
注:
关于is null和is none涉及到mysql特有的三值逻辑
三值逻辑和null(重要!!)
Null的含义
NULL 用于表示缺失的值或遗漏的未知数据,不是某种具体类型的值。
数据表中的 NULL 值表示该值所处的字段为空,值为 NULL 的字段没有值,尤其要明白的是:NULL 值与 0 或者空字符串是不同的。
俩种NULL
在SQL中虽然只存在一种null但是我们讨论的时候将其分为俩种null
分别是
- 未知(unknown)
就好比一个人带了墨镜我们不知道他眼睛是什么颜色这就叫未知 - 不适用(not applicable,inapp licable)。
就好比一个冰箱带了墨镜,或者问你男人生孩子的次数,这种情况就叫不适用
三值逻辑
主流语言(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
逻辑值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同理
=null和 is null的区别
对于null如果使用=,>,<等比较词的时候返回的值都是unknown
而查询结果只会包含 WHERE 子句里的判断结果为 true 的行,不会包含判断结果为 false 和 unknown 的行。
NULL 既不是值也不是变量。NULL 只是一个表示没有值的标记,而比较谓词只适用于值。
故使用比较词给null是没有意义的!
聚合函数
常见的聚合函数
名字 | 描述 |
---|---|
count(字段A) | 统计数量 |
max(字段A) | 最大值 |
min(字段A) | 最小值 |
avg(字段A) | 平均数 |
sum(字段A) | 求和 |
用法:select 聚合函数 from 表名;
一般配合分组查询使用
分组查询
语法
select 字段列表 from 表名 where 条件 group by 要分组的字段 having 条件;
注:
- 如果不用group by分组的话就是把全部数据放到同一组的意思
- where是分组前的过滤。Having是分组后的过滤
- 比如说以男,女分组并统计男女的年龄的平均数
- 查询的函数一般为分组的字段和聚合函数,查询其他的无意义
- 执行顺序是 where->聚合函数->having
- 分组查询就好比将一个父表根据字段分成多个子表然后进行查询操作
排序查询
语法
select 字段列表 from 表名 order by 字段名 排序方法,字段名,排序方法....;
名子 | 描述 |
---|---|
Desc | 降序 |
Asc | (默认)升序 |
注:
如果第一个字段值相同就按第二个字段进行排序
分页查询
语法
select 字段列表 from 表名 limit 起始索引 要查询记录条数;
起始索引值=(要查询的页数–1)查询记录数
例如第二页有10条记录数,起始索引就是(2-1)10=10
如果查询第一页数据直接 limit 10,不需要写起始索引
执行顺序
编写顺序
select 字段列表 from 表名 where 条件 group by 分组字段名 having 条件 order by 排序字段 排序 limit 起始索引 查询记录数;
程序执行顺序
- from 表名 ->选择表
- where 条件 ->筛选表
- group by 字段 ->将表分组(相当于分成多个子表)
- having 条件 ->对已经分组后的表再一次进行条件筛选
- select 字段 ->选择要查询的字段
- order by 字段 顺序 ->选择表的排序
- limit 起始索引 查询记录数- >对完成后的表进行分页
DCL语法
管理用户
查询用户
在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 '用户名'@'主机名' ;
设置权限
显示用户有哪些权限
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 | 创建数据库/表的权限 |