SQL

一、SQL简介

SQL是结构化查询语言,是一门操作关系型数据库的编程语言,定义操作所有关系型数据库的统一标准。

二、SQL通用语法

  • SQL语句可以单行或多行书写,以分号结尾。

  • SQL语句可以使用空格/缩进来增强语句的可读性。

  • MySQL数据库的SQL语句不区分大小写。

  • 注释:

单行注释:– 注释内容 或 # 注释内容(MySQL特有)

多行注释: /* 注释内容 */

三、SQL分类

SQL语句根据其功能被分为四大类:DDL、DML、DQL、DCL

分类 全称 说明
DDL Data Definition Language 数据定义语言,用来定义数据库对象(数据库,表,字段)
DML Data Manipulation Language 数据操作语言,用来对数据库表中的数据进行增删改
DQL Data Query Language 数据查询语言,用来查询数据库中表的记录
DCL Data Control Language 数据控制语言,用来创建数据库用户、控制数据库的访问权限

四、SQL-DDL

DDL 英文全称是Data Definition Language(数据定义语言),用来定义数据库对象(数据库,表,字段) 。

1.数据库操作操作

1)查询所有数据库

1
show database;

2)查询当前数据库

1
select database();

3)创建数据库

1
create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则];

可选参数解析:

if not exists 如果数据库名存在就不创建,如果不存在就创建,如果不加这个参数,那么创建重名数据库时会报错,加了这个参数后就不会报错了。

default charset指定当前数据库使用的字符集,比如utf-8

4)删除数据库

1
drop database [if exists] 数据库名;

如果删除一个不存在的数据库,将会报错。此时,可以加上参数 if exists ,如果数据库存在,再 执行删除,否则不执行删除。

5)切换数据库

1
use 数据库名;

我们要操作某一个数据库下的表时,就需要通过该指令,切换到对应的数据库下,否则是不能操作的。

2.表操作

2.1表操作-查询创建

1)查询当前数据库所有表

1
show tables;

2)查询指定表结构

1
desc 表名;

通过这条指令,我们可以查看到指定表的字段,字段的类型、是否可以为NULL,是否存在默认值等信息。

3)查询指定表的建表语句

1
show create table 表名;

通过这条指令,主要是用来查看建表语句的,而有部分参数我们在创建表的时候,并未指定也会查询到,因为这部分是数据库的默认值,如:存储引擎、字符集等。

4)创建表结构

1
2
3
4
5
6
7
create table 表名(
字段1 字段1类型 [comment 字段1注释],
字段2 字段2类型 [comment 字段2注释],
字段3 字段3类型 [comment 字段3注释],
......
字段n 字段n类型 [comment 字段n注释]
) [comment 表注释];

注意: [] 内为可选参数,最后一个字段后面没有逗号

2.2表操作-数据类型

在建表时我们需要用到数据类型,那么MySQL中有哪些常见的数据类型呢?

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

1)数值类型

MySQL 支持所有标准 SQL 数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC),以及近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)。

关键字INTINTEGER的同义词,关键字DECDECIMAL的同义词。

BIT数据类型保存位字段值,并且支持 MyISAM、MEMORY、InnoDBBDB表。

