Oracle数据库基础简介及实践

1、开始(p1~p2)
2、SQL语句编写思路(p3)
3、Oracle常用运算符介绍(p4~p5)
4、DML语句介绍(p6~p11)
5、Oracle常用函数介绍(p12~p30)
6、SQL语句函数运用(p31~p34)
7、通过日志获取SQL语句(p35~p49)
8、使用case系统提交问题(p50~p51)
9、学习资源及答疑(p52)
10、结尾(p53)

 

1、SQL语句编写思路
1、首先确定最终输出结果的列,包括几个方面:
1)这些列来自1个表还是多个表,如果是多个表则可能用到多表查询(等值、不等值、左连接、右连接、外连接、自连接)
2)确定获取列的值,是直接查询得到,还是需要进行(函数、分组、运算、列的子查询)操作才能得到,列是否需要别名
2、确定输出列的值和查询条件是否来自多个表,如果来自多个表则要用到多表查询
3、确定输出列的值,是否可以直接查询获得还是要通过子查询才能获得,如果要用到子查询,则需要加上where
4、根据输出列的结果和条件,判断是否要用到分组(group by),比如分类、统计、分组、最大、最小、平均、每个等字眼就需要用到group by
5、是否对分组后的结果进行过滤,需要则要用到having
6、是否对输出的结果进行排序,需要则要用到order by


2、Oracle常用运算符介绍
1、使用||可连接字符
2、使用distinct可以消除重复行
3、运算符:
1) 算术(+ - * / )
2) 比较(> >= < <= = != <> ) any(值1,值2...) all(值1,值2...) 不能单独使用,要配合>,>=,<,<=来使用
3) 逻辑(and or not)

4、SQL操作符:
1) in(值1,值n)
2) like '模式字符串':_代表任意一个字符,%代表0到n个字符
3) between 数值1 and 数值2:不仅可用于数值,还可以用于日期时间
4) is null、is not null:匹配空值,非空值。对于空值一定不能用=或!=
5)union (取并集,重复的记录行只显示1行) 、union all(取并集)、intersect(取交集)、minus(取差集,返回左边表差集后的记录)
5、伪列:
rowid: Oracle内部对每个表的每一行都有一个唯一的标识
rownum: Oracle对每次查询结果集的每一行记录都有一个行号,对rownum只能使用<或=


3、 DML语句介绍
1、查询(select)
select distinct * |列 as 别名|表达式|函数|列运算|子查询
from 表1 别名1,表n 别名n |子查询
where 条件1(> >= < <= <>) 条件2 | 范围(between 条件1 and 条件2)
In(子查询)
like (条件_%)
组合(or|and|not)
子查询(select 语句)
group by列
having 分组函数(max,count,sum等) 运算符 普通值|子查询
order by 列 别名 或 数字


2、新增(insert into)
insert into 表名(列名1,..) values(值1,..)
--新增信息
insert into check
(PRIMARY_ID,
NAME,
DISTRICT,
UPDATED_DATE)
values
(sys_guid(), sysdate);

--只复制表结构加入了一个永远不可能成立的条件1=2,则此时表示的是只复制表结构,但是不复制表内容
create table 用户名.目标表名 as select * from 用户名.源表名 where 1=2;

--完全复制表(包括创建表和复制表中的记录)
create table 用户名.目标表名 as select * from 用户名.源表名;

--将多个表数据插入一个表中
insert into 用户名.目标表名(字段1,字段n) (select 字段1,字段n)
from 用户名.源表名 union all select 字段1,字段n from 表;


3、修改(需加commit;关键字来提交)
update 表名 set 列名=列改变值(where 条件表达式);
update check_store cs set cs.DISTRICT='310113' where cs.NAME='数据包';
commit;

4、删除(需加commit;关键字来提交)
delete from 表名 (where 条件表达式);
delete from check_operate co where where co.NAME='数据包';
commit;


4、Oracle常用函数介绍
1、日期字符函数
1)to_char
--2016-11-03
select to_char(sysdate, 'yyyy-mm-dd') from dual;
2)to_date
select to_date(to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh24:mi:ss') from dual;
3)to_number
to_number(varchar2 or char,'format model')
9:代表一个数字
0:强迫0显示
$:显示美元符号
L:强制显示一个当地的货币符号
.:显示一个小数点
,:显示一个千位分隔符号


--1234.678
select to_number('$1234.678', '$9999.999') from dual;
--15
select to_number('f', 'x') from dual;
2、聚合函数
1)最大值函数:max([distinct|all]x),最小值函数:min ([distinct|all]x)
可以作用于数值型数据、字符串、日期时间数据类型的数据,max(null),min(null)返回null
对字符型数据的最大值,是按照首字母由A~Z的顺序排列,越往后,其值越大。
对于汉字则是按照其全拼拼音排列的,若首字符相同,则比较下一个字符,以此类推。
对于日期时间类型的数据也可以求其最大/最小值,其大小排列就是日期时间的早晚,越早认为其值越小。


