持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流
作者简介:
- CSDN java领域新星创作者blog.csdn.net/bug..
- 掘金LV3用户 juejin.cn/user/bug..
- 阿里云社区专家博主,星级博主,developer.aliyun.com/bug..
- 华为云云享专家 bbs.huaweicloud.com/bug..
查询
聚合查询
- 聚合函数 常见的的统计计数,计数平均值等,可以通过聚合函数来实现,常见的聚合函数如下:
| 函数 | 说明 |
|---|---|
| count(列名) | 返回查询到的数据的数量 |
| sum(表达式/列名) | 返回查询到的数据总和,不是数字没有意义 |
| max(表达式/列名) | 返回查询到的数据最大值,不是数字没有意义 |
| min(表达式/列名) | 返回查询到的数据最小值,不是数字没有意义 |
| avg(表达式/列名) | 返回查询到的数据平均值,不是数字没有意义 |
count
查询多少学生!
sum
查询总分
avg
查询每科平均成绩
max
查询最大值
min
查询最小值
group by子句select中使用group by子句可以对指定列进行分组查询。需要满足:使用group by进行分组查询时,select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中。 也就是说,group by子句可以通过列进行分组! 例如下方的emp中根据role这一列我们可以将该表分成多组!根据
role分组查询不同
role组中的人数 平均薪水,最高薪水,最低薪水!havinggroup by子句进行分组以后,需要对分组结果再进行条件过滤时,不能使用where语句,而需要用having显示平均工资低于1500的角色和它的平均工资!
联合查询
实际上我们的数据库,查询数据时,如果有多张表的数据,我们采用多表查询,多表查询通常采用笛卡尔积的方式! 啥是笛卡尔积呢???
笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 [1] --来自百度 。
通俗点说就是,
R表和S表,笛卡尔积后变成了RXS表如果R表有n*mS表有x*y,那么RXS就是n*x行m*y列!!!
那么笛卡尔积有什么用呢?
当我们需要查询一个学生表对应的班级表时,我们便可以借助笛卡尔积!!!
但是我们可以看到使用笛卡尔积后,学生表和班级表中的班级
id并没有一一对应! 所以当我们使用笛卡尔积查看两张表时需要加一些限制条件!!!
当我们加了一个限制条件后,
where class.id = student.class_id;
我们便可以将两张表的对应关系找出来!~!!!
- 内连接
SQL语句select 字段 from 表1 别名1 [inner] join 表2 别名2 on 连接条件 and 其他条件;select 字段 from 表1 别名1,表2 别名2 where 连接条件 and 其他条件;我们可以通过上述语句进行内连接!!! 使用where限制条件!!!查找
qq为112的学生!!!使用
join on限制条件!!!表1 join 表2 on 条件 - 外连接
外连接分为左外连接和右外连接。如果联合查询,左侧的表完全显示我们就说是左外连接;右侧的表完全显示我们就说是右外连接。
-- 左外连接,表1完全显示
select 字段名 from 表名1 left join 表名2 on 连接条件;
-- 右外连接,表2完全显示
select 字段 from 表名1 right join 表名2 on 连接条件;
我们先查看这两张表的内容!!
当我们使用内连接,左外连接,右外连接时区别如下:
内连接:
可以看到内连接就是两个表的交集:
左外连接:
右外连接:
- 自连接
自连接是指同一张表连接自身查询!
案例:
显示所有数学成绩比语文成绩高的人的成绩的学生信息!
如果我们这张表中的每一门成绩都在一列中,那么显然我们只要使用一个
where判断一下即可! 比如:但是如果每门的成绩并不是在单独的一列中,那该如何查询呢? 这时就需要用到自连接了!!! 就比如下方我们有三张表 分别为成绩表和学生表和课程表! 如果我们要查询
java程序设计成绩比数据库原理成绩高的学生信息该如何操作呢?自连接就是将行改成列!!! 将一直表起多个别名,就得到多张表!!!! 通过笛卡尔积,我们就可以将这两张表中的行变成列! 我们先对成绩表进行笛卡尔积!!!
一开始的成绩表:
可以看到学生
id为1的学生的课程成绩都在一列中!!
而我们要将不同科目的成绩放在不同的列才能进行比较!!!
进行笛卡尔积后的成绩表:
选择课程
java程序设计和数据库原理的课程id!!!
我们将两门课的成绩分别放在了一个列中了!!!
我们再进行限定就可以找到满足条件的学生信息
最后查询
java程序设计比数据库原理的课程成绩高的学生信息!!!
步骤有点繁琐!!!
原理就是将行转化成列!
将一张表期别名利用笛卡尔积转化!!!
- 子查询
子查询简单讲就是,多个
sql查询语句的嵌套!!! 就是套娃!!! 不建议的操作! 反人类! 代码可读性差 了解一下即可!
如果我们要查询java程序设计的成绩!!
我们第一步要获取到这个课程的id
然后通过这个课程
id在成绩表中寻找即可!!!
子查询就一步即可!!!
显然这玩意除了能装外没啥用!!!
- 合并查询
在实际应用中,为了合并多个
select的执行结果,可以使用集合操作符union,union all。使用union和union all时,前后查询的结果集中,字段需要一致!
我们就是可以用union 和 union all在相同表或者不同表中合并多个select 相当于 单表查询中的or
union
查询刘备和曹操的成绩信息:
or
union
union和union all可以合并多个sql语句! 可以在不同的表中进行查询!!!
union all
union all 和union唯一的区别就是 union all不会去掉结果集中的重复行! 而union会进行去重!