网站建设制作设计公司,长春营销型网站设计,wordpress 移动端模板主题,群晖 搭建wordpress文章目录 1.查询的进阶版1.1查询搭配插入进行使用1.2聚合查询1.3group by分组查询1.4联合查询之笛卡尔积1.5左外连接#xff0c;右外连接介绍join on1.6自连表 1.查询的进阶版
1.1查询搭配插入进行使用
我们首先创建两张表#xff0c;一个叫做student,一个叫做student2,两个… 文章目录 1.查询的进阶版1.1查询搭配插入进行使用1.2聚合查询1.3group by分组查询1.4联合查询之笛卡尔积1.5左外连接右外连接介绍join on1.6自连表 1.查询的进阶版
1.1查询搭配插入进行使用
我们首先创建两张表一个叫做student,一个叫做student2,两个表都是只有这个int和varchar 的数据类型这个时候我们向这个第一个表里面直接使用这个insert插入数据但是这个时候student2这个表还是空的 我们查询这个student这个表里面插入的内容 把这个查询的结果直接插入到我们的这个student2这个表里面去这个实际上就是把两个步骤合成了一步但是因为这个是查询结果的插入所以就可以直接把两个语句合并了查询发现这个是成功的 但是上面的这个查询结果的直接插入显然是有局限性的就是两个表的结构必须是一样的否则这个插入注定无法成功我们的两个表都是只有这个id和name两列因此这个是可以把我们查询到的结果直接插入的
1.2聚合查询
聚合查询的这个里面主要就是我们的这个sum,count,min,max等等之类的这个函数的用法添加到了我们原来的这个语句里面去罢了下面我们会依次去演示这个例如count,sum,min,max的用法
首先还是要创建一张表然后向这个表里面插入一些数据例如下面的这个所示我下面的这个演示也是基于下面的这个表进行的 下面的这个就是聚合查询里面的这个count的使用我们可以使用这个count计算这个数据的行数虽然我们通过这个select好像是可以看到这个数据的行数的但是这个是客户端当我们在这个服务器里面通过代码来操作的时候我们是看不到这个信息的因此这个count还是很有必要的
我们不仅可以使用这个通配符表示所有作为我们的查询的内容我们也可以使用这个name进行指定反正我们这个表里面无论使用哪一个索引查询出来的这个结果都是一样的 但是如果哦我们的这个表里面有些数据是空的这个时候我们再次使用这个select进行这个count计数的时候这个null也是会被算上的我们可以insert进去一行全部都是空的数据尝试一下但是我们使用这个name进行统计的时候这个null就不会被统计进去 当然在上面的这个基础之上我们也可以添加上前面的这个约束例如下面的这个就是使用的distinct约束之后对于这个数学这一列进行统计的这个时候分数相同的情况下就不会重复统计了 下面的这个是使用的sum函数进行这个统计的因为这个里面的这个语句写的有问题中间出现了小状况因此这个打上了马赛克我们使用这个sum的时候如果这个里面的参数是我们的这个具体的学科的时候因为这个分数是double类型的数据这个是可以进行相加操作的但是如果我们对于这个name进行求和的操作这个时候输出的结果是0而且会有警告 其实这个主要就是因为我们的name这个类型的数据如果是想要进行求和需要首先进行转化但是这个转化失败了所以这个输出的结果就是0如果我们的这个名字是类似于这个代号001,002,003之类的这个其实这个就是可以正常转换的了
下面的这个就是插入了一行名字是006的数据这个时候再次进行sum求和就会发现这个时候的结果就是我们的6因此这个就可以说明我们的这个006这样类似的这个name是可以被转换成功的但是其他的这个“孙悟空”之类的这个不会被正确转换 此外这个sum里面可以添加一些这个表达式之类的像下面的这个就是在我们的这个sum里面添加了一个表达式表达的就是三门学科的平均成绩这个时候我们的这个sql语句执行的时候就会首先去执行这个求和的过程chinesemathenglish然后再去把每一个人的这个分数进行sum操作这其实就是两个步骤使用一个sql语句进行表达罢了 除此之外这个SQL语句里面还可以使用这个min,max,avg这样的函数进行一些数据的处理下面的这个就是求出来某一门科目的这个最大值最小值以及平均值的SQL语句其实也不是很困难 1.3group by分组查询
我们的操作还是基于这个表来完成的因此我们首要的任务就是创建一张表我下面的这个是一个简单的和这个公司的业务类型以及这个薪资姓名制作的一张表 这个时候我们计算一下这几个人的平均的薪资使用的就是我们的这个avg聚合函数但是这个是所有人的平均薪资这个显然是不可以客观反应我们的实际情况的因此我们需要按照这个置为分别去求解这个对应岗位的平均薪资这个就是我们的group by分组查询 下面的这个就是按照岗位进行的平均薪资的计算这个就是在原来的基础上面加上了这个group by分组的依据select后面的两个参数就是我们打印输出的选定的内容 我们使用这个groupby的时候去即使是可以搭配条件进行使用的例如这个需要注意的是我们的这个条件是分组之前的条件还是分组之后的条件
例如下面的两个情况
1.查询每一个岗位的平均工资但是排除张三
2.查询每一个岗位的平均薪资但是排除平均薪资超过了2w的结果
上面的这两个情况就是很明显的第一个就是属于分组前就需要使用这个条件第二个则是分组之后计算出来的结果结合我们的条件再去进行判断
首先看第一个情况这个时候的条件我们只需要使用这个sql语句里面的where加上这个条件进行筛选就可以了
select role,avg(salary) from emp where name ! ‘张三’ group by role;
再看第二个情况这个时候我们需要使用这个having子句加在这个group by的后面
select role,avg(salary) from emp group by role having avg(salary) 20000;
在我们玩呢SQL语句里面可以只使用一个语句同时进行上面两个条件的筛选
select role,avg(salary) from emp where name ! ‘张三’ group by role having avg(salary) 20000;
1.4联合查询之笛卡尔积
想要知道这个联合查询我们时候选要来学习一下这个笛卡尔积
下面的这个是两张表一个是我们的class班级表一个是我们的student学生表两个表里面都有学生班级的信息只不过这个列名不一样一个是使用的id表示的一个是使用的classid表示的 什么是笛卡尔积实际上就是排列组合我们的第一个表里面的每一行都要和第二个表里面的内容进行组合因此这个新的表的列数就是两个表的和新的表的行数就是两个表的行的乘积数学知识不难理解哈
我们首先创建四张表
学生表班级表分数表和课程表内容如下 这个分数表里面虽然都是数字但是这个是可以看出来一定的信息的这个score就是我们的分数但是这个student_id和course_id就需要到上面的表里面去找到对应的这个课程的名字和学生的名字例如这个里面的第一行的student_id对象的就是李逵course_id对应的就是课程表里面的这个java课程因此这个就是李逵同学的这个java课程的分数就是70.5通过这样的方式我们在每一行数据代表的都是某一个同学的某一门课程的实际分数 练习案例查询许仙同学的成绩
我们首先要知道需要合并那两个表一个就是我们学生表因为是许仙同学一个就是分数表因为要找的是成绩
我们的这个联合查询也是很简单的就是使用的这个
select * from student,score;(这个顺序决定了哪个表在左边哪个表在右边
先取出来哪个表和另外的表进行排列组合都是可以的 我们要选出来上面的这个笛卡尔积之后的这个里面两个id相等的情况其他的数据都是无意义的这个时候我们可以使用这个
select * from student,score where id student_id
但是这个语句会有问题因为如果我们的这两个表里面出现了相同名字的类这个时候的连接就会出现问题
下面的这个是建议的写法指出来自己的这个咧处于哪一个表里面 下面的这个就是我们只需要选择出来这个成绩的name是许仙的
select * from student,score where student.idscore.student_id and student.name‘许仙’; 上面的这个依然显得很冗余这个时候我们让这个select后面的这个东西制定出来具体的类不要显示出阿里所有的这个信息因此我们针对查询结果进行精简
select student.name score.score from student,score where student.idscore.student_id and student.name‘许仙’;
1.5左外连接右外连接介绍join on
上面介绍的这个内容都是属于内连接实际上我们还有外连接等连接方式其中这个外连接里面还分为这个左外连接和右外连接
在下面的这个表里面如果我们的右边的这个表里面的这个4换成3两个表里面的这个id是对应的这个时候无论我们是使用这个内连接还是外连接其实这个结果都是一样的但是我们为什么要了解这个外连接呢就是如果这个是4两个表里面的这个id不是完全对应的这个时候需要我们的外连接方式
就上面的这个数据我们可以按照下面的这个流程逐步过渡到这个外连接
select * from student,score where student.idscore.id这个方式就是内连接的方式得到的是两边的这个公共属性的数据
select * from student join score on student.idscore.id;这个加上了join on这个选项实际上输出的结果和上面的这个是一样的
join on和上面的这个内连接可以达到相同的效果为什么还要知道这个就是因为我们的这个左外连接和有外连接是基于这个进行改造的
左外连接select * from student left join score on student.idscore.id 右外连接select * from student right join score on student.idscore.id 仔细观察不难发现两个连接方式很显然就是因为两个表里面的一些内容是你有我没有或者是我有你没有的这个时候左外连接就是把左边的这个表里面的特有内容添加上去添加到我们的内连接的这个结果里面因为我们的内连接是显示的公共的属性内容左外连接和右外链接都是在这个公共的上面去添加内容的这个时候右边的这个表里面没有对应内容就是用null进行填充反之亦然
1.6自连表
就是自己和自己连接首先通过下面的这个看一下为什么要搞这个自连接
我们想要显示这个计算机原理比这个java课程的成绩高的这个相关的信息我们的这个成绩表里面这个成绩都是一行一行进行读取的这个时候我们的这个每一行是没有办法直接比较的因为我们上面的这个各种函数和操作都是列与列作为判断的条件的 这个时候我们想要比较需要是这个相同的student_id找出这个对应的这个1,3分别对应这个计算机原理和java课程对应的成绩进行比较这个就需要使用我们的自连接
但是链接的时候名字不可以一样如果我们直接使用score 链接这个score就会报错我们可以给这个表取两个别名然后自连接
select * from score as s1,score as s2 where s1.student_id s2.student_id;
select * from score as s1,score as s2 where s1.student_id s2.student_id and s1.course_id3 and s2.course_id 1;
这个时候其实打印的这个结果就已经有些眉目了我们的每一行里面这个student1代表的就是一个学生的这一行数据里面既有这个1课程的成绩又有这个3课程的成绩这个就可以使用这个列进行这个成绩的比较了-------这个就是把行之间的比较转换为我们的列之间的比较------------------自连接的核心精魂 select * from score as s1,score as s2 where s1.student_id s2.student_id and s1.course_id3 and s2.course_id 1 and s1.scores2.score;---------------进一步筛选
select s1.student_id,s1.score,s2.score from score as s1,score as s2 where s1.student_id s2.student_id and s1.score s2.score;—选出来有用信息的列 最后的这个结果和学生表进行笛卡尔积就可以得到这个学生的名字
最后的结果和我们的课程表进行笛卡尔积就可以得到这个课程的名字