MySQL初阶:查询进阶

发布于:2025-05-13 ⋅ 阅读:(12) ⋅ 点赞:(0)

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

创建一个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;

合并查询


网站公告

今日签到

点亮在社区的每一天
去签到