【MySQL】SQL的分类

目录

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 '用户名'@'主机名'

注意:

多个权限之间,使用逗号分隔

授权时,数据库名和表名可以使用*进行通配,代表所有

相关推荐
Hello.Reader3 小时前
Flink 作业测试依赖、MiniCluster、DataStream 与 Table/SQL 上手
大数据·sql·flink
BD_Marathon3 小时前
【MySQL】函数
android·数据库·mysql
她说..5 小时前
Redis项目应用总结(苍穹外卖/黑马头条/乐尚代驾)
java·数据库·redis·缓存·消息队列·redisson·geo
蒋士峰DBA修行之路5 小时前
实验二十 GaussDB逻辑备份恢复实验
数据库·gaussdb
gsfl5 小时前
Redis 常见面试题
数据库·redis·缓存
musenh5 小时前
mysql多表查询
mysql
Morpheon7 小时前
A Guide to Data System Storage: From Basics to Advanced File Structures
数据库
Penge6667 小时前
MySQL-隐式类型转换的 “隐形陷阱”
后端·mysql