码迷,mamicode.com
首页 > 数据库 > 详细

蓝的成长记——追逐DBA(12):七天七收获的SQL

时间:2015-02-26 09:56:11      阅读:370      评论:0      收藏:0      [点我收藏+]

标签:dba   成长记   

原创作品,出自 “深蓝的blog” 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任。

深蓝的blog:

【简介】

        个人在oracle路上的成长记录,其中以蓝自喻,分享成长中的情感、眼界与技术的变化与成长。敏感信息均以英文形式代替,不会泄露任何企业机密,纯为技术分享。

        创作灵感源于对自己的自省和记录。若能对刚刚起步的库友起到些许的帮助或共鸣,欣慰不已。

        欢迎拍砖,如有关技术细节表述有错误之处,请您留言或邮件(hyldba@163.com)指明,不胜感激。

【前言】

       这是一部个人记录的成长杂记,既然步入到oracle的这片蓝海,免不了一路的奔波与不断的考验。借由此杂记与库友们分享蓝的成长历程。

       不知何时起对蓝有了一种说不出来的痴迷,痴迷其广博,痴迷其深邃,痴迷于近在咫尺却又遥不可及。

       而又说不清从何时起,注视于oracle的红色耀眼,照亮出眼前的一道光,未知与迷惑在自己的脚下开始初露些许人生的充实与青春的回馈。

       在追逐于DBA梦想的道路上步步前行。

 

 

计划跟不上变化,技能用时方恨少。

                                                                    ——深蓝

 

        蓝,一只脚刚刚踏入到oracle行业中来,之前有些疲态的脑子想要歇一歇,知识有些乱了、杂了,正想要借着假期梳理下思路的时候,意料之外的任务,突然让蓝意识到,又需要重新出发,来不及喘息,想要歇一歇的念头抛到了脑后,用着不多的脑细胞去继续探索这片另蓝生畏的领域——SQL

        原来太多事情不会出现在意料之内,因为我们预测不了未来,我们能做的就只有时刻准备着迎接这些不曾预料的考验降临,然后战胜之。

                                                                                                                                                                                                   记于201410月深蓝

 

         春节已致,伴随着前半程技术的累积,在祥和的氛围下,对于SQL,可以来个喜庆的回顾了。

                                                                                                                                                                                                   记于20152月深蓝

第一天:除夕岁尾,让select决定未来走向

         回首2014年马上就要过去了,昨天已然无法改变,但明天,如何选择由我们自己来决定。如何更高效的选择我们的未来形态,精神追求也好,物质丰富也罢,全看我们有怎样的思维方式。把这个愚见,转移到SQL上,是否感觉到有着微妙的联系。

如何写查询,全看基本功和经验值,举几个小例子:

