Sql cookbook学习笔记

本文分享了一系列实用的SQL技巧,包括提取姓名缩写、按特定字段排序、生成累计和及累乘积等操作,并通过具体实例展示了如何巧妙地利用SQL解决实际问题。

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

以下是笔者在看cookbook时做的实验笔记,由于是PDF版,光看还是不行滴!(持续更新)

-------------------------------------------------------

第六章  使用字符串

--6.7 提取姓名的大写首字母缩写

SELECT replace(
         translate( REPLACE('Dylan Xu', ' ','.'),
'abcdefghijklmnoopqrstuvwxyz',
   rpad('#',26,'#')), '#') || '.'    
   FROM dual;


--6.8  按照字符串中部分内容排序
SELECT ename  FROM emp ORDER BY substr(ename, -2, 2);

--6.9 按字符串中数字排序
CREATE OR REPLACE VIEW v_sqlbook1 AS
SELECT e.ename ||'  '||
               CAST(e.empno AS CHAR(4))||'  '||
               d.dname AS DATA
FROM  emp e, dept d
WHERE e.deptno = d.deptno;


SELECT data
 FROM v_sqlbook1
ORDER BY to_number(REPLACE(
                              translate(DATA, REPLACE(
                                                 translate(DATA,
                                                        '0123456789', '##########'),  '#'), rpad('#', 20, '#')), '#'))
 ;

SELECT  to_number(trim(REPLACE( translate('abc 123 bnh', 'abcdefghijklmnopqrstuvwxyz',  '##########'),     '#'))) FROM dual;


--6.10 根据表中一行创建分隔列表
 SELECT deptno,
               ltrim(sys_connect_by_path(ename, ','), ',') emps
   FROM ( select deptno,
                          ename,
                          row_number() over (partition by deptno order by empno) rn,
                         count(*) over(partition by deptno) cnt
                                 from emp            
  )                    

 WHERE LEVEL = cnt
       START WITH rn = 1
       CONNECT BY PRIOR deptno = deptno AND PRIOR rn = rn -1;  

                 
    
--6.11 将分隔数据转换为多值IN列表
--6.15 分析IP地址
SELECT instr('a,bc,def,g', ',', 1,1) FROM dual;
SELECT ip,
              substr(ip, 1, instr(ip, '.') - 1) a,
                            substr(ip, instr(ip, '.') +1, instr(ip, '.', 1, 2) - instr(ip, '.')-1 ) b,
                          substr(ip, instr(ip, '.', 1, 2) +1, instr(ip, '.', 1, 3) - instr(ip, '.', 1, 2)-1 ) c,
                            substr(ip, instr(ip, '.',1,3) + 1) d
      FROM (SELECT '192.168.1.240' AS ip FROM dual);
        



第七章  使用数字

--7.6 生成累计和

SELECT ename, sal,
               SUM(sal) over (ORDER BY sal, empno) AS running_total
    FROM emp
    ORDER BY 2;

--7.7 生成累乘积
--c1 sal大于0情况,使用对数和求得
SELECT empno, ename, sal,
              exp(SUM(ln(sal)) over(ORDER BY sal, empno)) AS running_product
        FROM emp
 WHERE deptno = 10;          

注:指数与对数运算法则:①ln(x)=log(e)X ②ln(x) + ln(y) = ln(x*y), e^ln(x) = x;
     
--c2     sal存在负数与0情况,使用model求得
    
SELECT empno, ename, sal, tmp AS running_product
        FROM (
    SELECT empno, ename, -sal AS sal
        FROM emp
      WHERE deptno  =20
                     )
        MODEL
             DIMENSION BY(row_number() over (ORDER BY sal DESC) rn )        
                 MEASURES(sal, 0 tmp, empno, ename)     
                 RULES (
                          tmp[ANY]    = CASE WHEN sal[cv() - 1] IS NULL THEN sal[cv()]
                                                                     ELSE tmp[cv()-1]*sal[cv()]        
                                                                                END
                         )    


                                                                         

----------------------------------------------

present   by   dylan.


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值