目录
数据库和数据表
数据库是通过某种方式来组织和存储数据的集合,数据库中的数据存放时以表问单位,表就是一个结构化的文件,关系型数据库中,表由字段(列)和记录(行)组成。
- 表名:表名用于唯一标识某个数据库中的一张表,一般通过 完全限定名 这种方式标识。例如:MySQL中唯一标识一张表 “
DBNAME.TBNAME
” - 字段:一个数据表由一个或多个字段组成,每个字段由字段名、数据类型和字段属性组成。数据类型限制了该字段可以存储的数据。
- 记录:记录就是表中的一条数据。
表中常见的数据类型:
- 数值类:用于存储各种整数、小数
- 字符类:用于存储文本字符串,通常使用引号包裹
- 时间类:用于存储日期和时间数据
- 布尔类:用于表示真假值,通常为 TRUE 或 FALSE
- 二进制类:用于存储图片、音频等二进制数据
表中常见的字段属性:
PRIMARY KEY
(主键):唯一标识每一行记录,不能为空、不能重复。每张表只能设置一个主键。FOREIGN KEY
(外键):用于建立与其他表的关系,外键的值必须来自另一张表的主键或唯一键。UNIQUE
(唯一约束):要求该字段的值在表中不能重复,但可以为 NULL。AUTO_INCREMENT
(自增):数值字段自动增长(MySQL 专有),常用于主键。DEFAULT
(默认值):如果插入数据时没有指定该字段的值,就使用默认值。INDEX
(索引):提高查询效率,对字段建立索引。
什么是 SQL 语言
SQL (Structured Query Language)结构化查询语言是由 ISO(国际标准化组织) 和 ANSI(美国国家标准协会) 共同定义的标准化数据库查询语言,通过SQL可以和数据库进行交互的语言。
SQL 语言的特点:
- 关键字不区分大小写:例如
SELECT
和select
效果一样 - 语句以分号结束:一条完整的 SQL 语句通常以 ; 结尾
- 支持单双引号:具体的作用在不通的DBMS中不通,MySQL中默认单双引号都是表示字符常量。
- 支持不同的注释方式:单行注释(
两个减号+空格
),多行注释(/* 注释内容 */
)
SQL 语言的分类:
正因为 SQL 是一种标准,所以基本上所有的DBMS都支持SQL的标准格式,但是不通的DBMS会根据自身情况进行扩展,从而更方便对数据库的管理,这种扩展后的SQL仅该厂家支持,不通用。
标准 SQL :
类型 | 全称 | 中文名 | 作用 | 常见语句 |
---|---|---|---|---|
DDL | Data Definition Language | 数据定义语言 | 用于定义和修改数据库的结构 | CREATE 、ALTER 、DROP 、TRUNCATE |
DML | Data Manipulation Language | 数据操作语言 | 用于对表中的记录进行增、删、改、查等操作 | SELECT 、INSERT 、UPDATE 、DELETE |
DCL | Data Control Language | 数据控制语言 | 用于实现对数据库访问权限的控制 | GRANT 、REVOKE |
TCL | Transaction Control Language | 事务控制语言 | 用于管理事务的执行过程 | BEGIN 、COMMIT 、ROLLBACK 、SAVEPOINT |
扩展 SQL:
- 不同数据库系统有各自的“SQL 方言”,语法细节和特性可能不同。例如:MySQL中就提供了一个名为AUTO_INCREMENT`(自增)的属性来用于实现对主键的自增。
数据操作语言(DML)
1、SELECT 单表查询
如果需要从数据库中查询指定的数据(记录)信息,需要使用 DML 中的人 SELECT 语句进行操作。在标准的SQL语句中,关键字是不区分大小写的。
SELECT 语法格式:
SELECT 字段列表
FROM 数据表名
[WHERE 条件]
[GROUP BY 分组字段]
[HAVING 分组后筛选条件]
[ORDER BY 排序字段 [ASC|DESC]]
[LIMIT 限制数量] --(MySQL 专属)
字段列表:指定输出满足查询条件的数据时,数据那些列,多个列名之间必须以逗号分隔
指定显示的字段:
字段列表控制需要将符合条件数据的哪些字段进行输出,如果指定了多个字段,多个列名之间必须以逗号分隔,如果需要输出所有字段信息,使用 *
表示。
例如:
select user,host from mysql.user
通过 WHERE 对原始数据进行筛选
语法格式
WHERE 条件表达式;
通过 WHERE 关键字就可以指定检索数据时的查询条件,WHERE 支持以下操作符:
比较操作符:
- 比较规则:是根据 数据库字符集规则 进行比较。例如:MySQL使用 utf8mb4_general_ci 字符集时,无论是中文、英文、标点符号,都是根据Unicode 编码值进行比较,处理英文字母时会将大小写视为相同的字符来处理。
比较操作符 | 含义 | 示例 |
---|---|---|
= | 等于 | WHERE age = 18 |
<> 或 != | 不等于 | WHERE age <> 18 或 WHERE age != 18 |
> | 大于 | WHERE score > 60 |
< | 小于 | WHERE price < 100 |
>= | 大于或等于 | WHERE age >= 18 |
<= | 小于或等于 | WHERE age <= 60 |
逻辑操作符
操作符 | 含义 | 示例 |
---|---|---|
AND | 与 | WHERE age > 18 AND gender = 'male' |
OR | 或 | WHERE city = '成都' OR city = '北京' |
NOT | 非 | WHERE NOT (status = 'inactive') |
范围操作符
操作符 | 含义 | 示例 |
---|---|---|
BETWEEN | 在范围内 | WHERE age BETWEEN 18 AND 30 |
NOT BETWEEN | 不在范围内 | WHERE salary NOT BETWEEN 5000 AND 10000 |
集合操作符
操作符 | 含义 | 示例 |
---|---|---|
IN | 在集合中 | WHERE id IN (1, 2, 3) |
NOT IN | 不在集合中 | WHERE department NOT IN ('HR', 'Admin') |
通配符匹配操作符:
操作符 | 含义 | 示例 |
---|---|---|
LIKE | 模糊匹配 | WHERE name LIKE '张%' (以“张”开头) |
NOT LIKE | 非匹配 | WHERE name NOT LIKE '%测试%' |
_ |
匹配一个任意字符 | LIKE '张_' 匹配“张三”、“张五” |
% |
匹配任意多个字符 | LIKE '%工程师' 匹配“运维工程师”、“软件工程师”等 |
空值判断操作符:
操作符 | 含义 | 示例 |
---|---|---|
IS NULL | 是空值 | WHERE last_login IS NULL |
IS NOT NULL | 非空值 | WHERE phone IS NOT NULL |
通过 聚合函数 获取汇总信息
聚合函数作用:是SQL中专门用于对一组数据进行汇总、计算的函数,使用的时候一般配合GROUP BY 使用,用来统计、求和、取平均、查最大最小值等。
聚合函数位置:在 SELECT
字段列表中。用来作为查询结果的一部分显示出来
常见聚合函数:
聚合函数名 | 作用说明 | 示例 |
---|---|---|
COUNT() |
计数,返回某列中值的个数 | COUNT(*) 是行数,COUNT(age) 是非空 age 数量 |
SUM() |
求和,返回某列所有值的总和 | SUM(salary) :求工资总和 |
AVG() |
平均值,返回某列所有值的平均数 | AVG(score) :求平均分 |
MAX() |
最大值,返回某列中的最大值 | MAX(age) :找出年龄最大的人 |
MIN() |
最小值,返回某列中的最小值 | MIN(score) :找出最低分 |
例如:通过某个数据表中一共有多少行
SELECT count(*) FROM position_ehcommon.tb_track_history
通过 ORDER BY 对结果排序
说明:同时使用 ORDER BY 和 WHERE 时,应该让 ORDER BY 位于WHERE 之后,否则会报错。
语法格式:
ORDER BY 需要参与排序的字段 ASC|DESC
- 参与排序的字段,可以指定一个或多个,多个字段之间使用逗号分隔
- 每个字段后面都可以单独指定是升序还是降序
排序规则:
排序规则由数据库的 字符排序集 决定。例如:MySQL使用的字符排序集是utf8mb4_general_ci时,进行排序的时候是根据字符的Unicode编码值比较大小,且字母比较时认为大小写字母一样。
排序方式:
排序方式 | 关键字 | 含义 |
---|---|---|
升序 | ASC |
从小到大(默认方式) |
降序 | DESC |
从大到小 |
通过 GROUP BY 对数据进行分组
通过SQL 中的 GROUP BY 可以对查询到的数据进行分组,一般都是和 聚合函数 进行结合使用。因为GROUP BY 是“按某个字段分组”,每组只保留一行结果;这一行通常需要展示这个组的汇总信息,汇总信息需要通过聚合函数来计算。
GROUP BY 语法格式:
GROUP BY 分组字段;
例如:统计每个部门的人数
SELECT department, COUNT(*) AS 部门人数
FROM employees
GROUP BY department;
通过 HAVING 对分组结果进行筛选
HAVING 使用场景:是 SQL 中专门用于筛选分组后的结果的子句,所以一般是和GROUP BY 一起使用的。
HAVING 语法格式:
HAVING 聚合条件;
和 WHERE 的区别:
说明:对聚合函数的结果(如 COUNT()、AVG()、SUM())进行筛选,必须使用 HAVING,不能使用 WHERE。
子句 | 用于筛选什么? | 能否用聚合函数? |
---|---|---|
WHERE |
筛选原始记录(单条记录),在数据分组之前使用 | 不能用聚合函数,即 |
HAVING |
筛选分组后的汇总结果,在数据分组之后使用 | 可以用聚合函数 |
例如:对平均工资进行筛选
-- 正确格式
SELECT department, AVG(salary) AS 平均工资
FROM employees
GROUP BY department
HAVING AVG(salary) > 8000;
-- 错误情况
SELECT department, AVG(salary)
FROM employees
WHERE AVG(salary) > 8000 -- 报错!
GROUP BY department;
2、SELECT 多表查询
SQL 的 JOIN 功能:
当需要查询的数据信息分散存储在多张表里面时,如果需要一次性查到需要的数据。就需要使用SQL提供的JOIN功能。JOIN就是通过某张关系让两个或多个表拼接起来返回一个结果集,然后在这个结果集中筛选所需的数据。
表之间的桥梁:
- 外键和主键之间的关系;
- 两个表中“意义相同”的字段
JOIN 的类型:
类型 | 关键字 | 说明 |
---|---|---|
内连接 | INNER JOIN |
两张表中同时满足 连接条件 才返回 |
左连接 | LEFT JOIN |
左表满足 连接条件 的行都返回,如果右表中没匹配到,就填 NULL |
右连接 | RIGHT JOIN |
右表满足 连接条件 的行都返回,如果左表中没匹配,就填 NULL |
JION 语法格式:
SELECT 字段列表 FROM 表1 -- 查询时字段一般写 完全限定格式(如 表名.字段名)
INNER|LEFT|RIGHT JOIN 表2 ON 连接条件
例如:
3、INSERT 插入数据
通过 DML 中的 INSERT 可以实现在某张表中插入一条或多条数据。
语法格式:
-- 指定字段名的插入
INSERT INTO 表名 (字段1, 字段2, ...)
VALUES (值1, 值2, ...);
-- 不指定字段名的插入
INSERT INTO 表名
VALUES (值1, 值2, ...);
- 指定字段名插入数据时:会将数据一一对应插入到对应字段,指定的字段会被赋值,没被指定的字段如果定义了 DEFAULT 默认值,就使用默认值,如果字段允许为 NULL,则自动填充为
NULL
,否则就报错。 - 不指定字段插入数据时:数据会按顺序插入到表结构定义中从上到下的字段(不推荐)
4、UPDATE 更新数据
通过DML中的 UPDATE 可以实现更改某站表中的制定数据。
语法格式:
UPDATE 表名 -- 指定要修改哪张表的数据;
SET 字段1 = 值1, 字段2 = 值2, ... -- 列出要修改的字段和值;
WHERE 条件; -- 限制修改范围
注意:使用 UPDATE 时一定要使用 WHERE 来限定范围!否则会将当前表中所有记录的字段都更改了。而且涉及数据修改前,先备份。
例如:
UPDATE tb_device_info
SET face_terminate_id_out='' -- 该表所有记录的face_terminate_id_out字段都会为空
5、DELETE 删除数据
通过 DML 中的 DELETE 可以删除某张数据表中的制定数据。
语法格式:
DELETE FROM 表名
WHERE 条件;
注意:如果不加 WHERE
,会删除整张表中的所有数据!,操作前先备份表数据,防止意外。
DELETE 和 TRUNCATE 删除所有区别:
- DELETE:仅仅是将指定表当前的数据全部清空,如果设置了主键自增,也不会被重置为从0重新开始,文件系统空间占用不会释放。
- TRUNCATE :是在文件系统中将整张表删除了然后重建表结构,所以主键自增也会重置从0开始。会释放文件系统空间占用。
数据定义语言(DDL)
1、CREAT TABLE
语法格式:
CREATE TABLE 表名
(
字段1 数据类型 属性,
字段2 数据类型 属性,
字段3 数据类型 属性,
);
只复制某张表的表结构:
说明:这种方式会将表的完整结构信息,包括属性信息这些一起复制过来。
CREATE TABLE 表名 LIKE 原表名;
复制某张表的数据和基本结构:
说明:这种方式不会复制原表的索引、主键、外键、默认值、约束等结构信息,就只复制了表的数据和结构
CREATE TABLE 新表名 AS
SELECT * FROM 原表名;
复制某张表的完整结构和数据:
-- 第一步:复制结构(包含字段类型、默认值、主键、索引等)
CREATE TABLE 新表名 LIKE 原表名;
-- 第一步:复制结构(包含字段类型、默认值、主键、索引等)
CREATE TABLE 新表名 LIKE 原表名;
2、ALTER TABLE
ALTER TABLE 用于对已有的表进行结构性修改。
新增字段语法格式:
ALTER TABLE 表名 ADD 字段名 数据类型 属性;
删除字段语法格式:
ALTER TABLE 表名 DROP 字段名;
修改字段语法格式:
- MODIFY :只能修改字段的类型,属性。并且一定要写全字段的所有属性,因为会以前的都会被覆盖掉。
- CHANGE:用于修改字段的名称,但是需要指定原名才行。
功能 | 语法格式 |
---|---|
修改字段类型 | ALTER TABLE 表名 MODIFY 字段名 新数据类型 新属性; |
修改字段名 | ALTER TABLE 表名 CHANGE 原名 新名 类型; |
添加主键 | ALTER TABLE 表名 ADD PRIMARY KEY (字段名); |
删除主键 | ALTER TABLE 表名 DROP PRIMARY KEY; |
添加唯一索引 | ALTER TABLE 表名 ADD UNIQUE (字段名); |
添加普通索引 | ALTER TABLE 表名 ADD INDEX (字段名); |
修改表名 | ALTER TABLE 原表名 RENAME TO 新表名; |
3、DROP TABLE
DROP TABLE 用于删除某张表。
语法格式:
DROP TABLE TB_NAME
说明:如果是重要数据,删除表之前要备份,否则悔之晚矣。
事务控制语言(TCL)
TCL 是事务控制语言(Transaction Control Language),用于实现对数据库事务的控制。
说明:事务只会对DML操作生效,如果是DDL这种对数据库结构进行修改的,不支持事务。
TCL 中的事务控制语句:
语句 | 含义 |
---|---|
START TRANSACTION 或 BEGIN |
开始事务,后续所执行的DML语句都属于该事务中的一个语句。 |
COMMIT |
提交事务。只有所有的语句都执行成功才会成功,失败后需要手动执行ROLLBACK才会回滚。 |
ROLLBACK |
事务的最终确认动作,一旦 COMMIT 成功,就不能回滚了,只有事务失败的时候才能回滚。 |
SET autocommit = 0/1 |
设置是否自动提交事务(MySQL 默认是自动提交) |
例如:MySQL中的事务使用
-- 关闭自动提交(MySQL 默认自动提交,每条语句自动生效)
SET autocommit = 0;
-- 开始事务
START TRANSACTION;
-- 第一步:A 扣钱
UPDATE accounts SET balance = balance - 100 WHERE name = 'A';
-- 第二步:B 加钱
UPDATE accounts SET balance = balance + 100 WHERE name = 'B';
-- 提交事务(两步都成功才执行)
COMMIT;
-- 如果 所有语句都执行成功,COMMIT 才会生效,生效后没法进行回滚
-- 如果 存在某些语句执行失败,COMMIT 时会提示失败,需要手动执行ROLLBACK才会自动回滚。