作为 SQL 标准的扩展,MySQL 也支持整数类型 TINYINT、MEDIUMINTBIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型 大小 范围(有符号) 范围(无符号) 用途
TINYINT 1 Bytes (-128,127) (0,255) 小整数值
SMALLINT 2 Bytes (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 Bytes (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 Bytes (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 Bytes (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 Bytes (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 Bytes (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 依赖于M和D的值 依赖于M和D的值 小数值

2)字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUMSET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途
CHAR 0-255 bytes 定长字符串
VARCHAR 0-65535 bytes 变长字符串
TINYBLOB 0-255 bytes 不超过 255 个字符的二进制字符串
TINYTEXT 0-255 bytes 短文本字符串
BLOB 0-65 535 bytes 二进制形式的长文本数据
TEXT 0-65 535 bytes 长文本数据
MEDIUMBLOB 0-16 777 215 bytes 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215 bytes 中等长度文本数据
LONGBLOB 0-4 294 967 295 bytes 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295 bytes 极大文本数据

charvarchar 都可以描述字符串,char是定长字符串,指定长度多长,就占用多少个字符,和字段值的长度无关 。而varchar是变长字符串,指定的长度为最大占用长度 。相对来说,char的性能会更高些。

3)日期时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR

每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。

TIMESTAMP类型有专有的自动更新特性。

类型 大小 ( bytes) 范围 格式 用途
DATE 3 1000-01-01/9999-12-31 YYYY-MM-DD 日期值
TIME 3 ‘-838:59:59’/‘838:59:59’ HH:MM:SS 时间值或持续时间
YEAR 1 1901/2155 YYYY 年份值
DATETIME 8 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’ YYYY-MM-DD hh:mm:ss 混合日期和时间值
TIMESTAMP 4 ‘1970-01-01 00:00:01’ UTC 到 ‘2038-01-19 03:14:07’ UTC结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYY-MM-DD hh:mm:ss 混合日期和时间值,时间戳

2.3表操作-修改

1)添加字段

1
alter table 表名 add 字段名 类型(长度) [comment 注释] [约束];

2)修改数据类型

1
alter table 表名 modify 字段名 新数据类型(长度);

3)修改字段名和字段类型

1
alter table 表名 change 旧字段名 新字段名 类型(长度) [comment 注释] [约束]

4)删除字段

1
alter table 表名 drop 字段名;

5)修改表名

1
alter table 表名 rename to 新表名;

2.4表操作-删除

1)删除表

1
drop table [if exists] 表名;

可选项 if exists 代表,只有表名存在时才会删除该表,表名不存在,则不执行删除操作(如果不 加该参数项,删除一张不存在的表,执行将会报错)。

2)删除指定表,并重新创建表

1
truncate table 表名;

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

这些语句写起来麻烦,也不够直观,我们可以使用图形化界面工具,比如Navicat DataGrip等工具。

五、SQL-DML

DML英文全称是Data Manipulation Language(数据操作语言),用来对数据库中表的数据记录进 行增、删、改操作。

  • 添加数据(INSERT)
  • 修改数据(UPDATE)
  • 删除数据(DELETE)

1.添加数据

1)给指定字段添加数据

1
insert into 表名 (字段名1,字段名2,...) values (值1,值2,...);

2)给全部字段添加数据

1
insert into 表名 values(值1,值2,...);

3)批量添加数据

1
2
3
insert into 表名 (字段名1,字段名2,...) values  (值1,值2,...),(值1,值2,...),(值1,值2,...);

insert into 表名 values (值1,值2,...),(值1,值2,...),(值1,值2,...);

注意事项:

  • 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
  • 字符串和日期型数据应该包含在引号中。
  • 插入的数据大小,应该在字段的规定范围内。

2.修改数据

1
update 表名 set 字段名1 =1, 字段名1 =1, ,... [where 条件];

注意事项:

修改语句的条件可以有,也可以没有,如果没有条件,则会修改整张表的所有数据。

3.删除数据

1
delete from 表名 [where 条件];

注意事项:

  • delete 语句的条件可以有,也可以没有,如果没有条件,则会删除整张表的所有数据。
  • delete 语句不能删除某一个字段的值(可以使用UPDATE,将该字段值置为NULL即可)。

六、SQL-DQL

DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据库中表的记 录。 查询关键字: select

完整的查询结构如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
字段列表
FROM
表名列表
WHERE
条件列表
GROUP BY
分组字段列表
HAVING
分组后条件列表
ORDER BY
排序字段列表
LIMIT
分页参数

1.基础查询(不带任何条件)

1)查询多个字段

查询指定字段:

1
select 字段1,字段2,字段3,... from 表名;

查询所有字段:

