《SQL CookBook》 简单查询汇总

本文深入探讨了SQL查询技巧,包括结果排序、多表操作、子查询应用等实用案例,帮助读者掌握高效的数据检索方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    下载了《SQL CookBook》,认真专研一下,基础是很重要的,是时候拾回那些悄悄溜走的知识了。

1.       查询结果排序

 

1.1    显示部门10中的员工名字、职位和工资,并按照工资的升序排列。

select ename,job,sal from emp order by sal asc;

 

1.2    EMP表中,首先按照DEPTNO的升序排序,然后按照工资的降序排列。

select empno,deptno,sal,ename,job from emp order by deptno asc,sal desc

 

1.3 EMP表中返回员工名字和职位,并且按照职位字段的最后两个字符排序。

select ename,job from emp order by substr(job,length(job)-2);

 

1.3    EMP中根据COMM排序结果,处理控制排在最后。

select ename,sal,comm from ( select ename,sal,comm ,case when comm is null  then 1 else 0 end as is_null from emp) x order by is_null,comm;

 

1.4    如果JOB 是“SALESMAN,要根据COMM来排序。否则,根据SAL排序。

select ename,sal,job,comm

    -> from emp

    -> order by

    -> case when job='SALESMAN' then comm

-> else sal end;

 

2.      操作多个表

 

2.1    要显示EMP表部门10中员工的名字和部门编号,以及DEPT表中每个部门的名字和部门编号。

mysql> select ename as ename_and_dname,deptno from emp where deptno=10

    -> union all

    -> select line,null from t1

    -> union all

-> select dname,deptno from dept;

 

2.2    显示部门10 中所有员工的名字,以及每个员工所在部门的工作地点。

select ename,loc rom emp e,dept d where e.deptno = d.deptno and e.deptno = 10;

 

select ename,loc from emp e join dept d on(e.deptno=d.deptno) where e.deptno = 10; (等值内联)

2.3    从表DEPT中查找在表EMP中不存在数据的所有部门。

mysql> select deptno

    -> from dept d

    -> where not exists

-> (select null from emp e where d.deptno=e.deptno);

 

子查询关注的不是返回结果,而是两个表之间的关系,所以是查询null

1.       有对应关系,则有返回,not exists false,对于最外层查询则无结果;

2.       没对应关系,则无返回,not exists true,对于最外层查询则保留不存在的结果。

 

2.4查找没有职员的部门;

mysql> select d.*

    -> from dept d left join emp e

    -> on(d.deptno = e.deptno)

-> where e.deptno is null;

 

返回一个表中的所有行,以及另一个表中与公共列匹配或者不匹配的行,然后保存不匹配的行。

 

2.5    返回所有员工信息、他们的工作部门地点及所获得的奖励。

Mysql> select ename,loc,received

->from emp e join dept d on(e.deptno = d.deptno)

->left join emp_bonus eb on(e.empno = eb.empno);

 

标量子查询(不会危及到当前结果而获取额外数据的一种简单方法;要求标量子查询返回的是标量值)

mysql> select e.ename,d.loc,

    -> (select received from emp_bonus eb where eb.empno = e.empno)

    -> from emp e,dept d

    -> where e.deptno = d.deptno

-> order by 2;

 

2.6    查找在部门10中所有员工的工资合计和奖金合计。(并不是所有人都有奖金)

 

考虑是否有重复工资的计算,因为奖金表可能有一名员工有两个奖金纪录;

考虑部门里是否有没有奖金的员工,也要算入部门的总工资。

mysql> select deptno,sum(distinct sal) as total_sal,sum(bonus) as total_bonus

    -> from (

    -> select e.deptno,e.sal,e.sal*case

    -> when eb.type is null then 0

    -> when eb.type = 1 then .1

    -> when eb.type = 2 then .2

    -> else .3

    -> end as bonus

    -> from emp e left join emp_bonus eb

    -> on(e.empno = eb.empno)

-> where e.deptno = 10) x;

 

2.7    需要在表EMP中查找出所有比”WARD” 提成(COMM)低的员工,提成为NULL的员工也应包括在其中;

coalesce()函数 [keules]

mysql> select ename,comm, coalesce(comm,0)

    -> from emp

    -> where coalesce(comm,0) < (select comm from emp where ename = 'WARD');

转载于:https://my.oschina.net/kingchung/blog/35382

SQL 是计算机世界的语言,在用关系数据库开发报表时,将数据放入数据库以及从数据库中取出来,都需要SQL 的知识。很多人以一种马马虎虎的态度在使用SQL,根本没有意识到自己掌握着多么强大的武器。本书的目的是打开读者的视野,看看SQL 究竟能干什么,以改变这种状况。, 本书是一本指南,其中包含了一系列SQL 的常用问题以及它们的解决方案,希望能对读者的日常工作有所帮助。本书将相关主题的小节归成章,如果读者遇到不能解决的SQL 新问题,可以先找到最可能适用的章,浏览其中各小节的标题,希望读者能从中找到解决方案,至少可以找到点灵感。, 在这本书中有150 多个小节,这还仅仅是SQL 所能做的事情的一鳞半爪。解决日常编程问题的解决方案的数量仅取决于需要解决的问题的数量,本书没有覆盖所有问题,事实上也不可能覆盖;然而从中可以找到许多共同的问题及其解决方案,这些解决方案中用到许多技巧,读者学到这些技巧就可以将它们扩展并应用到本书不可能覆盖的其他新问题上。, 毫无疑问,本书的目标是让读者看到,SQL 能够做多少一般认为是SQL 问题范围之外的事情。在过去的10 年间,SQL 走过了很长的路,许多过去只能用C 和JAVA等过程化语言解决的典型问题现在都可以直接用SQL 解决了,但是很多开发人员并没有意识到这一事实。本书就是要帮助大家认识到这一点。, 现在,在对我刚才的话产生误解之前我先要申明:我是“如果没坏,就别去修它”这一教义的忠实信徒。例如,假如你有一个特定的业务问题要解决,目前只用SQL检索数据,而其他复杂的业务逻辑由其他语言完成,如果代码没有问题,而且性能也过得去,那么,谢天谢地。我绝对无意建议你扔掉以前的代码重新寻求完全SQL 的解决方案;我只是请你敞开思想,认识到1995 年编程用的SQL 跟2005 年用的不是一回事,今天的SQL 能做的事要多得多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值