目录
一、Create
1.1单行数据+全列插入
1.2 多行数据+指定列插入
1.3插入否则更新
1.4 替换
二、Retrieve
2.1全列查询
2.2指定列查询
2.3查询字段为表达式
2.4为查询结果指定别名
2.5 结果去重
2.6 where 条件
2.6 NULL的查询
2.7 结果排序
三、 Update
四、Delete
五、插入查询结果
六、聚合函数
七、group by子句的使用
CRUD:Create(创建),Retrieve(读取),Update(更新),Delete(删除)
一、Create
语法:
insert [ into ] table_name [ (column [,column] ...) ] values (value_list) [, (value_list)] ...
value_list:value,[ , value ] ...
[]中的语法是可以忽略的。
案例:
创建一张学生表:
1.1单行数据+全列插入
1.2 多行数据+指定列插入
value_list 数量必须和指定列数量及顺序一致。
1.3插入否则更新
由于主键或者唯一键对应的值已经存在而导致插入失败
----- 主键冲突
------唯一键冲突
可以选择性的进行同步更新操作语法:
insert ... on duplicate key update column = value [, column = value] ...
关于mysql返回的信息:
--- 0 row affected: 表中有冲突数据,但冲突数据的值和 update 的值相等
--- 1 row affected: 表中没有冲突数据,数据被插入
--- 2 row affected: 表中有冲突数据,并且数据已经被更新
--通过mysql函数获取收到影响的数据行数
1.4 替换
语法:
replace into table_name (line_name,..) values();
如果出现冲突,删除旧数据插入新数据,如果没有冲突,则擦汗如数据。
二、Retrieve
语法:
select
[distinct] {* | {column [, column ]...}}
[from table_name]
[where ...]
[order by column [asc | desc ], ...]
limit ...
案例:
---创建表结构
2.1全列查询
select * from table_name;
通常情况下不建议使用 * 进行全列查询。主要原因是查询的列越多,意味着需要传输的数据量越大;而且有可能会影响到索引的使用。
2.2指定列查询
select line_name,... from table_name;
2.3查询字段为表达式
---表达式不包含字段
---表达式包含一个字段
--- 表达式包含多个字段
2.4为查询结果指定别名
语法:
select column [as] alias_name [...] from table_name;
2.5 结果去重
有结果重复。
加上 distinct 选项。
2.6 where 条件
比较运算符:
逻辑运算符:
案例:
🖊英语不及格的同学及英语成绩(<60)
🖊语文成绩在[80,90]分的同学及语文成绩
--使用and进行条件连接
-- 使用between and 条件
🖊数学成绩是58或者59或者98或者99分的同学及数学成绩
-- 使用or进行条件连接
--- 使用in条件
🖊姓孙的同学及孙某同学
---% 匹配任意多个(包括0个)任意字符
-- _ 匹配严格的一个任意字符
🖊语文成绩好于英语成绩的同学
----where 条件中比较运算符两侧都是字段
🖊总分在200分以下的同学
--- where条件中使用表达式
别名不能用在where条件中是因为where在判断时是拿着别名去查询满足条件的条目。
🖊语文成绩>80并且不姓孙的同学
🖊孙某同学,否则要求总成绩>200并且语文成绩<数学成绩并且英语成绩>80
---综合性查询
2.6 NULL的查询
--查询students表
--查询qq号已知的同学姓名
--- null和null的比较,=和<=>的区别
2.7 结果排序
语法:
--- asc 为升序(从小到大)
--- desc 为降序(从大到小)
--- 默认为asc
select ... from table_name [where ...] order by column [asc | desc], [...];
🖊同学及数学成绩,按数学成绩升序显示
🖊 同学及qq号,按qq号排序显示
--null虽然不能运算,但是视为比任何值都小,所以升序出现在最上面。
🖊查询同学各门成绩,依次按数学降序,英语升序,语文升序的方式显示
---多字段排序,排序优先级随书写顺序。
🖊查询同学及总分,由高到低
--order by中可以使用表达式
---order by 子句中可以使用列别名
🖊查询姓孙的同学或者姓曹的同学数学成绩,结果按数学成绩由高到低显示
--- 结合 where子句 和order by 子句
2.8筛选分页结果
语法:
-- 起始下标为0
-- 从 0 开始,筛选 n条结果
select ... from table_name [where ...] [order by ...] limit n;
-- 从s开始,筛选n条结果
select ... from table_name [where ...] [order by ...] limit s, n;
-- 从s开始,筛选n条结果,比第二种用法更明确,建议使用
select ... from table_name [where ...] [order by ...] limit n offset s;
注:在对未知表查询时,最好加一条limit 1,避免因为表中数据过大,查询全表数据导致数据库卡死。
按id进行分页,每页3条记录,分别显示第1、2、3页。
三、 Update
语法:
update table_name set column = expr [, column = expr ...] [where ... ] [order by ...] [ limit ...]
对查询到的结果进行列值更新
案例:
🖊将孙悟空同学的数学成绩变更为80分。
🖊将曹孟德同学的数学成绩变更为60分,语文成绩变更为70分
🖊将总成绩倒数前三的3位同学的数学成绩加上30分
四、Delete
语法:
delete from table_name [where ...] [order by ...] [limit ...]
🖊删除孙悟空同学的考试成绩
👓删除整张表数据
这类操作要慎用。
-- 准备测试表
-- 插入测试数据
-- 查看测试数据
删除查看结果
--再插入一条数据,发现自增id在原值上增长而没有重置:
--查看表结构:
👓截断表
语法:
truncate [table] table_name;
~~这个操作只能对整张表操作,不能像delete一样针对部分数据操作;
~~这项操作mysql不会记录,比delete更快,无法回滚。
~~会重置auto_increment项。
--准备测试表
--插入测试数据
--查看测试数据
--截断整表数据,注意影响行数是0,所以实际上没有对数据真正操作,mysql也没有记录
--查看删除结果
--再插入一条数据,自增id在重新增长
--查看数据
--查看表结构,会发现auto_increment=2项
五、插入查询结果
语法:
insert into table_name [(column [,column ...])] select ...
案例:删除表中的重复记录,重复的记录只能有一份。
思路:
--创建一张空表 no_duplicate_table,结构和duplicate_table 一样
--将duplicate_table的去重数据插入到no_duplicate_table
--通过重命名表,实现原子的去重操作
--查看最终结果
六、聚合函数
案例
🖊统计班级共有多少同学
--用*做统计,不受NULL影响
--使用表达式做统计
🖊统计班级收集的qq号有多少
--null不会计入结果
🖊统计本次考试的数学成绩分数个数
--count(math)统计的是全部成绩
--count(distinct math) 统计的是去重成绩数量
🖊统计数学成绩总分
🖊统计平均总分
🖊返回英语最高分
🖊返回>70分以上的数学最低分
七、group by子句的使用
在select中使用group by子句可以对指定列进行分组查询
select column1,column2,.. from table group by column;
案例:
准备工作,创建一个雇员信息表(码云地址
,来自oracle 9i的经典测试表)
EMP 员工表
DEPT部门表
SALGRADE工资等级表
🖊显示每个部门的平均工资和最高工资
🖊显示每个部门的每种岗位的平均工资和最低工资
having是对分完组后最终聚合统计的结果进行判断。而where只能对具体的任意列进行条件筛选。
🖊显示平均工资低于2000的部门和它的平均工资,但是SMITH员工不参与统计。