泉缘泉 发表于 2024-11-27 09:44:51

【MySQL】开发技术深度探索:mysql数据库复合查询全面详解

        前言:本节内容为mysql的符合查询。 本节内容是基本查询的进阶, 是对内置函数, 基本查询的聚集使用。 友友们多多利用文章中的案例练习进行掌握。 
        ps:本节内容照旧使用员工表进行演示, 没有员工表的友友可以去网络上找一找。然后就可以放心观看喽!
目次
基本查询回首
多表查询
自毗连
子查询
单行子查询
多行子查询
多列子查询
在from子句中使用子查询
合并查询
union
Union all

基本查询回首

查询工资高于500或岗位为MANAGER的员工, 同时还要满足他们的名字的首字母大写的J:
select * from emp where (sal > 500 or job = 'MANAGER') and ename like 'J%'; https://i-blog.csdnimg.cn/direct/2c6cfee84c0e4d8787458896d4a1d450.png
         这条sql语句应该先写出 select * from emp where sal > 500 or job = 'MANAGER', 查出所有的工资高于500或者岗位为MANAGER的员工。 然后再将工资高于500或者岗位为MANAGER这个条件括起来。 再and后面的条件。 
        也可以使用字符串函数, 结果雷同:
select * from emp where (sal > 500 or job = 'MANAGER') and substring(ename, 1, 1) = 'J';
https://i-blog.csdnimg.cn/direct/3852517a758745fd8c2441ee647a9ae7.png

按照部门号升序, 而雇员的工资降序排序:
select * from emp order by deptno asc, sal desc;
https://i-blog.csdnimg.cn/direct/bcb813477f8642c482e1c83aa8363a5e.png

按照年薪进行降序排序:
select * from emp order by (sal * 12 + ifnull(comm, 0)) desc;//comm有可能是null, null不参与运算, 所以ifnull用来判断是否是null。
https://i-blog.csdnimg.cn/direct/4c423fad661147459960f3f5c9d67f73.png 
查询工资最高的人的名字和工作岗位:
        工资最高实在就是要进行聚合统计。 我们怎样找到工资最高, 就是使用max函数:
select max(sal) from emp; https://i-blog.csdnimg.cn/direct/6e32c866f2064713af2c4613d5e875e3.png
        查询出最高工资是多少了之后, 就将这个结果放到where字句当中。 ——也就是说, where子句答应再次进行内部查询:
select ename, job from emp where sal = (select max(sal) from emp); https://i-blog.csdnimg.cn/direct/bb8165144af4487a8a2a441eb78bb664.png
显示工资高于平均工资的员工信息:
select avg(sal) 平均工资 from emp;
 https://i-blog.csdnimg.cn/direct/9676a3b4eec24f17b70573c62155ac4b.png 
        先拎出来平均工资。然后再放到where子句中:
select * from emp where sal > (select avg(sal) 平均工资 from emp);
https://i-blog.csdnimg.cn/direct/0635d362744d436ca4df79b84436213c.png 
显示每个部门的平均工资和最高工资:
select deptno, avg(sal), max(sal) from emp group by deptno;
https://i-blog.csdnimg.cn/direct/e1820b69b9274f3d879a9ea0d4980c32.png

显示平均工资低于2000的部门号和它的平均工资:
select avg(sal) from emp group by deptno having avg(sal) < 2000;
https://i-blog.csdnimg.cn/direct/067259a3f1bc432ebc96eb0bf6d85645.png
 
显示每种岗位的雇员总数, 平均工资:
select count(*) 总人数, avg(sal) from emp group by job; https://i-blog.csdnimg.cn/direct/cc43f9b6718e4f489defe8bb51f394f6.png 
多表查询

我们可以从多张表中获取数据:https://i-blog.csdnimg.cn/direct/4d4dc50592d44e269c32757e3a6a8376.png
        如果我们对两张表做查询, 那么查询到的结果我们可以看到, 就是拿着第一张表的第一条信息, 和第二张表的四条信息做组合。再拿着第二条信息和第二张表的四个信息组合。以是我们就能知道, 两张表查询, 是将数据进行穷举组合 -- 把这种组合方式叫做笛卡尔积。
        向上main的查询结果, 我们可以看到第一条:SMITH这个人有两个deptno信息, 这样的结果是没故意义的。以是我们就要将这些没故意义的数据删除:
select * from emp, dept where emp.deptno = dept.deptno ;
https://i-blog.csdnimg.cn/direct/0c19c87a2b07463580ab803b553153e2.png
然后再来做其他需求。

下面看一些示例:
显示雇员名、雇员工资以及地点部门的名字:
select emp.ename, emp.sal, dname from emp, dept where emp.deptno = dept.deptno ; https://i-blog.csdnimg.cn/direct/1c880900ee2042f5bb48d4fb1c948063.png        我们查询的时间, 显示的数据如果在复合的表中只有一列, 那么就可以直接写他的列名。 否则就需要指定是哪张表中的某一列, 比如:emp.ename。(注, 这里都是一列, 不需要加emp.,也可以加上)

