MySQL学习笔记——增删改查操作

目录

[4 增删改查操作](#4 增删改查操作)

[4.1 Create新增](#4.1 Create新增)

[4.1.1 语法](#4.1.1 语法)

[4.1.2 单行数据全列插入](#4.1.2 单行数据全列插入)

[4.1.3 单行数据指定列插入](#4.1.3 单行数据指定列插入)

[4.1.4 多行数据的指定列插入](#4.1.4 多行数据的指定列插入)

[4.2 Retrieve 检索](#4.2 Retrieve 检索)

[4.2.1 Select](#4.2.1 Select)

[4.2.1.1 全列查询](#4.2.1.1 全列查询)

[4.2.1.2 指定列查询](#4.2.1.2 指定列查询)

[4.2.1.3 查询字段为表达式](#4.2.1.3 查询字段为表达式)

[4.2.1.4 为查询结果指定别名](#4.2.1.4 为查询结果指定别名)

[4.2.1.5 结果去重](#4.2.1.5 结果去重)

[4.2.2 Where 条件查询](#4.2.2 Where 条件查询)

[4.2.5 Order By 排序](#4.2.5 Order By 排序)

[4.2.6 分页查询](#4.2.6 分页查询)

[4.3 Update 修改](#4.3 Update 修改)

[4.4 Delete 删除](#4.4 Delete 删除)

[4.5 截断表](#4.5 截断表)

[4.6 插入查询结果](#4.6 插入查询结果)

[4.7 聚合函数](#4.7 聚合函数)

[4.8 Group by 分组查询](#4.8 Group by 分组查询)

[4.8.1 语法:](#4.8.1 语法:)

[4.8.2 having 子句](#4.8.2 having 子句)

[4.8.3 having 与 Where 的区别](#4.8.3 having 与 Where 的区别)

[4.9 内置函数](#4.9 内置函数)

[4.9.1 日期函数](#4.9.1 日期函数)

4 增删改查操作

简称CRUD:CRUD是对数据库中的记录进行基本的增删改查操作:

  • Create(创建)

  • Retrieve(读取)

  • Updata(更新)

  • Delete(删除)

4.1 Create新增

4.1.1 语法
sql 复制代码
INSERT [INTO] table_name
    -- 定义表时的列名,可以是一个也可以是多个 --
    [(column [, column] ...)]
VALUES 
    (value_list) [, (value_list)] ...
    
value_list: value, [, value] ... -- 指写字段(表中的列)列表中对应的值 --
​
-- (value_list):这一组值代表一行数据 --
-- [, (value_list)] ...:可以一次新增很多行数据 --
​
-- 写一行记录 --
insert into 表名 [列名] values(值...);
4.1.2 单行数据全列插入
4.1.3 单行数据指定列插入
4.1.4 多行数据的指定列插入

4.2 Retrieve 检索

sql 复制代码
SELECT
    [DISTINCT] -- 去重
    select_expr [, select_expr] ...
    [FROM table_references] -- 查哪个表
    [WHERE where_condition] -- 条件过滤
    [GROUP BY {col_name | expr}, ...] -- 分组查询
    [HAVING where_condition] -- 对分组的结果进行过滤
    [ORDER BY {col_name | expr } [ASC | DESC], ... ] -- 排序
    [LIMIT {[offset,] row_count | row_count OFFSET offset}] -- 限制结果的行数
4.2.1 Select
4.2.1.1 全列查询
sql 复制代码
-- 创建表结构
CREATE TABLE exam (
    id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
    name VARCHAR(20) COMMENT '同学姓名',
    chinese FLOAT COMMENT '语文成绩',
    math FLOAT COMMENT '数学成绩',
    english FLOAT COMMENT '英语成绩'
);
​
-- 插入测试数据(方式1:让id自增)
INSERT INTO exam (name, chinese, math, english) VALUES
('唐三藏', 67, 98, 56),
('孙悟空', 87, 78, 77),
('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67),
('刘玄德', 55, 85, 45),
('孙权', 70, 73, 78),
('宋公明', 75, 65, 30);
​
# 使用 * 可以查询表中的所有列的值
select * from exam;
4.2.1.2 指定列查询

查询所有人的编号,姓名和语文成绩

sql 复制代码
-- id, name, chinese 要查询的只要在表中即可,与顺序无关 --
select id, name, chinese from exam;
# 在select后⾯的查询列表中指定希望查询的列,可以是⼀个也可以是多个,中间⽤逗号隔开指定列的顺序与表结构中的列的顺序⽆关
4.2.1.3 查询字段为表达式
  • 常量表达式
sql 复制代码
# 表达式本就是个常
select id, name, 10 from exam;
-- "10" 表达式在查询列表中,但不在表中
​
# 常量的运算
select id, name, 10 + 1 from exam;

返回的结果集是根据查询表列中的字段和表达式生成的一个临时表,专门用来保存查询结果,临时表------当结果集返回给客户端是,临时表就销毁了。

  • 把所有学生的语文成绩加10分
sql 复制代码
# 表达式中包含一个字段
select id, name, chinese + 10 from exam;
-- chinese + 10  这是一个表达式列点的值域常量的运算 --
  • 计算所有学生语文,数学和语文成绩的总分
sql 复制代码
# 表达式包含多个字段
select id, name, chinese + math + english from exam;
4.2.1.4 为查询结果指定别名
  • 语法
sql 复制代码
SELECT column [AS] alias_name [, ...] FROM table_name;
-- AS可以省略,别名如果包含空格必须⽤单引号包裹

# 为总分这一列指定别名
select id, name, chinese + math + english as total from exam;

-- 如果别名有空格,必须用单引号包裹 -- '总 分'
4.2.1.5 结果去重
sql 复制代码
# 去重查询
select distinct math from exam;

使用DISCTINCT去重时,只有查询列表中所有列的值都相同才会判定为重复

注意:查询时不加限制条件会返回表中所有结果,如果表中的数据量过大,会把服务器的资源消耗殆尽;在⽣产环境不要使不加限制条件的查询

4.2.2 Where 条件查询

根据指定的一些条件,过滤不符合的记录,把符合条件的记录返回给用户

sql 复制代码
SELECT
    select_expr [, select_expr] ... [FROM table_references]
    WHERE where_condition
# WHERE 条件查询的关键字
# where_condition 查询条件------可以通过一些运算符,大于,小于,等于,不等于逻辑运算符,和JAVA中一样
运算符 说明
>, >=, <, <= 大于,大于等于,小于,小于等于
= 等于,对于NULL的比较不安全,比如NULL = NULL结果还是NULL
<=> 等于,对于NULL的比较 j 是安全的,⽐如NULL <=> NULL结果是TRUE(1)
!=, <> 不等于
value BETWEEN a0 AND a1 范围匹配,[a0, a1],如果a0 <= value <= a1,返回TRUE或1,NOT BETWEEN则取反
value IN (option, ...) 如果value 在optoin列表中,则返回TRUE(1),NOT IN则取反
IS NULL 是NULL
IS NOT NULL 不是NULL
LIKE 模糊匹配,% 表⽰任意多个(包括0个)字符;_ 表⽰任意⼀个字符,NOT LIKE则取反

注意:

  • WHERE条件中可以使用表达式,但不能使⽤别名

  • AND的优先级高于OR,在同时使⽤时,建议使用⼩括号()包裹优先执⾏的部分

  • 过滤NULL时不要使用等于号(=)与不等于号(!= , <>)

  • NULL与任何值运算结果都为NULL

4.2.5 Order By 排序
sql 复制代码
-- 语法:
select 列名 from 表名 order by 列名 [ASC | DESC];
​
-- ASC为升序(从小到大)
-- DESC为降序(从大到小)
-- 默认为ASC
SELECT ... FROM table_name [WHERE ...] ORDER BY {col_name | expr } [ASC | DESC], ... ;
​
-- ORDER BY {col_name | expr }[ASC | DESC], ... ;
-- col_name -> 列 -- expr -> 表达式 -- 结果集或真实表中

查看表结构用到了DESC describe描述

排序中的desc descend下降

4.2.6 分页查询

select * from 表名;这样写是不安全的,这一条语句会把所有的数据都查出来,会把服务器的资源耗尽。

分页查询可以有效的限制一次查询的记录条数

sql 复制代码
-- 起始下标为 0 
​
-- LIMIT 关键字,表示限制查询的字数
-- num 一次要查询出来的记录条数
​
-- 从 0 开始,筛选 num 条结果
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num;
​
-- 从 start 开始,筛选 num 条结果 
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT start, num;
​
-- 从 start 开始,筛选 num 条结果,⽐第⼆种⽤法更明确,建议使⽤ 
SELECT ... FROM table_name [WHERE ...] [ORDER BY ...] LIMIT num OFFSET start;
# 查询第一页数据
select * from exam order by id asc limit 0, 3;
sql 复制代码
# 查询第二页数据
select * from exam order by id asc limit 3, 3;
sql 复制代码
# 查询第三页数据,没有达到limit的条数限制,也不会有任何影响,有多少条就显示多少条
select * from exam order by id asc limit 6, 3;

4.3 Update 修改

语法:

sql 复制代码
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
    SET assignment [, assignment] ...
    [WHERE where_condition]
    [ORDER BY ...]
    [LIMIT row_count]
    
-- 对符合条件的结果进行列值分析
Update 表名 set 列名 = 值 ...;
sql 复制代码
# 将总成绩倒数前三的3位同学的数学成绩加上30分
select name, math, chinese + math + english as 总分 from exam where chinese + math + english is not null order by 总分 asc limit 3;

Update 注意事项:

以原值的基础上做变更时,不能使⽤math += 30这样的语法

不加where条件时,会导致全表数据被列新,谨慎操作

4.4 Delete 删除

语法:

sql 复制代码
DELETE FROM tbl_name [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
​
# 删除孙悟空同学的考试成绩
delete from exam where name = '孙悟空';
​
# 删除整张测试表
delete from exam;
  • 注意:如果不加任何条件执行DELETE语句会把表中的数据全部删除------非常危险

4.5 截断表

语法:

sql 复制代码
TRUBCATE [table] tbl_name;

注意事项:

  • 只能对整表操作,不能像 DELETE ⼀样针对部分数据

  • 不对数据操作所以比DELETE更快,TRUNCATE在删除数据的时候,不经过真正的事物,所以⽆法 回滚

  • 会重置 AUTO_INCREMENT 项

4.6 插入查询结果

语法:

sql 复制代码
INSERT INTO table_name [(column [, column ...])] SELECT ...

4.7 聚合函数

函数 说明
COUNT([DISTINCT] expr) 返回查询到的数据的数量
SUM([DISTINCT] expr) 返回查询到的数据的总和,不是数字没有意义
AVG([DISTINCT] expr) 返回查询到的数据的平均值,不是数字没有意义
MAX([DISTINCT] expr) 返回查询到的数据的最⼤值,不是数字没有意义
MIN([DISTINCT] expr) 返回查询到的数据的最⼩值,不是数字没有意义

4.8 Group by 分组查询

Group by 字句的作用是通过一定的规则将一个数据集划分成若干个小的分组,然后针对若干个分组进行数据处理,比如使用聚合函数对分许进行统计。

4.8.1 语法:
sql 复制代码
SELECT {col_name | expr} ,... ,aggregate_function (aggregate_expr)
    FROM table_references
    GROUP BY {col_name | expr}, ... 
    [HAVING where_condition]
# col_name | expr:要查询的列或表达式,可以有多个,必须在 GROUP BY ⼦句中作为分组的依据
# aggregate_function:聚合函数,⽐如COUNT(), SUM(), AVG(), MAX(), MIN() 
# aggregate_expr:聚合函数传⼊的列或表达式,如果列或表达式不在 GOURP BY ⼦句中,必须包含中聚合函数中
​
-- 示例
create table emp (
  id bigint primary key auto_increment,
  name varchar(20) not null,
  role varchar(20) not null,
  salary decimal(10, 2) not null
);
​
insert into emp values (1, '马云', '⽼板', 1500000.00);
insert into emp values (2, '马化腾', '⽼板', 1800000.00);
insert into emp values (3, '鑫哥', '讲师', 10000.00);
insert into emp values (4, '博哥', '讲师', 12000.00);
insert into emp values (5, '平姐', '学管', 9000.00);
insert into emp values (6, '莹姐', '学管', 8000.00);
insert into emp values (7, '孙悟空', '游戏角色', 956.8);
insert into emp values (8, '猪悟能', '游戏角色', 700.5);
insert into emp values (9, '沙和尚', '游戏角色', 333.3);
​
select * from emp;
# 统计每个角色的人物
select role, count(*) from emp group by role;
# 统计每个角色的平均工资,最高工资,最低工资
select role, ROUND(avg(salary), 2) as 平均工资, ROUND(max(salary), 2) as 最高工资, ROUND(min(salary),2) as 最低工资 from emp group by role;
4.8.2 having 子句

使用group by 对结果进行分组处理后,对分组的结果进行过滤,不能使用Where子句,而要使用having 子句。

sql 复制代码
# 显示平均工资低于1500的角色和它的平均工资
select role, avg(salary) from emp group by role having avg(salary) < 1500; 
4.8.3 having 与 Where 的区别
  • Having 用于对分组结果的条件过滤

  • Where 用于对表中真实数据的条件过滤

4.9 内置函数

MySQL内部实现好的一些函数,可以拿来直接用

4.9.1 日期函数
函数 说明
CURDATE() 返回当前日期,同义词CURRENT_DATE , CURRENT_DATE()
CURTIME() 返回当前时间,同义词CURRENT_TIME , CURRENT_TIME([fsp])
NOW() 返回当前⽇期和时间,同义语 CURRENT_TIMESTAMPCURRENT_TIMESTAMP
DATE(data) 提取date或datetime表达式的⽇期部分
ADDDATE(date,INTERVAL expr unit) 向⽇期值添加时间值(间隔),同义词 DATE_ADD()
SUBDATE(date,INTERVAL expr unit) 向日期值减去时间值(间隔),同义词 DATE_SUB()
DATEDIFF(expr1,expr2) 两个日期的差,以天为单位,expr1 - expr2
相关推荐
6+h2 小时前
【MySQL】事务隔离与MVCC详解
数据库·mysql
luom01022 小时前
【MySQL 的数据目录】
数据库·mysql·adb
搜佛说2 小时前
sfsDb 所代表的“融合型”数据库将为未来的一个重要方向
数据库·物联网·边缘计算·时序数据库·iot
相信神话20212 小时前
第零章:新手的第一课:正确认知游戏开发
大数据·数据库·算法·2d游戏编程·godot4·2d游戏开发
成长的小牛2332 小时前
MCP 学习笔记
笔记·学习·ai
困死,根本不会2 小时前
蓝桥杯python备赛笔记之(十)数论基础 & 日期问题
笔记·python·蓝桥杯
深蓝轨迹2 小时前
乐观锁 vs 悲观锁 含面试模板
java·spring boot·笔记·后端·学习·mysql·面试
黄焖鸡能干四碗2 小时前
业务数据中台技术方案(PPT)
大数据·数据库·人工智能·安全·需求分析
apollowing3 小时前
PostgreSQL的备份方式
数据库·postgresql