(简单查询1

         查询出用户下,表注释、表中字段注释

SQL>SELECT a.table_name,b.COMMENTS comments,a.column_name,a.comments comments FROM user_col_comments a,user_tab_comments b where a.table_name=b.table_name order by table_name;

技术分享

(简单查询2

         查询出某用户下,你所想要的信息,如:表名、表注释、字段名、字段注释、数据类型、定义的数据的长度,如下图所示:

技术分享

第二天:大年初一,DML大行其道

大年初一,拜年大吉哈!各位,新年好!

送去祝福,让我们快乐的insert一份温暖的情谊;

告别过往,让我们洒脱的delete一件后悔的往事;

正视现在,让我们坦然的update一颗蜕变的决心;

这便是,我们大年初一的主题:个体行为的DML语句。

 

insert

insert into 表名 [(列名 [,列名...])] values (数值 [,数值...]);

delete

delete [from] 表名 [where 条件]

update

update 表名 set列名=值 [,列名=值,...] [where 条件]<span style="font-family:Calibri;font-size:14px;"></span>
insert:A表数据抽取到B表

SQL>insert into select B表(”B表列1”,”B表列2”,”B表列3”) select  “t.A表列1” as “B表列1”,”t.A表列2” as “B表列2”,”t.A表列3” as “B表列3” from A表 t;

 

insert:向一个表里插入一列数据

把一张表的列插入到新的表里的某个列上

SQL> insert into test1(no) select t1.empno as no from scott.emp t1;


查看某“字段长度”超过某“指定列宽”的数据行数

查看字段超出某长度的数据行?

查看某列字段超出规定长度的数据行数?

SQL> select count(1) from &表名t
where length(t.&列名)>&num
--&为选择项
例:查看cool表中”2”列字段超出5的数据行数
SQL> select count(1) from cool t where length(t."2")>5;
--筛选超出列宽字段

 

update:通过连接条件,将字段内容改为另一字段内容

把一个A表的某列更改为另一个B表的列值,使用某一列进行关联。

SQL> update A表 t set(列)=(select 列 from B表 p where t.列=p.列); 

例:SQL> update emp t set (job)=(select "3" from hyl.cool p where t.empno=p."1");

例:SQL> update  TB_ASJ_JBXX t1 set SSZJZ =(select losstotl from bjcicbb.T_INFO_CRMNLCS t2 where t1.bjkz_id=t2.id); 

第三天:大年初二,DDL送来的祝福

又谈增删改,不过这个增删改,已经不同于上面说的那个“个体行为”的改动,而变成了“局部行为”的变动。安详、温暖的家,我们除旧迎新,未来更加美好的期盼。

create:未来的家庭梦想;

drop:曾经的那些疲惫;

alter:让我们的生活变得越来越好。

 

添加列

添加列:表中添加新列

SQL> alter table 表名 add (列名数据类型 [,列名数据类型] ...);
 

删除列

删除列:表中删除一个列

SQL> alter table 表名 drop column 列名;
 

修改字段数据类型

修改表中存在的列的数据类型

SQL> alter table 表名 modify (列名数据类型 [,列名数据类型] ...);
 

删除大表里列的方法

把表的列设置成无用(UNUSED)

SQL> alter table 表名 set unused(列名);

或

SQL> alter table 表名 set unused column 列名;

SQL> drop table 表名 drop unused columns;
 

重命名列

列的重命名:修改ORACLE中表的列名

方法一:

alter table [table_name] rename column [column_name] to [new_column_name];

例:SQL> ALTER TABLE tb_ry_ryxx RENAME COLUMN szzwbh_bk  TO  szzwbh;


方法二:

可以使用 { create 临时表 as select * from 原表 },再重建表(指定新的字段),并{ insert into 新表 select 列1,列2 …… from 临时表 }。 <span style="font-family:Calibri;font-size:14px;"> </span>

第四天:初三,初三,SQL函数知多少

喜庆的氛围下,快乐的事情真是太多了,一时间没法梳理个完完全全。但快乐的记忆永远都会是我们津津乐道的谈资。看看SQL的函数,那些曾经帮助你实现了多少个难题的SQL函数,把它们忘记了没有?

由于函数太多了,这里把常用的函数简单归纳了一下,具体语法百度或官方文档就能轻松查看到了。

向左补全字符串—lpad()
向右补全字符串—rpad()
返回字符串小写格式—lower()
返回字符串大写格式—upper()
单词首字符大写—initcap()
返回字符串长度—length()
截取字符串—substr()
获取字符串出现的位置—instr()
删除字符串左侧空格—ltrim()
删除字符串右侧空格—rtrim()
删除字符串两侧空格—trim()
串联字符串—concat()
翻译字符串—translate()
反转字符串—reverse()
生成32位散列值—sys_guid()
取模操作—mod()
返回数字的的“四舍五入”值—round()
向上取整—ceil()
向下取整—floor()
返回数字的绝对值—abs()
截取数字、日期—trunc()
格式化数值、将日期转换为字符串—to_char()
返回当前会话时区的当前日期—current_date()
返回当前会话时区的时间戳—current_timestamp()
求最大值—max()
求最小值—min()
求平均值—avg()
求和—sum()
统计记录数—count()
多值判断—decode()
空值处理—nvl() 

第五天:一阵鞭炮震天响,“触发器”和“游标”不停歇

        伴随着雷声阵阵的鞭炮声,带来愉悦和祝福,同时也预示着未来的家庭、事业红红火火。这时候我们不能忘记我们的小伙伴:触发器和游标;

        触发器像不像点燃爆竹引线前的指定,到特定时间时,把我们要燃放的鞭炮一一奏响;

        游标中变量的循环,像不像鞭炮那一声声炸裂后的鸣响,一节节鞭炮的连续奏响,如同是单条记录的精细控制;

 

【触发器】

1、语法:

create trigger 触发器名称 on 作用对象
before/after 触发动作
as
触发器操作

2、举一个实用的例子

ORACLE表中ID字段的自动递增

参考文章:

http://blog.csdn.net/huangyanlong/article/details/43937701

 

【游标】

1、语法:

(步骤1)声明游标:创建一个命名的SQL数据区

语法:delcare cursor 游标名称 is 查询语句;

      ①声明列变量

语法:变量名  数据类型

      ②声明行变量

语法:变量名表名%rowtype

(步骤2OPEN:打开游标,打开活动数据集

(步骤3FETCH:当前行载入到变量中

(步骤4CLOSE:释放活动数据集

简要流程图如下:

技术分享

2、一个简单的游标举例

--使用scott用户进行试验

--查询dept表中的数据

SQL> select * from dept;

DEPTNO DNAME         LOC           UPDATEDATE

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

   50 test           har           2014/12/30

   60 test2          har           2014/12/30

   70 test1          beijing       2013/12/1

   80 test2          harbin        2013/12/27

   90 dba1           harbin        2014/12/30

   91 dba2           harvin        2014/12/30

   92 dba3           sh            2014/12/30

   93 dba4           beijing       2014/12/30

   99 dddd           har           2014/12/30

   10 ACCOUNTING     NEW YORK      2014/12/30

   20 RESEARCH       DALLAS        2014/12/30

   30 SALES          CHICAGO       2014/12/30

   40 OPERATIONS     BOSTON        2014/12/30

13 rows selected

--编写一个游标,输出dept表中的部门号、部门名、地点的拼接信息

SQL> declare   --定义一个声明

  2   cursor cu_dept is select * from dept;

  3   v_cu   cu_dept%rowtype;  

--定义一个变量,rowtype指和是和这个cursor的每一行的数据类型相同

--在这个例子中,这是声明的行变量,代表v_cu是针对dept表的每一行声明的变量

--进一步解释:v_cu是声明的变量;

--进一步解释:cu_dept%rowtype指定该变量的数据类型为表dept的行类型

  4  begin

  5   open cu_dept;                 --把游标打开的流程

  6   loop                         --写一个loop循环

  7     fetch cu_dept into v_cu;       --fetch流程,把变量取出来放到游标定义的变量里

  8     exit when cu_dept%notfound; --退出游标的条件:当游标没有找到时候退出

  9     dbms_output.put_line(v_cu.deptno||‘ ‘||v_cu.dname||‘ ‘||v_cu.loc);

--当游标找到的时候把结果打印出来

 10   end loop;

 11   close cu_dept;    

--把游标关闭的流程

--游标是会占用内存的,只有当完成close操作后,计算机才会把游标占用的这块内存释放

 12  end;

 13  /

 

补充:

SQL> set serveroutput on     
--要把存储过程打印出结果集,需要设置serveroutput这个变量

补充完毕

 

演示如下:

SQL> declare
  2       cursor cu_dept is select * from dept;
  3       v_cu   cu_dept%rowtype;
  4      begin
  5       open cu_dept;
  6       loop
  7         fetch cu_dept into v_cu;
  8         exit when cu_dept%notfound;
  9         dbms_output.put_line(v_cu.deptno||' '||v_cu.dname||' '||v_cu.loc);
 10       end loop;
 11       close cu_dept;
 12      end;
 13  /

输出结果如下:

50 test har

60 test2 har

70 test1 beijing

80 test2 harbin

90 dba1 harbin

91 dba2 harvin

92 dba3 sh

93 dba4 beijing

99 dddd har

10 ACCOUNTING NEW YORK

20 RESEARCH DALLAS

30 SALES CHICAGO

40 OPERATIONS BOSTON

PL/SQL procedure successfully completed

第六天:假期渐去,存储过程浅探

        第六天里,经过了几天的访友会客,这个时候不妨回到家中,休憩一下身心,感受一下家里的温馨与惬意。

        当然,还有那些奔波于异地的上班族,这一天可能是要返程或者已经在返程的路上了,在经过快乐的春节假期后,希望可以带上一份快乐的心情,踏上前行的路。

        伴着这种轻松和谐的气氛,对存储过程来一次简单的举例,如下:

 

例:编写一个简单的删除员工信息的存储过程

参考文章:

http://blog.csdn.net/huangyanlong/article/details/43938953

 

第七天:回望过往,15年正式开启,建库,走起

        快乐祥和的春节假期匆匆而过,想必我们都还乐在其中,一时间不想回去工作。但这就是生活啊,经过了新年快乐的精神沉淀,想必,可以放下包袱为未来来个清晰的展望和把握了。

        满怀着沉甸甸的基础,建库,我们走起。。。

 

(篇章一回望):

 

建库中的小沮丧,遇到“混乱”的数据库设计规范

        曾几何时的建库项目初期,需要从其它系统数据库中抽取数据到我方的数据库中,但由于源端、目标端两者的表结构完全不相同,这就牵扯出一个“核对”的工作。就此,一件令人沮丧的设计规范,让核对过程叫苦连连。

        首先,这发生在表名、字段的命名上,表名或字段规则大致看来为全拼缩写,但细细看来就会发现,很多混乱的命名规则,有的字段丢失简拼,有的甚至就换了简拼的缩写方式,更有甚,发现许多字段命名完全没有规律,恐怕只有设计者可以看得懂,真不知道这是设计者的水平体现,还是担心有人看懂表结构的有意为之,真实不敢妄加揣测了。(但能肯定一点,当初他的小弟干起活来肯定要骂爹喊娘了,哈~~~。总之我们接手后,真实没少马爹喊娘,技术人员也需要发泄一下嘛,就不知这位现在身在何方的兄弟鼻子受得了不。)特别可恶的在于,大量表、大量表中的字段没有注释,我勒个去,这是个大坑啊。—_—于是,不得已,在大量字段无法对应的情况下,采用了向目标端添加字段的方式(主要在于数据不丢失,可以根据数据内容,后续进行调整)。

 

数据抽取的多种方法

        对于新库中数据的获取,往往会通过很多其它的库把数据抽取过来。开发人员对于成熟的一个系统来说,往往会编写接口程序,通过前台界面点击完成调用后台SQL语句实现数据抽取的目的。而在项目初期,对于DBA来说,完成后台抽取也是常遇到的工作任务。我们这里的方式有很多,可以编写SQL、存储过程来完成,亦可以制定JOB来完成定时抽取任务,实现数据的增量同步。而我们这次主要采用的是ETL工具,使用kettle完成了部分业务数据的抽取。对于ETL工具感兴趣的话,可以自行百度,我推荐使用kettle这款开源的ETL工具,它的功能性很强大,我们也正在使用中不断的摸索。

入门了解kettle,可以参考我的另一篇文章:

kettle_抽取数据举例:http://blog.csdn.net/huangyanlong/article/details/42264543

 

(篇章二走起):建库计划----思路简析:

 

1、库类型

OLTP:在线事务处理系统;

OLAP:在线应用处理系统;

选择库类型为:     OLTP

2、数据库名、字符集

SIDhyl

字符集:ZHS16GBK

3、存储空间

划分相应的存储空间

4、数据库结构

表空间规划:创建相应默认表空间、创建业务所需表空间

RAID方案:多级别RAID

1)、数据文件、控制文件、日志文件,使用RAID 1+0、另热备盘一块

2)、备份文件、归档文件,使用RAID5,另热备盘一块

5、采购预算等

服务器、交换机、存储等

 

 

 

 

系列链接:

蓝的成长记——追逐DBA(1):奔波于路上,挺进山东 

蓝的成长记——追逐DBA(2):安装!安装!久违的记忆,引起我对DBA的重新认知

蓝的成长记——追逐DBA(3):古董上操作,数据导入导出成了问题 

蓝的成长记——追逐DBA(4):追忆少年情愁,再探oracle安装(Linux下10g、11g) 

蓝的成长记——追逐DBA(5):不谈技术谈业务,恼人的应用系统

蓝的成长记——追逐DBA(6): 做事与做人:小技术,大为人

蓝的成长记——追逐DBA(7):基础命令,地基之石 

蓝的成长记——追逐DBA(8):重拾SP报告,回忆oracle的STATSPACK实验

蓝的成长记— —追逐DBA(9):国庆渐去,追逐DBA,新规划,新启程

蓝的成长记——追逐DBA(10):飞刀防身,熟络而非专长:摆弄中间件Websphere 

蓝的成长记——追逐DBA(11):回家后的安逸,晕晕乎乎醒了过来

 

蓝的成长记——追逐DBA(12):七天七收获的SQL

标签:dba   成长记   

原文地址:http://blog.csdn.net/huangyanlong/article/details/43950227

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!