目录
SQL分类
分类 | 全称 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户,控制数据库的访问权限 |
DDL
DDL 数据库操作
查询
查询所有数据库
java
SHOW DATABASES;
查询当前数据库
java
select database();
创建
java
create database [if not exists] 数据库名 [default charset 字符集] [ collate 排序规则];

这里的utf8mb4
支持4个字节的Unicode字符,覆盖了所有Unicode字符(包括emoji、特殊符号等),是MySQL推荐的字符集,完全兼容utf8(即utf8mb3),mb4表示max bytes 是4
删除
java
drop database [ if exists ] 数据库名;
使用
java
use 数据库名
DDL 表操作
查询当前数据库所有表
java
show tables;
查询表结构
java
desc 表名
查询指定表的建表语句
java
show create table 表名
创建
java
create table 表名(
字段1 类型[comment 注释]
...
字段n 类型[comment 注释]
)[comment 表注释];
java
create table tb_user(
id int comment '编号',
name varchar(50) comment '姓名',
age int comment '年龄',
gender varchar(1) comment '性别'
) comment '用户表';

数据类型
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型


char(10)和varcahr(10)区别
char(10):尽管只存储一个字符,也会占用10个字符的空间,未占用的空间会用空格补充
性能高
varchar(10):存储几个字符就占用几个字符空间
由于varchar在使用时会计算占用的空间,性能较差
java
用户名 username varchar(50)
性别 gender char(1)

设计一张员工信息表,要求如下:

java
create table emp_info(
id int comment '编号',
emp_no varchar(10) comment '员工工号',
emp_name varchar(10) comment '员工姓名',
gender char(1) comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号',
hiredate date comment '入职日期'
)comment '员工信息表'
;
修改
添加字段
java
alter table 表名 add 字段名 类型(长度) [comment 注释][约束]
修改数据类型
java
alter table 表名 modify 字段名 新数据类型(长度)
修改字段名和字段类型
java
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释][约束];


删除字段
java
alter table 表名 drop 字段名
修改表名
java
alter table 表名 rename to 新表名

删除表
java
drop table [if exists] 表名;

删除指定表,并重新创建该表
java
truncate table 表名

注意:在删除表时,表中的全部数据也会被删除
总结:

DDL语句是用来操作数据库表结构表中字段的
DML
用来完成数据的增删改
DML英文全称是Data Manipulation Lanuage
(数据操作语言),用来对数据库中表的数据记录进行增删改操作
添加数据(INSERT)
修改数据(UPDATE)
删除数据(DELETE)
添加数据
给指定字段添加数据
java
insert into 表名(字段名1,字段名2,...) values (值1,值2,...);
给全部字段添加数据
java
insert into 表名 values (值1,值2,..);
批量添加数据
java
insert into 表名(字段名1,字段名2,...) values (值1,值2,...),(值1,值2,...)
insert into 表名 values (值1,值2,...),(值1,值2,...)
注意:
插入数据时,指定的字段顺序需要与值得顺序是一一对应得
字符串和日期型数据应该包含在引号中
插入数据大小,应该在字段的规定范围内
修改数据
java
update 表名 set 字段名1 = 值1,字段名2 = 值2,....[WHERE 条件]




删除数据
java
delete from 表名 [ where 条件 ]
注意:
- delete 语句的条件可以有,也可以没有,如果没有,则会删除整张表的所有数据
- delete 语句不能删除某一个字段的值(可以使用update)




DQL
DQL英文全称是Data Query Language
,数据查询语言,用来查询数据库中表的记录
查询关键字:SELECT
java
select
字段列表
from
表名列表
where
条件列表
group by
分组字段列表
having
分组后条件列表
order by
排序字段列表
limit
分页参数
基本查询
查询多个字段
java
select 字段1,字段2,字段3... from 表名;
select * from 表名;
设置别名
java
select 字段1 [as 别名1],字段2 [as 别名2] ... from 表名;
去除重复记录
java
select distinct 字段列表 from 表名;
测试代码如下:
java
create table emp(
id int comment '编号',
workno varchar(10) comment '工号',
name varchar(10) comment '姓名',
gender char comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号',
workaddress varchar(50) comment '工作地址',
entrydate date comment '入职时间'
) comment '员工表';
insert into emp (id, workno, name, gender, age, idcard, workaddress, entrydate)
values (1, '1', '柳岩', '女', 20, '123456789012345678', '北京', '2000-01-01'),
(2, '2', '张无忌', '男', 18, '123456789012345670', '北京', '2005-09-01'),
(3, '3', '韦一笑', '男', 38, '123456789712345670', '上海', '2005-08-01'),
(4, '4', '赵敏', '女', 18, '123456757123845670', '北京', '2009-12-01'),
(5, '5', '小昭', '女', 16, '123456769012345678', '上海', '2007-07-01'),
(6, '6', '杨逍', '男', 28, '12345678931234567X', '北京', '2006-01-01'),
(7, '7', '范瑶', '男', 40, '123456789212345670', '北京', '2005-05-01'),
(8, '8', '黛绮丝', '女', 38, '123456157123645670', '天津', '2015-05-01'),
(9, '9', '范凉凉', '女', 45, '123156789012345678', '北京', '2010-04-01'),
(10, '10', '陈友谅', '男', 53, '123456789012345670', '上海', '2011-01-01'),
(11, '11', '张士诚', '男', 55, '123567897123465670', '江苏', '2015-05-01'),
(12, '12', '常遇春', '男', 32, '123446757152345670', '北京', '2004-02-01'),
(13, '13', '张三丰', '男', 88, '123656789012345678', '江苏', '2020-11-01'),
(14, '14', '灭绝', '女', 65, '123456719012345670', '西安', '2019-05-01'),
(15, '15', '胡青牛', '男', 70, '12345674971234567X', '西安', '2018-04-01'),
(16, '16', '周芷若', '女', 18, null, '北京', '2012-06-01');
查询所有字段返回
java
select id, workno, name, gender, age, idcard, workaddress, entrydate from emp;

