MySQL初阶:查询进阶

查询可以搭配插入操作进行使用:

创建一个class表(id int,varchar(10) classname),和一个student表(id int,varchar(10) studentname),class表中有三条记录,student表无记录:

此时使用查询和搭配操作就可以实现将class表中的记录全部插入到student表中:

注意事项:可以进行实行多次插入;插入表和被插入表的参数列表的列和类型要相同,否则会报错。

聚合查询

表达式查询是针对列和列之间进行运算,聚合查询是在行和行之间进行运算。

sql中通过-- 或 # 的方式代表注释

聚合函数

sql中提供了一些"聚合函数"来完成行和行之间的运算。

count([distinct] 列名):用于计算行数。

先计算select*,再针对结果集合进行统计。

注意事项:如果是count(*),当有null时也不会有影响;但是如果针对某一行,例如count(name),中出现null,null这一行记录就不会被计入,被直接忽略。

也可以用distinct进行去重。

sum([distinct] 列名):把这一列的若干行进行相加,但是只能针对数字类型(byte,int....)。

例如想求出所有同学的数学成绩:

同样的可以在括号内进行一些运算:

注意事项:如果有null,null会被排除不会进行相加。

如果进行字符串相加,结果是0,这是因为sql会尝试将字符串强转成数字,转不成功会有警告;如果插入的值是'07'这样的数,显示结果就是7。

avg([distinct] 列名):和sum类似,同样只能针对数字类型进行操作,是针对数字类型的行进行求相加后的平均值。

当遇到非数字类型就会进行强转,不成功警告。

max([distinct] 列名)和 min([distinct] 列名):分别求这一列中的最大/最小值,也是和sum一样,针对数字类型。

聚合查询

使用group by进行分组,针对每一个分组,再分别进行聚合查询。

创建一个表:

进行分组聚合查询:

使用group by时还可以搭配条件,但是要区分出条件是在分组之前还是在分组之后。

1) 如果是分组之前,使用where,一般在group by的前面。

2) 如果是分组后,使用having,在group by 后使用。

**3)**如果两个条件都要执行,则where和having可以一起使用。

注意事项:如果针对分组之后不使用聚合函数(此处的avg),此时的结果就是每一组的某一个代表数据。

这里的group by指定的这一列,每一组记录的列相同。

联合查询/多表查询

前面的查询,都是针对一个表,但是有些查询,则是一次性要从多表中进行查询。

笛卡尔积

笛卡尔积是简单的排列组合,把可能的的情况呢穷举了一遍,其中包含一些不合法的数据,所以在进行多表查询的时候要进行筛选。

排列组合

有两个表:class(id ,name),student(id,name,classid)

笛卡尔积就是取第一张表的每一条记录,和student中的记录进行匹配,得到的新记录就是5列:

id ,name,id,name,classid。

新表的记录数就是class表记录数和student表数之积,列数就是两表之和。

连接条件:通过sql条件筛选的条件是连接条件。

联合查询步骤

例如现在有一个score表,一个student表

现在要查询张三的成绩

1)先将两表进行笛卡尔积:

select * from score,student;

2)添加连接条件:

select * from score,student where class.id = student.student_id;

这里查询到的是class中id等于student中student_id的所有记录。

再进一步添加连接条件:

select * from score,student where class.id = student.student_id and student.name = '张三';

此时就完成了一次联合查询。

内连接和外链接

向上面这样的查询方法是内连接。

当两个表中的记录都有对应关系,查询结果就是内连接,但是当出现不对应关系时就要使用外连接。

但是将score中的3改成4,此时就student表中就没有数据对应。

左连接:select * from student left join score on student.id = score.student_id;

此时查询就会显示左边的值,而右边的值全部为null。

自连接

自连接是表自己和自己进行笛卡尔积。

sql中只能进行列和列之间的比较,但是可以使用自连接的方式进行行和行之间的比较。

使用时要给表起别名:select * from score as s1,score as s2;

合并查询

相关推荐
Bruce_Liuxiaowei2 小时前
MySQL完整重置密码流程(针对 macOS)
mysql
麦麦大数据2 小时前
F003疫情传染病数据可视化vue+flask+mysql
mysql·flask·vue·大屏·传染病
薛晓刚3 小时前
当MySQL的int不够用了
数据库
SelectDB技术团队3 小时前
Apache Doris 在菜鸟的大规模湖仓业务场景落地实践
数据库·数据仓库·数据分析·apache doris·菜鸟技术
星空下的曙光3 小时前
mysql 命令语法操作篇 数据库约束有哪些 怎么使用
数据库·mysql
小楓12013 小时前
MySQL數據庫開發教學(一) 基本架構
数据库·后端·mysql
染落林间色3 小时前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
数据库·sql
之诺3 小时前
MySQL通信过程字符集转换
后端·mysql
颜颜yan_4 小时前
企业级时序数据库选型指南:从传统架构向智能时序数据管理的转型之路
数据库·架构·时序数据库
lichenyang4534 小时前
管理项目服务器连接数据库
数据库·后端