1
select * from 表名;

2)字段设置别名

1
select 字段1 [as 别名1], 字段2 [as 别名2], ... from 表名;
1
select 字段1 [别名1], 字段1 [别名1],... from 表名

3)去除重复记录

1
select distinct 字段列表 from 表名;

查询结果中不会出现重复的结果

2.条件查询(where)

1)语法:

1
select 字段列表 from 表名 where 条件列表;

2)条件:

常用的比较运算符:

运算符 含义
> 大于
>= 大于等于
< 小于
<= 小于等于
= 等于
<> 或 != 不等于
between … and … 在某个范围之内(含最小、最大值)
in(…) 值为in之后的列表内的
like 占位符 模糊匹配(_匹配单个字符,%匹配任意个字符)
is null 是null

常用的逻辑运算符:

运算符 含义
and 或 &&
or 或 ||
not 或 !

3.聚合函数(count, max,min,avg,sum)

聚合函数,就是将一列数据作为一个整体,进行纵向计算。

1)常见聚合函数

函数 功能
count 统计数量
max 最大值
min 最小值
avg 平均值
sum 求和

2)语法

1
select 聚合函数(字段列表) from 表名;

NULL是不参与所有聚合函数运算的

1
2
select count(*) from table; -- 统计的是总记录数
select count(字段1) from table; -- 统计的是字段1不为null的记录数

4.分组查询(group by)

1)语法

1
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤条件];

2)where与having区别

  • where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组 之后对结果进行过滤。
  • where不能对聚合函数进行判断,而having可以。

注意事项:

  • 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。

  • 执行顺序: where > 聚合函数 > having

  • 支持多字段分组, 具体语法为 : group by columnA, columnB。这个多字段查询,就是对所选字段进行排列组合,将同时具有这些属性的分为一组。比如有一个表,里面有age 和 name 属性。数据有 12 A; 13 B;那么多字段分组就会分成,同时满足12 A的,同时满足12 B的,同时满足13 A的,同时满足13 B的。

5.排序查询(order by)

1)语法

1
select 字段列表 from 表名 order by 字段1 排序方式1, 字段2 排序方式2;

2)排序方式

  • ASC:升序(默认)
  • DESC:降序

升序,可以不指定排序方式

多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序

6.分页查询(limit)

1)语法

1
select 字段列表 from 表名 limit 起始索引, 查询记录数;

注意事项: •

  • 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数
  • 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。
  • 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。

使用MyBatis框架时,可以使用PageHelper插件来实现分组查询,更为遍历。

7.执行顺序

DQL语句在执行时是有执行顺序的,具体的执行顺序如下

1
2
3
4
5
6
7
from 
where
group by
having
select
order by
limit

七、SQL-DCL

DCL英文全称是Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访 问权限。

1.管理用户

1)查询用户

在mysql数据库下有一个user表:

ScreenShot_2024-09-10_17-41-41

1
select * from mysql.user;

其中Host代表当前用户访问的主机, 如果为localhost, 仅代表只能够在当前本机访问,是不可以 远程访问的。User代表的是访问该数据库的用户名。在MySQL中需要通过Host和User来唯一标识一 个用户。

2)创建用户

1
create user '用户名'@'主机名' identified by '密码'

3)修改用户密码

1
alter user '用户名'@'主机名' identified with mysql_native_password by '新密码'

4)删除用户

1
drop user '用户名'@'主机名';

主机名可以使用 % 通配。

2.权限管理

1)查询权限

1
show grants for '用户名'@'主机名';

2)授予权限

1
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';

3)撤销权限

1
remove 权限列表 on 数据库名.表名 from '用户名'@'主机名';

注意:

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

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

常用权限:

权限 描述
ALL,ALL PRIVILEGES 所有权限
SELECT 查询权限
INSERT 插入数据
UPDATE 修改数据
DELETE 删除数据
ALTER 修改表
DROP 删除数据库/表/视图
CREATE 创建数据库/表