或者
java
select * from emp;
注意:
在实际的开发环境中,尽量不要写*
,写*
不直观,而且会影响效率
数据库可以根据查询语句中的字段来使用合适的索引以加快查询速度。使用 select * 时,数据库很难精准优化查询,可能无法充分利用索引。例如,在一个包含多个字段的表中,仅对 id 和 name 字段建立了联合索引,当使用 select * 查询时,数据库可能无法直接利用该索引,导致查询效率降低。
条件查询
java
select 字段列表 from 表名 where 条件列表
条件


查询年龄等于18或20或40的员工信息

或

查询姓名为两个字的员工信息


查看身份证号最后一位是X的员工信息


聚合函数
count、max、min、avg、sum
将一列数据作为一个整体,进行纵向计算
java
select 聚合函数(字段列表) from 表名
注意:null 值不参与所有聚合函数运算

该行数据的idcard
为null,使用count(idcard)
进行统计时,该行不参与统计

分组查询
java
select 字段列表 from 表名 [where 条件] group by 分组字段名 [ having 分组后过滤条件];
where 与 having区别
- 执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤
- 判断条件不同:where不能对聚合函数进行判断,而having可以
根据性别分组,统计男性员工和女性员工的数量
java
select gender,count(*) from emp group by gender;

查询年龄小于45的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址
java
select workaddress,count(*) address_count from emp where age < 45 group by workaddress having address_count > 3;
注意:
执行顺序:where > 聚合函数 > having
分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义
排序查询
java
select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2;
排序方式
ASC:升序(默认值)
DESC:降序
注意:如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序
分页查询
java
select 字段列表 from 表名 limit 起始索引,查询记录数;
注意:
起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数
分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT
如果查询的是第一页数据,起始索引可以省略,直接简写为limit 10
查询第2页员工数据,每页展示10条记录

这里 limit 后面的第一个10表示起始索引,由于是第二页,每页查询的记录是10,所以起始索引为:(2-1) * 10 = 10
查询性别为男,并且年龄在20-40岁(含)以内的姓名为三个字的员工

执行顺序
编写顺序如下:
java
select
字段列表
from
表名列表
where
条件列表
group by
分组字段列表
having
分组后条件列表
order by
排序字段列表
limit
分页参数
执行顺序如下:
java
from
表名列表
where
条件列表
group by
分组字段列表
having
分组后条件列表
select
字段列表
order by
排序字段列表
limit
分页参数
DCL
DCL英文全称是Data Control Language
(数据控制语言)
用来管理数据库用户,控制数据库的访问权限
控制哪些用户可以访问数据库服务器,以及控制用户可以操作哪几个数据库
管理用户
查询用户
java
use mysql;
select * from user;

在mysql中用户的信息,用户所具有的权限的信息
创建用户
java
create user '用户名'@'主机名' identified by '密码';
主机名指的是在哪一个主机上,这个用户可以访问mysql

查看创建后用户

此时只能在当前主机进行访问

此时可通过任意主机进行访问
修改用户密码
java
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码';

删除用户
java
drop user '用户名'@'主机名'

注意:
主机名可以使用%通配
这类SQL开发人员操作的比较少,主要是DBA(Database Administrator)使用
权限控制
mysql中定义了很多种权限,但是常用的就以下几种

查询权限
java
show grants for '用户名'@'主机名'

USAGE 是 MySQL 中的一种特殊 "权限",表示 "无实际操作权限"(仅允许登录,不能查询、修改数据或执行其他操作)。它本质上是一种 "占位符权限",用于在不授予具体权限的情况下创建用户。
授予权限
java
grant 权限列表 on 数据库.表名 TO '用户名'@'主机名'

给'henry'@'%'
对于stu
数据库下所有表授予所有权限

给'henry'@'%'
所有数据库中所有表授予所有权限
撤销权限
java
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名'

注意:
多个权限之间,使用逗号分隔
授权时,数据库名和表名可以使用*
进行通配,代表所有