目录
表的增删查改
6.1:增加
6.2:查找
6.3:更新
6.4:删除
6.5: 插入查询结果
6.6:聚合函数
6.7:group by分组
关键字的先后顺序:from > on> join > where > group by > with > having > select > distinct > order by > limit
表的增删查改
6.1:增加
6.1.1:直接插入
语法:
INSERT [INTO] table_name
[(column [, column] ...)]
VALUES (value_list) [, (value_list)] ...
value_list: value, [, value] ...
主表:
单行全列插入:
多行指定列插入:
6.1.2:判断插入时候是否更新:
语法:
INSERT ... ON DUPLICATE KEY UPDATE
column = value [, column = value] ...
-- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,并且数据已经被更新(更新值为update后的值)
通过mysql函数获取收到影响的最近数据行数
语法:SELECT ROW_COUNT();
6.1.3:替换
-- 主键 或者 唯一键 没有冲突,则直接插入;
-- 主键 或者 唯一键 如果冲突,则删除后再插入
-- 1 row affected: 表中没有冲突数据,数据被插入
-- 2 row affected: 表中有冲突数据,删除后重新插入
6.2:查找
SELECT
[DISTINCT] {* | {column [, column] ...}
[FROM table_name]
[WHERE ...]
[ORDER BY column [ASC | DESC], ...]
LIMIT ...
6.2.1:select查询
通常情况下不建议使用 * 进行全列查询
1. 查询的列越多,意味着需要传输的数据量越大
2. 可能会影响到索引的使用
全列查询:
指定列查询:
查询字段为表达式:
为查询结果指定别名:
语法:SELECT column [AS] alias_name [...] FROM table_name;
结果去重:
6.2.2:where条件查询
比较运算符和逻辑运算符:
运算符 | 说明 |
---|---|
= | 等于,NULL不安全,NULL = NULL结果为NULL |
<=> | 等于,NULL安全,NULL <=> NULL的结果是TRUE(1) |
> | 大于 |
< | 小于 |
>= | 大于或等于 |
<= | 小于或等于 |
<> 或 != | 不等于 |
BETWEEN ... AND ... | 在两个值之间 |
LIKE | 模糊搜索模式,% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字符 |
IN (...) | 在给定列表中 |
IS NULL | 是空值 |
IS NOT NULL | 不是空值 |
AND | 逻辑"与",如果两个操作数都为TRUE,则条件成立 |
OR | 逻辑"或",如果两个操作数中任何一个为TRUE,则条件成立 |
NOT | 逻辑"非",如果条件为TRUE,则逻辑NOT条件为FALSE,反之亦然 |
6.2.3:排序
语法:
-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];
注意:没有 ORDER BY 子句的查询,返回的顺序是未定义的,永远不要依赖这个顺序
升序:
降序:
6.2.4:分页筛选
语法:
-- 起始下标为 0
-- 从 s 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT s, n
-- 从 0 开始,筛选 n 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n;
-- 从 s 开始,筛选 n 条结果,比第二种用法更明确,建议使用
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT n OFFSET s;
实例:
6.3:更新
语法:
UPDATE table_name SET column = expr [, column = expr ...]
[WHERE ...] [ORDER BY ...] [LIMIT ...]
注意:没有where时候将会全表修改,慎用!
实例:
6.4:删除
6.4.1:普通删除
语法:
DELETE FROM table_name [WHERE ...] [ORDER BY ...] [LIMIT ...]
注意:没有where时候将会全表删除,慎用!
实例:
6.4.2:截断表
语法:
TRUNCATE [TABLE] table_name
注意:这个操作慎用
1. 只能对整表操作,不能像 DELETE 一样针对部分数据操作;
2. 实际上 MySQL 不对数据操作,所以比 DELETE 更快,但是TRUNCATE在删除数据的时候,并不经过真正的事物,所以无法回滚
3. 会重置 AUTO_INCREMENT 项
6.5: 插入查询结果
语法:
INSERT INTO table_name [(column [, column ...])] SELECT ...
实例:
创建一张表sstu像stu一样
插入查询结果:
6.6:聚合函数
函数 | 说明 |
---|---|
COUNT(column) | 返回某列的行数 |
AVG(column) | 返回某列的平均值,不是数字没有意义 |
MAX(column) | 返回某列的最大值,不是数字没有意义 |
MIN(column) | 返回某列的最小值,不是数字没有意义 |
SUM(column) | 返回某列之和,不是数字没有意义 |
6.7:group by分组
语法:
select column1, column2, .. from table group by column;
实例:
having和group by配合使用,对group by结果进行过滤:
注意:虽然having语句和where类型,但是having的执行是靠后的,等全部筛选完才过滤,而where是先过滤在筛选