oracle数据库从入门到精通 - 阳光

发布时间:2017-3-28 4:30:31 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"oracle数据库从入门到精通 - 阳光",主要涉及到oracle数据库从入门到精通 - 阳光方面的内容,对于oracle数据库从入门到精通 - 阳光感兴趣的同学可以参考一下。

oracle数据库从入门到精通

oracle产品线围绕企业开发平台的
企业开发平台四大组件:unix,weblogic中间件,java编程语言,oracle数据库

oracle 开发主要分两类
数据库管理:dba
数据库编程:分两部分
    sql编程
    pl/sql编程(子程序,触发器,面向对象,游标)

下载    官方网站下载相应的版本到本地,并解压缩。
环境    在启动安装之前的环境配置。
安装


只要是行与列的集合就是数据表

SQL> ed hello
SQL> @hello

数据库开发都以dml操作为主
数据库设计时以ddl操作为主

数据类型 number(7,2)  小数位是两位,总共是7位,整数是5位

简单查询的最大特征在于可以控制列,它无法进行数据行的控制。

select [distinct] *| 列名 [别名],列名 [别名],... from 表名 [别名];

distinct是去掉重复的行。指所查询出来的所有列内容都一样的去重。

执行顺序是先from再select

子句有两个 一个是select ...,一个是from ...。或者还会有where ...,order by ...。

进行数据的投影-----控制所需要显示的数据列。

支持四则运算,再加上别名就美观了。

select aa,bb,cc*2 from emp;

select aa,bb,cc*2 nian from emp;

select trans_new_price-2 sum from tis_ft_adjust_price where rownum <=5;

select trans_new_price*2 sum from tis_ft_adjust_price where rownum <=5;

拼接列的值。列名1 || 列名2

select adjust_time || operator_id ww from tis_ft_adjust_price where rownum <=5;

格式化输出,字符串用单引号引起来,数字直接写,不用引用。

select 'tj:'||adjust_reason||',ti:'||ADJUST_TIME ww from tis_ft_adjust_price where rownum <=5;

限定查询,控制数据行

1.sql语句的执行顺序

第三步:选出所需要的数据列  select *

第一步:确定数据来源  from table

第二步:筛选数据行  where 条件

第四步:数据排序  order by

2.限定符号的使用,以下是标准sql支持的。

若干个条件判断符,

>,<,=,>=,<=,!=(<>).

is not null,is null

like,not like  _匹配任意一位字符,%匹配多位。

in,not in  not in中不能有null,in可以有。where 字段  in(8899,2234,7554,null);  不连续的行

betwwen...and  where 字段|数值 betwwen  最小值 and 最大值;  连续的行

以上只能使用一次,如果有多个条件,则用逻辑运算符:

and,or,not(非)

书写标准,先查列,再将select from where 分别写三行,再写各种限定,表限定,行限定,列限定。这是按照执行顺序写的。

desc tis_bk_user;
select user_id
from tis_bk_user
where rownum <=5;

select *
from tis_ft_g_owner_clear
where trans_freight between 10000 and 11000;

betwwen...and...是一个运算符,也可以用关系运算符与逻辑运算符组合来使用,但效率低。where trans_freight>10000 and trans_freight<11000。

oracle所有的运算符不受数据类型的控制,以上是对数字的判断,字符串意义不大,重点是对日期时间的判断。

select clear_time
from tis_ft_g_owner_clear
where clear_time between '2015-07-28 11:13:57' and '2015-07-29 11:47:07';

select *
from tis_bk_role
where not role_id<to_number('001056');

空判断

select null + 1 from emp;  这个表有几行,就返回几行空行

null不能使用关系运算,关系可以判断的是数据,null属于一个未知的数据。

select *
from tis_bk_role
where role_id  in (001050,001025,001034);

select * from emp where enam like '%%';

select * from emp;

这两条是一样的结果,下面虽然效率高,但上面在程序开发中方便后续扩充