显示部门号为10号的部门名, 员工名和工资:
select ename, sal, dname from emp, dept where emp.deptno = dept.deptno and emp.deptno = 10; https://i-blog.csdnimg.cn/direct/1f04f6bdaa1e4781831ea5276cdde815.png 
显示各个员工的姓名、工资, 以及工资级别:
select ename, sal, grade from emp, salgrade where sal between losal and hisal; https://i-blog.csdnimg.cn/direct/ad335af1819c4d63adc4f19be181eee6.png 
自毗连

        自毗连是指在同一张表毗连查询
我们直接看样例:
        显示员工FORD的上级向导的编号和姓名(mar是员工向导的编号 --empno):
        我们先使用子查询:
select empno, ename from emp where emp.empno = (select mgr from emp where ename = 'FORD');
https://i-blog.csdnimg.cn/direct/e805c255c5c042f9bcc2471a7ca5c061.png select mgr from emp where ename = 'FORD'是查出emp里面的叫做FORD的人的向导编号。然后查询emp里面的编号是mgr的人的姓名和编号。 
        如今使用多表查询, 即自链接:
select leader.empno, leader.ename from emp leader, emp worker where leader.empno = worker.mgr and worker.ename = 'FORD'; https://i-blog.csdnimg.cn/direct/163f11b512384986ad51138d5a7570d5.png
 这里就是先使用from自毗连。 将两个emp 重定名 leader和worker。 此中leader的员工编号为worker的向导编号。 而且worker的名字叫做FORD。 
子查询

单行子查询

        显示SMITH同一部门的员工:
select * from emp where deptno = (select deptno from emp where ename = 'smith'); https://i-blog.csdnimg.cn/direct/f106ea25ed3f4d8080b54977ca8738e9.png 
多行子查询

使用in关键字,查询和10号部门的工作岗位雷同的雇员的名字, 岗位, 工资, 部门号,但是不包含10号本身的。
select ename, job, sal, deptno from emp where job in (select distinct job from emp where deptno = 10) and deptno <> 10; https://i-blog.csdnimg.cn/direct/9ae9737c64b84a61bf381d7e740e9fdc.png
        此中in后面的括号里面的就是子查询, <>是不即是的意思。

使用all关键字;显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号:
select ename, sal, deptno from emp where sal > all(select sal from emp where deptno = 30);
https://i-blog.csdnimg.cn/direct/576070d0f80849c0b94e8ab9a371b2f6.png        子查询就是使用all函数, 里面的就是子查询。 
使用any关键字, 显示工资比部门30的任意员工的工资高的员工的姓名、工资和部门号:
select ename, sal, deptno from emp where sal > any(select sal from emp where deptno = 30); https://i-blog.csdnimg.cn/direct/ac12cedd714e48468c95e42c0a825360.png 
多列子查询

        单行子查询是指子查询只返回单列, 单行数据; 多行子查询是指返回单列多行数据, 都是针对单列而言的。 而多列子查询是指查询返回多个列数据的子查询语句。
下面为示例:
查询和SMITH的部门和岗位完全雷同的所有雇员, 不含SMITH本人:
select ename from emp where (deptno, job) = (select deptno, job from emp where ename = 'SMITH') and ename <> 'SMITH'; https://i-blog.csdnimg.cn/direct/214357da9457448b9e121389d03b3f0f.png
子查询里面就是查找部门和岗位。 
在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.deptno = tmp.dt;
https://i-blog.csdnimg.cn/direct/adbbc58a65f24faba26d65bde8b37d22.png
        查找每个部门工资最高的人的姓名、工资、部门、最高工资:
select emp.ename, emp.sal, emp.deptno, ms from emp, (select max(sal) ms, deptno from emp group by deptno) tmp where emp.deptno = tmp.deptno and emp.sal = tmp.ms; https://i-blog.csdnimg.cn/direct/93aa4f19ef4541aeaca6a5f3b9bfddb9.png
合并查询

union

该操作符用于取得两个结果集的并集。 当使用该操作符时, 会自动去掉结果会集的重复行。
        下面为案例:
        将工资大于2500或职位时MANAGER的人找出来:
select ename, sal, job from emp where sal > 2500 union select ename, sal, job from emp where job = 'MANAGER'; https://i-blog.csdnimg.cn/direct/4ff912d784d64dc08c39e0b13a3ddd25.png
Union all

        该操作符用于取得两个结果集的并集。 当使用该操作符时, 不会去掉结果会集的重复行。
案例:将工资大于2500或者职位是MANAGER的人找出来:
select ename, sal, job from emp where sal > 2500 union all select ename, sal, job from emp where job= 'MANAGE'; https://i-blog.csdnimg.cn/direct/83e6ef5a44fc40488ca824f35c18e518.png
https://i-blog.csdnimg.cn/direct/3368a46f506a4ab990088b7a9b731951.png
  ——————以上就是本节全部内容哦, 如果对友友们有资助的话可以关注博主, 方便学习更多知识哦!!!    

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【MySQL】开发技术深度探索:mysql数据库复合查询全面详解