目录
1.MySQL的增删改查
英文简写:CRUD : (增加)Create . (查询)Retrieve .(更新)Update .(删除)Delete
在进行表操作之前要选中数据库和创建表,对这些知识还陌生的可以看我上一篇博客https://blog.csdn.net/weixin_57190845/article/details/125770430?spm=1001.2014.3001.5501
1.1 插入
首先是增加,我们一般加插入一条记录,根据创建表时的数据类型填入对应的元素.
语句:insert into + 表名 +(想插入的字段) +value(对应的元素)
例子:
我先创建一个表,字段分别为 id(int类型),name(字符串类型);
然后:根据字段对应的数据类型输入对应的数据
如果只想对单字段进行插入 例如上面只想插入id 不想插入member
只需这样写:insert into member (id)value(1);就可以了,连基本数据类型int都不用写;
如果是插入多行数据的话,把一条记录用括号括起来然后记录之间用逗号隔开
例:
insert into student (id, sn, name) value
(102, 20001, '小明''),
(103, 20002, '小熊');
1.2 查询
插入后想把结果都显示出来就要用到查询
select 字段 from 表名
如果想查询全列的话:字段那里打*
例:
如果是想显示其中几个字段 就把字段用逗号隔开写在select后面
例:
而且上面还有一个点:想同时显示两张表的内容可以用逗号隔开再写一个表名就可以了
字段中也可以用表达式来进行查询:
表达式可包含单个或多个字段,也可以不包含字段
这里是显示sex和avg(salary)两个字段
select id, name, 10 from exam_result;
例如这里字段只会显示10并没有什么意义;
select id, name, chinese + math + english from exam_result;
例如这个想查询同学的成绩总分,原来表有三科的成绩,现在可以在字段中显现出来是三科加起来的总分
也可以给表达式取别名:在表达式后+(as) 别名, 括号表示as可有可无
select id, name, chinese + math + english as total FROM exam_result;
同一字段中,如果数据有重复不想显示两个或多个,可以在select后面字段的前面加distinct
例:select math from exam_result;
+--------+
| math |
+--------+
| | | | | | | | 98 | 78 | 98 | 84 | 85 | 73 | 65 | |
+--------+
7 rows in set (0.00 sec)
-- 去重结果
select distinct math from exam_result;
+--------+
| math |
+--------+
| | | | | | | 98 | 78 | 84 | 85 | 73 | 65 | |
+--------+
6 rows in set (0.00 sec)
上面的例子把math的两个98的值去掉只剩一个了;
既然数据有重复,通过去重可以筛选数据,那我们可不可以根据一些条件使得表能按照我们想要显示的去筛选数据呢?
条件查询:where
按照where后的条件筛选数据:
例:
对比之前合并两张表的那张图,就可以看出加了条件之后筛选值出来的效果.
条件查询里面有一些运算符:
比较运算符:
>,>=,<,<= 大于,大于等于,小于,小于等于
= 注意这里的等号不是复制,是等于的意思,但如果是null=null 结果是null;
<=> 等于,与上面不同的是null<=>null的结果是true(1);
!=,<> 不等于
between a and b 范围匹配,区间左闭右闭[a,b],符合返回true(1);
in(a,b,c) 多选项匹配, a,b,c都是选项.可以有多个选项只要数据等于其中的一个就返回true(1)
is null 是为空的
in not null 不是空的
like 模糊匹配 %表示多个包括0个任意字符;_表示一个字符
例:like '林%' 这个可以筛选出任何有林字开头的字符
那like '%林' 就是可以筛选任何以林字结尾的字符
like '林%琳'就是说可以筛选开头为林,结尾为琳的字符
like '林_' 只能匹配以林开头,一共两个字的字符
英文也可以,默认不区分大小写,如果需要区分大小写需要加上binary
解决方法(查询时指定区分大小写):在like后面加个binary
就OK了,或者在查询字段前面加binary
SELECT FirstName FROM StaffList WHERE FirstName LIKE BINARY '_A%'
或者select binary fistname from
逻辑运算符:
and 跟我们常见的用法一样,可以理解成逻辑与,条件必须都符合才返回true;
or 理解成逻辑或,有一个条件符合就可以返回true
not 理解成逻辑非 相当于!
聚合查询:
上面我们说到可以用表达式查询进行字段的合并,数据也会进行对应的合并,这种是不是列和列之间在进行运算的呢,因为我们之前说过一列称为一个字段.那记录之间也就是行和行之间能不能进行运算呢?下面我们推出一个概念叫聚合查询:
聚合查询通过聚合函数来实现
1.count(字段名),统计这个字段在表中一共记录了几次,按一行一行来看.
特殊:count(*)如果括号里是星号*,则会返回表中一共有多少条记录,就是有多少行,因为*是MySQL的一种通配符,不懂这个名词的同学可以简单理解成全部的意思,跟select * from查询显示全部字段的意思是相同的.
2.sum(字段名或表达式)统计同一字段行与行的总和,相当于是行之间数据的累加
上述salary这里就可以求和并查询出来
3.avg(字段名或表达式)求同一字段(列)数据的平均数
4.max(字段名或表达式)求同一字段的最大值
5.min(字段名或表达式)求同一字段的最小值
分组查询
当我们想筛选一个以组别为单位的各项数据(字段)时,需要对这个数据进行分组;
分组后这一个字段对应多项数据
select 字段 + from 表名 + group by + 要分组的字段
例:
以性别分组,分别求男女的平均薪水
2.语句的总体顺序
语句中各子句完整执行顺序概括(按照顺序号执行):
1. from (这里也包括from中的子语句)
2. join
3.on
4.where
5.group by(开始使用select中的别名,后面的语句中都可以使用;但是不能使用ROW_NUMBER()等窗口函数的别名)
6.avg,sum.... 等聚合函数
7.having
8.select
9.distinct
10.order by
11.limit
每个子句执行顺序分析
所有的 查询语句都是从from开始执行的,在执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入。
1. from
form是一次查询语句的开端。
如果是一张表,会直接操作这张表;
如果这个from后面是一个子查询,会先执行子查询中的内容,子查询的结果也就是第一个虚拟表T1。(注意:子查询中的执行流程也是按照本篇文章讲的顺序哦)。
如果需要关联表,使用join,请看2,3
2. join
如果from后面是多张表,join关联,会首先对前两个表执行一个笛卡尔乘积,这时候就会生成第一个虚拟表T1(注意:这里会选择相对小的表作为基础表);
3. on
对虚表T1进行ON筛选,只有那些符合的行才会被记录在虚表T2中。(注意,这里的这里如果还有第三个表与之关联,会用T2与第三个表进行笛卡尔乘积生产T3表,继续重复3. on步骤生成T4表,不过下面的顺序讲解暂时不针对这里的T3和T4,只是从一个表关联查询T2继续说)
4. where
对虚拟表T2进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表T3中。
5.group by
group by 子句将中的唯一的值组合成为一组,得到虚拟表T4。如果应用了group by,那么后面的所有步骤都只能操作T4的列或者是执行6.聚合函数(count、sum、avg等)。(注意:原因在于分组后最终的结果集中只包含每个组中的一行。谨记,不然这里会出现很多问题,下面的代码误区会特别说。)
6. avg,sum.... 等聚合函数
聚合函数只是对分组的结果进行一些处理,拿到某些想要的聚合值,例如求和,统计数量等,并不生成虚拟表。
7. having
应用having筛选器,生成T5。HAVING子句主要和GROUP BY子句配合使用,having筛选器是第一个也是为唯一一个应用到已分组数据的筛选器。
8. select
执行select操作,选择指定的列,插入到虚拟表T6中。
9. distinct
对T6中的记录进行去重。移除相同的行,产生虚拟表T7.(注意:事实上如果应用了group by子句那么distinct是多余的,原因同样在于,分组的时候是将列中唯一的值分成一组,同时只为每一组返回一行记录,那么所以的记录都将是不相同的。)
10. order by
应用order by子句。按照order_by_condition排序T7,此时返回的一个游标,而不是虚拟表。sql是基于集合的理论的,集合不会预先对他的行排序,它只是成员的逻辑集合,成员的顺序是无关紧要的。对表进行排序的查询可以返回一个对象,这个对象包含特定的物理顺序的逻辑组织。这个对象就叫游标。
oder by的几点说明
因为order by返回值是游标,那么使用order by 子句查询不能应用于表表达式。
order by排序是很需要成本的,除非你必须要排序,否则最好不要指定order by,
order by的两个参数 asc(升序排列) desc(降序排列)
11. limit
取出指定行的记录,产生虚拟表T9, 并将结果返回。
limit后面的参数可以是 一个limit m ,也可以是limit m n,表示从第m条到第n条数据。
(注意:很多开发人员喜欢使用该语句来解决分页问题。对于小数据,使用LIMIT子句没有任何问题,当数据量非常大的时候,使用LIMIT m,n是非常低效的。因为LIMIT的机制是每次都是从头开始扫描,如果需要从第60万行开始,读取3条数据,就需要先扫描定位到60万行,然后再进行读取,而扫描的过程是一个非常低效的过程。所以,对于大数据处理时,是非常有必要在应用层建立一定的缓存机制)
语句顺序部分参考链接:https://blog.csdn.net/Dlgdlgd/article/details/122406324