order by 字段1 asc|desc,字段2 asc|desc...

默认是按照自然顺序排列的,也就是输入数据时的顺序。也可以进行多字段的排序。如果某一个字段重复的话。

所有的排序操作都是在where之后执行的,order by 永远最后执行。

单行函数

字符串函数  replace(),substr(),length(),

select user_accout,initcap(USER_ACCOUT)from tis_bk_user;select user_accout,length(USER_ACCOUT)from tis_bk_user;

select *
from tis_bk_user
where length(user_accout)=5;

replace(列名|数据,‘原内容’,'替换的内容')
利用replace()可以取消字符串中的空格
create table t2 as select * from tis_bk_user_info;
select replace(user_name,'木','森')
from t2
where user_name like '%神木%';

下标从1开始的
substr(列名|数据,开始点)  指定位置到结尾
substr(列名|数据,开始点,长度)  截取范围
select substr('helloworld',3) from dual;
select substr('helloworld',3,5) from dual;
截取后三个
select substr('helloworld',length('helloworld')-2) from dual;
select substr('helloworld',-3)

数值函数

mod(),round(),trunc()round()    四舍五入-2小数点前两位,2小数点后两位select  round(998.8876568),  round(9999.77777655,2),  round(9999.77777655,-2),  round(-15.132)from dual;trunc()    不四舍五入进行处理mod()    求模(求余数)

日期函数

日期函数(oracle自己特色)如何可以取得当前的日期,用伪列sysdata伪列sysdate,systimestamp,虚拟表dualselect sysdate,systimestamp from dual;日期计算模式日期+1    后一天日期-1    前一天日期-日期    没有日期+日期select sysdate,sysdate-2,sysdate+3 from dual;如果只是依靠天娄无法获得一个准确的年或月,所以oracle里面才提供了日期处理函数,利用这些函数可以避免闰年与闰月的问题

计算下一个周二的日期
SQL> select next_day(sysdate,'TUE') from dual;

trunc(months_betwwen(sysdate,hiredate)/12) year
trunc(mod(months_between(sysdate,hiredate)/12)) month

转换函数

利用to_char进行年,月,日的拆分,只是提供一个思路,oracle本身的一个自动转换。
to_char
下面两个几乎等于无用to_dateto_numberto_char(列|日期|数字,格式)
select to_char(sysdate,'yyyy:mm:dd') to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')from dual;select to_char(98468472392823,'L999,999,999,999,999,999') from dual;

通用函数

nvl()decode()

多表查询(进入了复杂查询的阶段)

笛卡尔积一直存在,无法消除,虽然能消除显示问题。数据量一大,多表查询会带来严重的问题。

多表查询之中的多张表一定要有关联关系,否则不能查询

判断程序慢的两种方法:程序算法慢(cpu 占用率高),数据库数据大(内存占用高)

由数据量决定,用不用多表查询,如果数据量几百行,随便用,几十万行,就得选用其它技术点了。

select count(*) from costs a,prod bwhere a.prod_id=b.prod.id;

有明确的关联字段的案例如下:

确定要使用的数据表  emp,dept

确定已知的关联字段  prod_id

select a.pname,a.sal,b.loc,b.job

from emp a,dept b

where a.prod_id=b.prod_id;

没有明确的关联字段,而是关联条件

select e.name,e.sal,s.grade

from emp e,salgrade s

where e.sal between s.lowsal and s.higsal;

分析过程如下:(关联字段或关联条件)

第一:写出第一张表的查询

第二:引入第二张表,加表,加字段,加条件,消除笛卡尔积的显示

第三:引入第三张表,加表,加字段,加条件,用and连接。

表的连接

对于两张表进行多表查询对于消除笛卡尔积主要依靠连接模式来处理的,表的连接模式有两种:

内连接:在之前都利用where子句来消除笛卡尔积,只有满足条件的数据才会显示出来

