人们之所以不愿改变,是因为害怕未知。但历史唯一不变的事实,就是一切都会改变。
前言
这是我学习mysql数据库的第四篇总结。后期我会继续把mysql数据库笔记开源至博客上。
上一期笔记是关于mysql数据库的表格约束:
增
正常插入
--指定列单行插入
insert into tb_name(column_name1,column_name2...) values(value1,value2...);
--全列单行插入
insert into tb_name values();
--指定列多行插入
insert into tb_name(column_name1,column_name2...) values(value1,value2...),(value1,value2...);
--全列多行插入
insert into tb_name values(),();
冲突插入
--插入更新
insert into tb_name(column_name1,column_name2...) values(value1,value2...)
on duplicate key update column_name1=value1',column_name2=value2',...;
--替换更新
replace into tb_name(column_name1,column_name2...) values(value1,value2...);
1. insert into插入更新时,会存在以下情况:
- -- 0 row affected: 表中有冲突数据,但冲突数据的值和update的值相等。
- -- 1 row affected: 表中没有冲突数据,数据被插入。
- -- 2 row affected: 表中有冲突数据,并且数据已经被更新。
2. replace into替换更新时,会存在以下情况:
- -- 1 row affected: 表中没有冲突数据,数据被插入。
- -- 2 row affected: 表中有冲突数据,删除后重新插入。
查询插入
--插入查询出来的结果
insert into tb_name1(column_name1,column_name2...)
select column_name1,column_name2... from table_name2;
1. 除了向表格中插入具体的数据外,还可以向表格中插入查询出来的结果。
2. 查询插入是一种将查询结果插入到另一张表的方法,常用于数据迁移、批量导入、备份等场景。
删
delete-turncate
--删除表格的数据
delete from tb_name where ...;
--重置表格
truncate table tb_name;
1. truncate只能对整个表格进行操作,不能像delete一样针对表格中部分数据操作。
2. truncate会重置auto_increment项,执行后表中的所有记录都会被删除,但表结构、索引、约束等仍然保留。
查
整体查询
--全列查询
select * from tb_name;
--指定列查询
select column_name1,column_name2... from tb_name;
--表达式运算查询
select column_name1 as new_name1,column_name2+column_name3+number as new_name2 from tb_name;
--去重查询
select distinct column_name1,column_name2... from tb_name;
1. 通常情况下不建议使用全列查询:查询的列越多,意味着需要传输的数据量越大。
2. 使用distinct关键字可以确保查询结果中的记录是唯一的,从而去除重复项。
条件查询
运算符
>,>=,<,<=
|
大于,大于等于,小于,小于等于
|
=
|
等于
|
!=
|
不等于
|
between a and b
|
范围匹配。如果 a<=value<=b ,返回 true(1)
|
in(option1,option2,...)
|
选项匹配。如果是option()中的任意一个,返回 true(1)
|
is null
|
是null
|
is not null | 不是null |
like %_
|
模糊匹配。其中%表示任意多个(包括0个)任意字符;其中_表示一个任意字符。
|
and | 与运算 |
or | 并运算 |
not | 非运算 |
where
select ... from ... where ...
1. 语法上,先执行from...,再执行where...,最后执行select...。
2. where...中可以使用圆括号()来限制先后逻辑。
多表查询
1. 笛卡尔积是指:当两个或多个表进行联结操作,但没有指定适当的联结条件时,联结结果会包含第一个表的每一行与第二个表的每一行的所有可能组合。
2. 多表查询的本质是:先生成笛卡尔积,再根据联结条件筛选出有意义的数据组合,从而得到我们真正需要的结果。
--多表查询
select * from tb_name1,tb_name2 where tb_name1.column = tb_name2.column
子查询
--子查询
select ... from ... where (select ... from ... where ...)
select ... from (select ... from ... where ...) where ...
1. 子查询:嵌入在其他sql语句中的select查询,也称为嵌套查询。
2. 子查询允许在一个查询中执行另一个查询,并将结果用作外部查询的一部分。
3. 子查询不仅可以用于where子句中作为过滤条件,还可以作为临时表出现在from子句中,供外部查询引用。
4. in:判断某个值是否存在于子查询的结果集中。
5. any:将表达式与子查询返回的任意一个值进行比较,只要有一个满足条件即可。
6. all:将表达式与子查询返回的每一个值进行比较,必须全部满足条件才为真。
改
--修改数据
update tb_name
set column_name1=xxx,column_name2=yyy...
where ...;
1. where...指定哪些行应该被更新,如果不加where子句,则会更新表中的所有行。
排序查询
--升序
asc
--降序
desc
--排序查询
select ... from ... where ... order by column_name sort_order;
1. 在order by子句中,默认升序排序。
2. null值也参与排序,但是视为比任何值都小。
3. 语法上,先执行from...,再执行where...,然后执行select...,最后执行order by...。
分页筛选
--从下标为0的数据开始,往后筛选n条数据
select ... from ... where ... limit n;
--从下标为s的数据开始,往后筛选n条数据
select ... from ... where ... limit n offset s;
1. 在对结构或数据量不明确的表进行查询时,应尽量采用分页筛选,以避免因一次性检索大量数据而导致系统卡顿。
2. 如果没有足够的数据行,mysql将返回它所能返回的所有行。
分组查询
select func(column_name1) from tb_name group by column_name2 having ...;
1. 分组的目的是为了更好的进行聚合统计。
2. 分组的依据一般是指定的列名,根据该列的不同数据来进行分组。
3. where主要是对分组前具体的某一列进行条件筛选,having主要是对分组后的结果进行条件筛选。即where与having的条件筛选的阶段是不同的。
聚合函数
count() | 返回查询到的数据的数量 |
sum() | 返回查询到的数据的总和,不是数字没有意义 |
avg() | 返回查询到的数据的平均值,不是数字没有意义 |
max() | 返回查询到的数据的最大值,不是数字没有意义 |
min() | 返回查询到的数据的最小值,不是数字没有意义 |
1. mysql聚合函数用于对一组数据进行汇总分析,常用于生成报表或统计数据,例如计算总和、平均值、最大值、最小值、数量等。
致谢
感谢您花时间阅读这篇文章!如果您对本文有任何疑问、建议或是想要分享您的看法,请不要犹豫,在评论区留下您的宝贵意见。每一次互动都是我前进的动力,您的支持是我最大的鼓励。期待与您的交流,让我们共同成长,探索技术世界的无限可能!