dedecms采集规则各类网站,外贸全网营销推广,网址大全是什么浏览器,python自学网站免费菜鸟教程每日激励#xff1a;“不设限和自我肯定的心态#xff1a;I can do all things。 — Stephen Curry” 绪论#xff1a; 本章是MySQL篇中#xff0c;非常实用性的篇章#xff0c;相信在实际工作中对于表的查询#xff0c;很多时候会涉及多表的查询#xff0c;在多表查询… 每日激励“不设限和自我肯定的心态I can do all things。 — Stephen Curry” 绪论 本章是MySQL篇中非常实用性的篇章相信在实际工作中对于表的查询很多时候会涉及多表的查询在多表查询的时候光是前面的篇章可能无法完成所以本章来了本章将主要结合子查询 笛卡尔积 的方式来解决多表查询问题下一章将更新MySQL索引敬请期待~ ———————— 早关注不迷路话不多说安全带系好发车啦建议电脑观看。 复合查询
前面我们讲解的mysql表的查询都是对一张表进行查询在实际开发中这远远不够所以复合查询就是同时查询多个表中的内容。
1. 回顾查询基本操作
下面将通过几个具体情况来进行回顾
查询工资高于500或岗位为MANAGER的雇员同时还要满足他们的姓名首字母为大写的Jwhere、or/and 、like
分析查询目标
工资高于500 / 岗位为MANAGER的雇员查询select * from emp where sal 500 or job MANAGER姓名首字母为大写的... and ename lik J%; / and substring(ename,1,1) J 以下表数据来操作
select * from emp where sal 500 or job MANAGER and ename lik J%; / and substring(ename,1,1) J按照部门号升序而雇员的工资降序排序order by asc/desc
比较简单就不分析了其中要注意的就是对于要进行排序的字段来说那个在前面那个排序 优先级就较高
select * from emp order by deptno asc,sal desc;使用年薪进行降序排序select 自定义添加新列、ifnull、order by
年薪 月薪sal * 12 奖金comm 获取某个人并创建新列在select后面直接创建要求并可以创建别名 其中任何值和NULL运算都会变成NULL此处该人的comm为NULL 此时就要将这种情况避免使用ifnull
select sal*12ifnull(comm,0) 年薪 from emp;在加上名称和月薪奖金年薪这样跟好看 在进行排序得到年薪的降序order by desc
显示工资最高的员工的名字和工作岗位select 内部允许使用 嵌套select、max函数
显示工资最高 select max(sal) from emp; 该情况是在表中不存在的所以需要提前筛选出来员工的名字和工作岗位 select ename job where sal..
select ename,job where sal(select max(sal) from emp);显示工资高于平均工资的员工信息select嵌套 avg函数
平均工资select avg(sal) 平均工资 from emp ; 方法类似同上
select * from emp where sal (select avg(sal) from emp);group by 分组 GROUP BY 子句用于将查询结果按照指定的列进行分组通常与聚合函数一起使用。 显示每个部门的平均工资和最高工资format
平均工资、最高工资select max(sal) ,avg(sal) from emp 每个部门对应着需要分组goup by deptno
select deptno, max(sal) ,avg(sal) from emp group by deptno;在使用format设置一下小数点
having HAVING 子句用于对分组后的结果进行条件过滤类似于 WHERE但专门用于分组后的筛选。 显示平均工资低于2000的部门号和它的平均工资
平均工资同上平均工资低于2000的部门号分组
就需要对分组之后的数据再做筛选having出小于2000的部门号
显示每种岗位的雇员总数平均工资
每种岗位group分组雇员总数平均工资筛选内容
2 多表查询多表笛卡尔积
结合实例边练习边了解边快速上手学习
1. 显示部门号为10的部门名员工名和工资
因为上面的数据雇员名、雇员工资以及所在部门和部门号为10的需要来自EMP和DEPT两张表因此要联合查询 EMP需要ename、sal DEPT需要dname 将他们直接使用select结合 对两张表直接进行整合他的情况是将两表中的数据进行穷举组合笛卡尔积、任何一种组合都包括了那么此时得到的就是一张新的表了对该表进行操作就是单表操作了 再对该表进行筛选选出正确的数据因为直接穷举的话他们的数据是不正确的我们需要将对应部门的数据进行整合这个部门编号就相当于一个外键的连接作用 然后就得到了正确的两表结合的数据如上图 回到题目
显示雇员名、雇员工资所在部门的名字和部门号为10在表结合后面再添加部门筛选条件
select ename, sal,dname from EMP, DEPT where EMP.deptnoDEPT.deptno and DEPT.deptno 10;其中需要注意的是deptno的有两个所以需要筛选一下
显示各个员工的姓名工资及工资级别
需要的新表salgrade 结合emp得到新表 需要员工的姓名工资及工资级别 其中因为是穷举的所以说表是用问题的而我们找的是正确的工资等级所以结合sal 、losal、hisal 通过between and来进行分级
总结 在进行多表查询的时候将两张表合并的方式是笛卡尔积式的穷举结合这样可能会导致数据出现问题所以我们需要进行再次的筛选得到符合目的的新表再对这个表进行正常的单表处理即可 自连接 自连接是指在同一张表连接查询 同一张表进行笛卡尔积 发现 同一张表并不能直接的进行笛卡尔积合并但将这张表重命名为两个名字就能进行合并了也就是自连接
那什么情况下会使用自连接呢
显示员工FORD的上级领导的编号和姓名
mgr是员工领导的编号–empno 此处为什么要使用自连接呢 因为员工的领导本质也是员工本题每个员工的领导只是通过编号来指定的所以说无法直接找到领导的信息 若想找到某个员工的领导姓名的话就需要员工信息中的领导的编号和表中的员工编号进行比对筛选才能找到领导的信息
找到FORD的领导编号----empselect mgr from emp where enameFORD;在从emp表中使用领导编号找领导信息—empselect ename,emobo from emp where ename(...); 子查询
select empno,ename from emp where emp.empno(select mgr from emp where enameFORD);第二种方式多表查询自查询
将相同的表重命名为两张表再进行笛卡尔积合并从两表结合的新表中找到FORD在从这两张表中获取 判断 表1中的领导编号 表二中的员工编号的 信息 子查询
子查询是指嵌入在其他sql语句中的select语句也叫嵌套查询
单行子查询
显示SMITH同一部门的员工
select * from EMP WHERE deptno (select deptno from EMP where enamesmith);多行子查询
查询和10号部门的工作岗位相同的雇员的名字岗位工资部门号但是不包含10自己的 分析题目 10号部门岗位distinct去重
in 查看是否包含
筛选出job岗位包含10号部门岗位的相同的雇员的名字岗位工资部门号 其中还不要10号部门的那么再次筛选 deptno 10 、就是不等与
进一步拓展结合前面的理解下本质就是将上面的结果在重命名为一个张表在和其他表进行合并得到领导名称 其中select子查询还能当成一张表出现在from后面
all获取所有信息
显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
工资比部门30的所有员工找到30部门的最高工资进行比较的员工的姓名、工资和部门号通过前面的最高工资再在表中进行遍历所有比较 这种本质也可以但若想更加的具体且通俗易懂 使用all函数比较所有情况不需要提前获取最大的而是直接比较所有
any关键字
显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号包含自己部门的员工 很好理解就不过诉了
多列子查询
单行子查询是指子查询只返回单列单行数据多行子查询是指返回单列多行数据都是针对单列而言的而多列子查询则是指查询返回多个列数据的子查询语句 可能有点不太好理解具体见下面实例
查询和SMITH的部门和岗位完全相同的所有雇员不含SMITH本人
注意 任何时刻查询出来的临时结构本质在逻辑上也是表结构
子查询与from
子查询语句出现在from子句中。这里要用到数据查询的技巧把一个子查询当做一个临时表使用。
显示每个高于自己部门平均工资的员工的姓名、部门、工资、平均工资
找到每个部门的平均工资将原本的表和该表进行笛卡尔积生成新表就得到了每个员工和平均工资那么就变成了单标查询 若还需要办公地址就再需要表 再次结合并且去掉没用的值 再筛选出需要的字段
select ename, deptno, sal, format(asal,2) from EMP, (select avg(sal) asal, deptno dt from EMP group by deptno) tmp where EMP.sal tmp.asal and EMP.deptnotmp.dt;查找每个部门工资最高的人的姓名、工资、部门、最高工资
显示每个部门的信息部门名编号地址和人员数量 select DEPT.deptno, dname, mycnt, loc from DEPT, (select count(*) mycnt, deptno from EMP group by deptno) tmp where DEPT.deptnotmp.deptno;mysql一切皆表 解决多表问题的本质想办法将多表转化为单表所以mysql中所有select的问题全部都可以转成单标问题
合并查询
在实际应用中为了合并多个select的执行结果可以使用集合操作符 unionunion all
union
该操作符用于取得两个结果集的并集。当使用该操作符时会自动去掉结果集中的重复行。
将工资大于2500或职位是MANAGER的人找出来
union all
该操作符用于取得两个结果集的并集。当使用该操作符时不会去掉结果集中的重复行。
其中注意的话使用union进行拼接的前提是列相同 本章完。预知后事如何暂听下回分解。
如果有任何问题欢迎讨论哈
如果觉得这篇文章对你有所帮助的话点点赞吧
持续更新大量MySQL细致内容早关注不迷路。