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;

合并查询

相关推荐
jingfeng51413 分钟前
MySQL数据类型
数据库·mysql
matlab的学徒19 分钟前
PostgreSQL 安装与操作指南
数据库·postgresql
sweethhheart25 分钟前
【typora激活使用】mac操作方式
前端·数据库·macos
musenh41 分钟前
mysql学习--日志查询
学习·mysql
启明真纳3 小时前
PostgreSQL 单库备份
数据库·postgresql
Amd7943 小时前
PostgreSQL备份不是复制文件?物理vs逻辑咋选?误删还能精准恢复到1分钟前?
数据库·postgresql
wzg20163 小时前
pyqt5 简易入门教程
开发语言·数据库·qt
你是狒狒吗5 小时前
为什么mysql要有主从复制,主库,从库这种东西
数据库·mysql
倔强的石头1068 小时前
【金仓数据库】ksql 指南(一) 连接本地 KingbaseES 数据库与基础交互
数据库·oracle·kingbasees·金仓数据库·ksql
卷Java13 小时前
违规通知功能修改说明
java·数据库·微信小程序·uni-app