外连接:不用管是左还是右,只要所需要的数据全部显示就可以了。分左连接,右连接,全连接

where d.deptno=s.deptno(+)

where d.deptno(+)=s.deptno

(+)是oracle特有的

数据集合操作  并集,交集,差集,补集

是将若干个查询结果合并在一起,若干个数据查询结果所返回的数据结构必须一致。

union  取消重复行

union all

intersect  交集

minus  差集

统计函数(也叫分组函数)

count(),sum(),avg(),:支持数字

max(),min():支持数字,字符串,日期数据类型

在没有数据的时候,只有count返回结果,其它是null

count()有三种形式:

count(*):统计所有的数据行

count(字段):统计所有不为空的数据行数

count(distinct 字段)统计所有不重复的数据行

分组统计

group by  找重复的列

第四步:选出所需要的数据列  select *|分组列

第一步:确定数据来源  from table

第二步:筛选数据行  where 条件

第三步:针对筛选的数据行进行分组  group by 分组字段

第五步:数据排序  order by

多表查询与分组统计

having子句,此时就不能用where子句了,having 跟随group by 而出现。

针对分组后的数据进行筛选,是在group by

select job,avg(sal)

from emp

group by job

having avg(sal)>2000;

where 与having的区别

1:where 是在group by 之前执行的,先选出可以参与分组的数据,不能使用统计函数。

2:having是在group by 之后执行的,可以使用统计函数。

子查询

子查询并没有特殊的语法,可以出现在任意子句之中(select ,from,where,group by,having,order by),但必须用()声明

子查询就是查询的嵌套。

################################################
DML包括查询与更新。
数据的更新包括:增加,修改,删除
更新离不开查询
数据的增加
数据的修改
数据的删除

先复制一份原始数据
create table myemp as select * from emp;

数据的增加
insert into myemp() values();
常用的三种类型
    字符串:‘字符串’
    数值:直接编写
    日期:有三种
        sysdate
        根据日期的保存结构编写字符串:‘天-年-月’
        利用to_date()将字符串转换为date型数据
完整语法
值与字段对应即可。
insert into myemp(empno,job,sal,hiredate,ename,deptno,mgr,comm)
values(6666,'清洁工',2000,to_date('1988-09-08','yyyy-mm-dd'),'王二',40,7396,null);
执行上面的语句报下面的错
ORA-01756: quoted string not properly terminated
将清洁工与王二换成英文即可。或者撤销NLS_LANG环境变量,再insert就可以了,因为我的系统上有这个变量
但是行插进去了,却乱码了(变成???)
[[email protected] Downloads]$ echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
[[email protected] Downloads]$ echo $LANG
en_US.UTF-8
乱码问题先不处理了,所以先选用英文。
insert into myemp(empno,job,sal,hiredate,ename,deptno,mgr,comm)
values(6668,'aa',2000,to_date('1988-09-08','yyyy-mm-dd'),'aa1',40,7396,null);
insert into myemp(empno,job,sal,hiredate,ename,deptno,mgr,comm)
values(6669,'aa',2000,to_date('1986-09-08','yyyy-mm-dd'),'aa2',40,7397,null);

省略字段语法
必须注意要与表中的字段顺序一致。

在开发时尽量使用完整语法,一条数据一行

##############

update 表名 set 字段=内容,字段=内容,...[where 更新条件(s)]
普通的
update myemp set sal=2500,comm=40 where ename='aa2';
带子查询的
update myemp set sal=(select avg(sal) from myemp)
where sal=(select min(sal) from myemp);

update myemp set hiredate=sysdate,sal=sal*1.2
where hiredate between '01-jan-81' and '31-dec-81';
where to_char(hiredate,'yyyy')=1981;
不带条件的,是修改所有的记录
update myemp set comm=null;

上一篇:Hadoop HDFS编程 API入门系列之合并小文件到HDFS(三)
下一篇:mysql 文件导入方法总结

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款