2)求和函数sum([distinct|all]x),统计记录数函数:count(*|[distinct|all]x),求平均值函数:avg([distinct|all]x)
count(*):将返回表格中所有存在的行的总数(包括null的行)
count(列名):将返回表格中除去null以外的所有行的总数
count(distinct+列名):与count(列名)相同
3、特殊函数
1) 唯一字符串函数: sys_guid()
生成由32位长度由大写字母和数字组成的唯一字符串
select sys_guid() from dual;
结果:4061D1372CEA31E4E05318E01F0A5902


第3个参数不填写会被填充空格
2)左填充函数:lpad(string,padded_length,[pad_string])
select lpad(1, 6, 't') from dual;--ttttt1
select lpad(1234567, 6, 't') from dual;--123456
3)右填充函数:lpad(string,padded_length,[pad_string])
select rpad(1, 6, 't') from dual;--1ttttt
select rpad('abcdefg', 6, 't') from dual;--abcdef
4)随机包函数


1) 返回0~1间的38位精度的随机数函数(包括0.0,不包括1.0):dbms_random.value
--0.474199333601534
select dbms_random.value from dual;
2)返回a~b之间的随机数的函数(包括a=1,不包括b=10):dbms_random.value(1,10) :
--4.63158069726374
select dbms_random.value(1,10) from dual;
3)产生正态分布的随机数的函数: dbms_random.normal


/*
注意:normal函数返回从正态分布的一组数。此正态分布标准偏差为1,期望值为0。
这个函数返回的数值中有68%是介于-1与+1之间, 95%介于-2与+2之间,99%介于-3与+3之间
*/
---0.241547252937121
select dbms_random.normal from dual;
4)返回指定长度的的字符串的函数: dbms_random.string(opt char, len NUMBER)


/*
'u'或'U'–>返回大写字母
'l'或'L'–>返回小写字母
'a'或'A'–>大小写字母混合
'x'或'X'–>大写字母和数字混合
'p'或'P'–>任意可显示字符
*/
--LSNB
select dbms_random.string('u',4) from dual;
5)返回一个随机数的函数: dbms_random.random


--范围:-power(2,31) <= random < power(2,31)
--35725665
select dbms_random.random from dual;
6)返回绝对值函数:abs
--1949
select abs(-1949) from dual;
7)返回大于或等于给出数字的最小整数:ceil
--7
Select ceil(6.5) from dual;
8)返回小于或等于给出数字的最大整数:floor
--6
Select floor(6.5) from dual;

 

9) 返回保留指定位数的数字:round(number,digits)
/*
要四舍五入的数,digits是要小数点后保留的位数
如果 digits 大于 0或不填写,则四舍五入到指定的小数位
如果 digits 等于 0,则四舍五入到最接近的整数
如果 digits 小于 0,则在小数点左侧进行四舍五入
*/
--3.687
select round(3.6873,3) from dual;


10)nvl(expr1,expr2)
expr1为null,返回expr2,否则返回expr1
参数expr1、expr2可以是任何数据类型,但应该保持相同。
若两者数据类型不一致,则Oracle数据库会隐式的转换其中一个的数据类型使其保持和另一个一致,若无法转换则会返回错误。
--空
select nvl(null,'空') from dual;
--1
select nvl('1','空') from dual;


11)nvl2(expr1,expr2,expr3)
如果expr1不是null值,则expr2,否则就返回expr3。
参数可以返回任何数据类型的值,但是expr2和expr3不能是LONG型的数据类型
--空
select nvl2(null,'非空','空') from dual;
--非空
select nvl2('1','非空','空') from dual;


12)nullif(expr1,expr2)
参数expr1,expr2
常量、列名、函数、子查询或算术运算符、按位运算符以及字符串运算符的任意组合,参数中不能有null。
返回类型与第一个 expr1 相同
如果两个表达式相等,则返回空值null
如果两个表达式不相等,则返回expre1的值
--
select nullif(1,1) from dual;
--1
select nullif('1','') from dual;
--1
select nullif('1',' ') from dual;


13)返回字符串位置的函数:instr(source,search, start_position,nth_appearance)
source:源字符串
search:被查找的字符串
start_position:从源字符串中哪个位置开始查找字符串,可省略,默认为1,正整数,从左到右查找,负整数从右到左查找
nth_appearance:第几次出现被查找的字符串,可不填写,默认为1,不能为负数
也可以找到单个字符
--8
select instr('2016-11-03 16:24:20', '-', 1, 2) from dual;


