SQL语句笔记
SQL语句笔记
Wells本篇笔记中默认的规则:
代码中出现[]
的部分为可写可不写的
概述
数据库相关概念
名称 | 全称 | 简称 |
---|---|---|
数据库 | 存储数据的仓库,数据是有组织的进行存储 | DataBase (DB)(DBMS) |
数据库管理系统 | 操纵和管理数据库的大型软件 | DataBase Management System |
SQL | 操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 | Structured Ouery Language (SOL) |
关系型数据库
概念:建立在关系,模型基础上,由多张相互连接的二维表组成的数据库
RDBMS 术语
- 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 联合主键:关系数据库实际上还允许通过多个字段唯一标识记录,即两个或更多的字段都设置为主键,这种主键被称为联合主键。对于联合主键,允许一列有重复,只要不是所有主键列都重复即可
- 外键:可以把数据与另一张表关联起来,,这种列称为外键。外键用于关联两个表。
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
- 参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
- 表的每一行称为记录(Record),记录是一个逻辑意义上的数据;
- 表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段。
前置知识
MySQL 数据类型
数值类型
标准 SQL 数值数据类型包括严格数值数据类型(INTEGER
、SMALLINT
、DECIMAL
和 NUMERIC
),以及近似数值数据类型(FLOAT
、REAL
和 DOUBLE PRECISION
)。
关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。
类型 | 大小 | 范围(有符号-SIGNED) | 范围(无符号-UNSIGNED) | 用途 |
---|---|---|---|---|
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的值 | 小数值 |
注:double
的使用规则:
1 | #字段名 DOUBLE(总体位数,小数部分位数);如: |
日期和时间类型
每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。
类型 | 大小 ( 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 | 混合日期和时间值,时间戳 |
字符串类型
类型 | 大小 | 用途 |
---|---|---|
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 | 极大文本数据 |
注意:**char(n)
和 varchar(n)
中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30)
就可以存储 30 个字符。**
CHAR 和 VARCHAR 类型类似,它们在存储和检索数据时有一些区别。
- 存储方式:CHAR类型以固定长度存储数据,而VARCHAR类型以可变长度存储数据。例如,如果定义一个CHAR(10)列,不论实际存储的字符数是多少,它都会占用10个字符的存储空间。而VARCHAR(10)列只会占用实际存储的字符数所需的空间。
- 最大长度:CHAR类型具有固定的最大长度,而VARCHAR类型具有可变的最大长度。例如,如果定义一个CHAR(10)列,它可以存储最多10个字符。而VARCHAR(10)列也可以存储最多10个字符,但它可以根据实际存储的字符数动态调整长度。
- 尾部空格:对于CHAR类型,存储时会在字符串末尾填充空格,以达到指定的固定长度。而VARCHAR类型不会填充空格,它只会存储实际的字符数据。
- 性能:
char
的性能比varchar
更高,无需判断字符串大小
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。有时候我们需要存储的数据是二进制形式的,例如图像、音频或加密数据等。在这种情况下,我们可以使用BINARY和VARBINARY类型来保存二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
BLOB 是一个二进制大对象(如图片、音频、视频等等),可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB
。它们区别在于可容纳存储范围不同。
SQL
SQL通用语句
- SQL语句可以单行或多行书写,以分号结尾
- SQL语句可以使用空格(可以是一个也可以是多个)/缩进来增强语句的可读性。
- MySQL数据库的SQL语句不区分大小写,关键字建议使用大写
注释:
单行注释:– 注释内容或# 注释内容(MySQL特有)
多行注释: /注释内容/
SQL语句分类
分类 | 全称 | 说明 |
---|---|---|
DDL | Data Definition Language | 数据定义语言,用来定义数据库对象(数据库,表,字段) |
DML | Data Manipulation Language | 数据操作语言,用来对数据库表中的数据进行增删改 |
DQL | Data Query(查询) Language | 数据查询语言,用来查询数据库中表的记录 |
DCL | Data Control Language | 数据控制语言,用来创建数据库用户、控制数据库的访问权限 |
DDL
数据库操作
查询
查询所有数据库
1 | SHOW DATABASES; |
查询当前数据库
1 | SELECT DATABASE(); |
创建
1 | CREATE DATABASE [IF NOT EXSITS] 数据库名 [DEFAULT CHARSET 字符集(如utf-8、gbk等)] [COLLATE 排序规则]; |
注:[IF NOT EXSITS]
表明如果数据库不存在则创建,存在则不创建
删除
1 | DROP DATABASE [IF EXISTS] 数据库名; |
使用
1 | USE 数据库名; |
表操作
查询
查询当前数据库的所有表
1 | SHOW TABLES; |
查询表结构
1 | DESC 表名; |
查询指定表的建表语句
1 | SHOW CREATE TABLE 表名; |
创建
1 | CREATE TABLE 表名( |
注:
- 最后一个字段不要加
,
逗号 - 注释需要用
' '
修改
添加字段
1 | ALTER TABLE 表名 ADD 字段名 类型(长度) [COMMENT 注释] [约束]; |
修改字段
1 | ALTER TABLE 表名 MODIFY 字段名 新数据类型(长度); |
修改字段名和字段类型
1 | ALTER TABLE 表名 CHANGE 旧字段名 类型(长度) [COMMENT 注释] [注释]; |
删除字段
1 | ALTER TABLE 表名 DROP 字段名; |
修改表名
1 | ALTER TABLE 旧表名 RENAME TO 新表名 |
删除
删除表
1 | DROP TABLE [IF EXISTS] 表名; |
删除指定表,并重新创建该表
1 | TRUNCATE TABLE 表名; |
注:重新创建后的表其内置的数据已被删除
DML
添加数据
给指定字段添加数据
1 | INSERT INTO 表名 (字段1,字段2,...) VALUES(值1,值2,...); |
给全部字段添加数据
1 | INSERT INTO 表名 VALUE (值1,值2,....); |
批量添加数据(添加多行数据)
1 | INSERT INTO 表名 (字段1,字段2,...) VALUES(值1,值2,....),(值1,值2,....),(值1,值2,....); |
1 | INSERT INTO 表名 VALUES (值1,值2,....),(值1,值2,....),(值1,值2,....); |
注意:
- 插入数据时,指定的字段顺序需要与值的顺序是一一对应的。
- 字符串和日期型数据应该包含在引号中。
- 插入的数据大小,应该在字段的规定范围内
- char类型的需要用
' '
单引号进行括号起来
修改数据
1 | UPDATE 表名 SET 字段1=值1,字段2=值2...[WHERE 条件]; |
注:不加where条件会使所以的字段更改为对应的值
删除数据
1 | DELETE FROM 表名 [WHERE 条件]; |
注:
- 如果不加入条件将删除整张表的数据
- DELETE语句不能删除某个字段的值(可以用UPDATE)
DQL
语法
1 | SELECT |
基本查询
1.查询多个字段
1 | SELECT 字段1,字段2,字段3,...FROM 表名; |
1 | SELEC * FROM 表名;# *代表查询所有 |
2.设置别名
1 | SELECT 字段1 [AS 别名1],字段2 [AS 别名2] ...FROM 表名; |
注:AS
可省略,直接添加上别名
3.去除重复数据
1 | SELECT DISTINCT 字段列表 FROM 表名; |
条件查询(WHERE)
语法
1 | SELECT 字段列表 FROM 表名 WHERE 条件列表; |
条件
比较运算符 | 功能 | 比较运算符 | 功能 |
---|---|---|---|
> | 大于 | = | 等于 |
>= | 大于等于 | <>或!= | 不等于 |
< | 小于 | BETWEEN … AND… | 在某个范围之外(含最大、最小值) |
<= | 小于等于 | IN(…) | 在in之后的列表中的值,多选一 |
LIKE 占位符 | 模糊匹配( _匹配当个字符,%匹配任意个字符) | IS NULL | 是NULL |
逻辑运算符 | 功能 |
---|---|
AND或&& | 并且(多个条件同时成立) |
OR或 || | 或者(多个条件任意一个成立) |
NOT 或 ! | 非 |
聚合函数(count,max,min,avg,sum)
作用:将一列函数作为一个整体,进行纵向计算
常见聚合函数
函数 | 功能 |
---|---|
count | 统计量 |
max | 最大值 |
min | 最小值 |
avg | 平均值 |
sum | 求和 |
语法
1 | SELECT 聚合函数(字段列表) FROM 表名; |
注:
- null值不参与所有聚合函数运算
- count会统计字段列表中,含有最多数目的字段
分组查询(GROUP BY)
语法
1 | SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤的条件] |
注:
where
先筛选符合的字段,having
筛选分组后的字段。因此where
不能对聚合函数进行判断,而having
可以。- 执行顺序:
where
> 聚合函数 >having
- 分组之后,查询的字段一般为聚合函数和分组字段,查询其他的字段无意义
- 依照分组字段进行分组时,非分组字段只显示一次出现的值
- 此处使用聚合函数,获得的是分组后使用聚合函数的结果
排序查询(ORDER BY)
语法
1 | SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1,字段2 排序方式2; |
排序方式
- ASC:升序(默认值)
- DESC:降序
注:如果是多字段排序,当第一个字段相同时,才根据第二个字段进行排序
分页查询(LIMIT)
语法
1 | SELECT 字段列表 FROM 表名 LIMIT 起始索引,查询记录数; |
注:
- 起始索引从0开始,起始索引=(查询页码-1)*每页显示记录数。
- 分页查询是数据库的方,不同的数据库有不同的实现,MySQL中是LIMIT。
- 如果查询的是第一页数据,起始索引可以省略,直接简写为limit +数目。
DQL顺序
编辑顺序
1 | SELECT |
执行顺序
1 | FROM |
DCL
管理用户
1.查询用户
1 | USE mysql; |
2.创建用户
1 | CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; |
3.修改用户密码
1 | ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码'; |
4.删除用户
1 | DROP USER '用户名'@'主机名'; |
注:主机名可以使用%
通配
权限控制
常用权限
权限 | 说明 | 权限 | 说明 |
---|---|---|---|
ALL,ALL PRIVILEGES | 所有权限 | DELETE | 删除数据 |
SELECT | 查询数据 | ALTER | 修改表 |
INSERT | 插入数据 | DROP | 删除数据库/表/视图 |
UPDATE | 修改数据 | CREATE | 创建数据库/表 |
1.查询权限
1 | SHOW GRANTS FOR '用户名'@'主机名'; |
2.授予权限
1 | GRANTS 权限列表 ON 数据库.表名 TO '用户名'@'主机名'; |
3.撤销权限
1 | REVOKE 权限列表 ON 数据库.表名 FROM '用户名'@'主机名'; |
注:
多个权限之间用,
进行分割
授权时,数据库名和表名可以使用*
进行通配,代表所有。
函数
字符串函数
函数 | 功能 |
---|---|
CONCAT(51,52….sn) | 字符串拼接,将S1,S2,.. Sn拼接成一个字符电 |
LOWER(st) | 将字符串st全部转为小写 |
UPPER(st) | 将字符串st全部转为大写 |
LPAD(str,n,pad) | 左境充,用字符串pad对st的左边进行境充,达到n个字符审长度 |
RPAD(str,n,pad) | 右填充,用字符串pad对str的右边进行填充,达到n个字符串长度 |
TRIM(str) | 去掉字符串头部和尾部的空格 |
SUBSTRING(str,;start,len) | 返回从字符串sL从start位置起的len个长度的字符串 |
数值函数
函数 | 功能 |
---|---|
CILX | 向上取整(存在小数就加一) |
FLODR(x) | 向下取整 |
MOD(x,y) | 返回x/y的模 |
RAND() | 返回0-1内的随机数 |
ROUND(x,y) | 求参数x的四舍五入的值,保留y位小数 |
日期函数
函数 | 功能 |
---|---|
CURDATE() | 返回当前日期 |
CURTIME | 返回当前时间 |
NOW() | 返回当前日期和时间 |
YEAR(dale) | 获取指定date的年份 |
MONTH(date) | 获取指定date的月份 |
DAY(date) | 获取指定date的日期 |
DATE_ADD(date,INTERVAL expr type) | 返回一个日期/时间值加上一个时间间隔expr后的时间值 |
DATEDIFF(date1,date2) | 返回起始时间date1和结束时间date2之间的天数 |
流程函数
函数 | 功能 |
---|---|
IF(value , t , f) | 如果value为true,则返回t,否则返回f |
IFNULL(value1, value2) | 如果value1不为空,返回value1,否则返回value2 |
CASE WHEN [val1] 1 THEN res11 .. ELSE[default] END | 如果val1为true,返回res1,…否则返回default默认值 |
CASE[expr1] WHEN [val1] THEN [res1] … ELSE[default] END | 如果expr的值等于val1,返回res1,…否则返回default默认值 |
注:CASE后可跟多个WHEN;
约束
概述:作用于表中字段上的规则,用于限制储存在表中的数据
目的:保证数据库中数据的正确、有效性和完整性
分类
约束 | 描述 | |
---|---|---|
非空约束 | 限制该字段的数据不能为null | NOT NULL |
唯一约束 | 保证该字段的所有数据都是唯一、不重复的 | UNIOUE |
主键约束 | 主键是一行数据的唯一标识,要求非空且唯一 | PRIMARY KEY |
默认约束 | 保存数据时,如果未指定该字段的值,则采用默认值 | DEFAULT |
检查约束(8.0.16版本之后) | 保证字段值满足某一个条件 | CHECK |
外键约束 | 用来让两张表的数据之间建立连接,保证数据的一致性和完整性关键字 | FOREIGN KLY |
注:
- 约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束
- 一个字段可以使用多个约束条件