14) 返回截取后的字符串:substr(strings|express,start,[length])
strings|express :被截取的字符串或字符串表达式
start:从哪个位置开始截取,正数(在字符串的指定位置开始),负数(从字符串结尾的指定位置开始),0(在字符串中的第1个位置处开始)
length:可选,指定要截取的字符串长度,缺省时返回字符表达式的值结束前的全部字符
--01
select substr('2016-11-03',2,2) from dual;
--03
select substr('2016-11-03',-2,2) from dual;
--16-11-03
select substr('2016-11-03',3) from dual;


15) 值转换函数:decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
条件可以为字段或表达式
当条件等于值1时,函数翻译值1,条件等于值2时,函数翻译值2,都不符合时,返回缺省值
-- 9大于3
select decode(sign(9-3),1,'9大于3',-1,'9小于3',0,'9等于3','不知道') from dual;
16)判断正负数函数:sign(变量1-变量2)
根据(变量1-变量2)的值是0、正数、负数,返回0、1、-1


17) translate(Str,fromStr,toStr)
1、将Str中的字符串,替换后返回,按fromStr与toStr一一对应的方式,如果不能一一对应则被视为空值。
2、如果fromStr字符串长度比toStr长,则fromStr字符串比toStr字符串,多出的字符将被删除。
3、translate中的任何参数为null,那么结果也是null。
--1 9XXX999 将数字转换为9,其他的大写字母转换为X,然后返回
select translate('2KRW229',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'9999999999XXXXXXXXXXXXXXXXXXXXXXXXXX') result
from dual;


--2 2229 将数字保留,将其他的大写字母移除
select translate('2KRW229',
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'0123456789') as result
from dual;
--3 我是Ch人,我爱Ch 按照字符来处理,不是按照字节来处理,如果toStr的字符数比fromStr多的话,多出的字符会被删除
select translate('我是中国人,我爱中国', '中国', 'China') "result"
from dual;


--4 I m 中国ese, I love 中国 如果fromStr的字符数大于toStr,多出的字符会被删除
select translate('I am Chinese, I love China', 'China', '中国') as "result"
from dual;
--5 如果参数为空或空字符串,整个返回null
select translate('2KRW229', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', null) "结果"
from dual;
--6 **人 只显示账户中的姓名最后一个字,其余的用星号代替
select translate('中国人',
substr('中国人', 1, length('中国人') - 1),
rpad('*', length('中国人'), '*')) as "结果"
from dual;


18)排序函数:
1、row_number() over([partition by colum] order by colum)
为有序组中的每一行返回一个唯一的排序值,序号由 order by 子句指定,从 1 开始,即使具有相等的值,排位也不同。
partition by colum 按列值进行区分,各分组内在进行排序。
2、dense_rank() over([partition by colum] order by colum)
计算一个值在一个组中的地位,由 1 开头,具有相等值得行排位相同,并且排位是连续的。
3、rank() over([partition by colum] order by colum)
计算一个值在一个组中的地位,由 1 开头,具有相等值得行排位相同,序数随后跳跃相应的数值。


5、SQL语句函数运用

分组排序的示例
--按日期统计(角色1) 用户的数量
select trunc(cr.created_date, 'dd'),
count(case
when cr.role_id = 'rolea' then
1
else
null
end) as 角色1
from check_role cr
group by trunc(cr.created_date, 'dd')
order by trunc(cr.created_date, 'dd') desc;


使用伪列,字符串操作示例
--返回最新版本号
select flowId
from (select row_number() over(partition by cr.key_ order by cr.version_ desc) rnum,
substr(cr.key_,
instr(cr.key_, '_', 1, 2) + 1,
length(cr.key_)) cityId,
cr.ID_ flowId,
cr.version_
from check_record cr
where cr.key_ like 'check_test%')
where rnum = 1;


decode函数示例
--我的消息表
select decode(tn.type,1,'类型1',2,'类型2',3,'类型3',4,'类型4') as "产品类型", tn.user_id as "用户编号", count(*) as "消息条数"
from test_news tn
where tn.user_id is not null
and tn.created_date >=
to_date('2014-11-01 09:00:00', 'yyyy-mm-dd hh24:mi:ss')
group by decode(tn.type,1,'类型1',2,'类型2',3,'类型3',4,'类型4'), tn.user_id
order by decode(tn.type,1,'类型1',2,'类型2',3,'类型3',4,'类型4') desc, tn.user_id desc, count(*) desc

 

posted on 2018-03-13 21:44  新美好时代  阅读(618)  评论(0编辑  收藏  举报