Oracle 常用例子

    技术2023-05-27  24

    1、说明:创建数据库 create database database-name drop database dbname

    a:alter table tabname add column col type b:alter table tabname drop column colname

    alter table tabname add primary key(col) alter table tabname drop primary key(col) create [unique] index idxname on tabname(col….) drop index idxname

    注:索引是不可更改的,想更改必须删除重新建。 create view viewname as select statement drop view viewname

    11、几个高级查询运算词 a: union 运算符 union 运算符通过组合其他两个结果表(例如 table1 和 table2)并消去表中任何重复行而派生出一个结果表。当 all 随 union 一起使用时(即 union all),不消除重复行。两种情况下,派生表的每一行不是来自 table1 就是来自 table2。 b: except 运算符 except 运算符通过包括所有在 table1 中但不在 table2 中的行并消除所有重复行而派生出一个结果表。当 all 随 except 一起使用时 (except all),不消除重复行。 c: intersect 运算符 intersect 运算符通过只包括 table1 和 table2 中都有的行并消除所有重复行而派生出一个结果表。当 all 随 intersect 一起使用时 (intersect all),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。

    12、分组:group by: 一张表,一旦分组完成后,查询后只能得到组相关的信息。 组相关的信息:(统计信息) count,sum,max,min,avg 分组的标准) 在sqlserver中分组时:不能以text,ntext,image类型的字段作为分组依据 在selecte统计函数中的字段,不能和普通的字段放在一起; select newid() 说明:列出数据库里所有的表名 select name from sysobjects where type=’u’ // u代表用户 说明:列出表里的所有的列名 select name from syscolumns where id=object_id(‘tablename’)

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。 select type, sum(case vender when ‘a’ then pcs else 0 end), sum(case vender when ‘c’ then pcs else 0 end), sum(case vender when ‘b’ then pcs else 0 end) from tablename group by type 显示结果: type vender pcs 电脑 a 1 电脑 a 1 光盘 b 2 光盘 a 2 手机 b 3 手机 c 3 24、说明:选择从10到15的记录 select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc


    11.1 部分数学函数

    绝对值:abs()指数:power()平方根:sqrt()随机数:dbms_random.value、dbms_random.value(num1,num2)、dbms_random.normal、dbms_random.string(opt,len)向上及向下取整:ceil()、floor()四舍五入:round(m,d)求符号:sign()取余:mod()

    11.2 部分字符串函数

    计算长度:length()小写大写:lower()、upper()截去空格:ltrim()、rtrim()、trim()取子字符串:substring(string,start,length)取子字符串在字符串中的位置:instr(string,substring)替换子串:replace(string,origin,current)

    11.3 日期时间函数 日期(date)、时间(time)、日期时间(datetime)、时间戳(timestamp)。

    将字符串转换为时间类型:to_date(‘2016-10-26 12:12:12’,’yyyy-mm-dd hh24:mi:ss’)获取当前时间:systimestamp、sysdate,如果想获取日期类型或者时间类型,请使用to_char(sysdate,’yyyy-mm-dd’)或者to_char(sysdate,’hh24:mi:ss’)日期的运算:fbirthday+3(3天后)、fbirthday-10(10天前)、fbirthday+(2/24+10/60/24)(2小时10分钟后)、add_months(fbirthday,2)(两个月后)、add_months(fbirthday,-10)(10个月以前)、add_months(fbirthday,-3)-(10/24)(3个月零10小时之前)日期的显示:可以使用to_char(date,’format’),其中format不同可以有多不同的显示方式。

    11.4 部分类型转换函数

    to_char()to_date()to_number()

    11.5 空值处理函数

    coalesce(expression,value1,value2,…valuen):如果expression不为空,则返回expresion,否则判断value1是否为空,不为空返回value1,否则判断value2,value2不为空返回value2,否则判断value3…,直至valuen,如果所有的都为空,则最终返回null。nvl(expression,value):是coalesce(expression,value1,value2,…valuen)的简化版。只接受两个变量。nullif(e1,e2):e1与e2不等价,则返回e1;等价则返回e1同类型的空值。case expression when value1 then returnvalue1 when value2 then returnvalue2 … else defaultreturnvalue endcase when condition1 then returnvalue1 when condition2 then returnvalue2 … else defaultreturnvalue end 区别:coalesce函数和其简化版的nvl函数主要用来进行空值的判定处理,不能用于处理非空值的比较逻辑;第一个case用法适用于一个条件的等价对比逻辑,不能用于处理多个条件的非等价对比逻辑。

    11.6 oracle中独有的函数

    填充函数:lpad(str1,n[,str2])、rpad(str1,n[,str2])。比如,lpad(name,15,’‘)表示将name字段左边用’‘填充到15个字符。如果n小于str1的字符个数,str1会从后面被截断。last_day(date):返回date所在月份的最后一天。greatest(n1,n2,n3,n4)和least(n1,n2,n3,n4):计算一个集合中最大值和最小值。user:用来取得当前登录的用户名。userenv(option):用来取得登录用户的相关环境信息。

    12.索引与约束 12.1 索引的创建与删除 创建索引的语法:create index 索引名称 on 表名(字段1,字段2,……字段n) 删除索引的语法:drop index 索引名称

    12.2 约束的类别及其特点

    非空约束:not null,对插入和更新数据有效唯一约束:unique,只是对约束的单个字段有效,复合唯一约束请使用constraint 约束名 unique(字段1,字段2…,字段n)check约束:check(fage>10)表示该字段的值必须都大于10,否则插入或者修改数据失败。check(length(fnumber)>12)表示 fnumber的长度必须大于12。如果约束涉及到多个列,需要使用constraint关键字,比如constraint 约束名 check(fage>fworkyear)。主键约束:primary key,复合主键必须使用constraint 约束名 primary key(fnumber,fname)。当然,也可以通过 alter table 表名 add constraint 约束名 primary key(n1,n2…)来为一个没有主键的表增加主键,但是一定要求那个待成为主键的列必须有not null约束。外键约束:foreign key 外键字段 references 外键表名(外键表的主键字段)。

    14.4 any和some运算符是同义词。在使用它们的时候,前面必须加上比较运算符。

    select * from t_book where year =any (select year from t_reader) 这种用法等同于使用in关键字。 值得注意的是,后面不能是固定的集合,这点区别于in的用法。 14.5 all运算符:使用方法同any。但值得注意的是,如果子查询的结果集返回为空,那么all前面不管是什么运算符,其返回值永远为true 14.6 exists:不要求待匹配的集合是单列的,该关键字是用来检查外部查询结果的每一行是否匹配子查询,如果子查询结果为空,则返回结果为false,否则,返回结果为true。

    16.2.4 常用的优化手法

    创建必要的索引,在经常需要进行检索的字段上创建索引。参数化sql不仅能够避免sql注入漏洞攻击,还能让dbms对该sql执行预编译,下次再使用该sql就可以直接使用预编译的结果,加快速度。dbms一般采用自下而上,从右到左的顺序解析where子句,所以,如果where中如果存在多个过滤条件,并且其中有表连接的过滤条件,请把该条件放在前面,这样,dbms就会先过滤其它的条件,最后再做连接操作,大大减少了表连接的数量。避免使用select ,即使需要检索所有的列,也不要使用,因为dbms在解析过程中,会将依次解析转换成所有的列名,降低查询速度。尽量将多条sql合并成一条sql。可以的话,用where替换having,where是在结果之前进行过滤,having是在结果之后过滤。使用表的别名。用exists代替in,因为in会对子查询结果进行排序和合并。使用表连接替换exists。避免在索引列上使用计算,在where子句中,如果索引列是计算或者函数的一部分,dbms优化器将不会使用索引而使用全表扫描。比如select * from t_employee where salary*12 > 25000优化成select * from t_employee where salary > 25000/12将会从全表扫描转换为走索引。在确定检索结果中不会用重复记录的情况下,使用union all替换union。避免隐式类型转换造成的全表扫描,比如select * from t_person where level = 10,其中level列为字符串类型,且有索引,因为与数字10进行了比较,dbms进行了隐式类型转换,所以相当于执行了select * from t_person where to_int(level) = 10,可以看出,因为对索引列使用了计算(函数),造成原来走索引的sql现在变成了全表扫描。应该这样改select * from t_person where level = ‘10’。如果dbms优化器认为检索范围过宽,那么它将放弃索引而使用全表扫描。比如,使用is not null或者!=,可能造成优化器假设匹配的记录数太多。

    create or replace trigger trigger_personidautoincre before insert on t_person for each row declare begin select squence_id.nextval into :new.fid from dual; end trigger_personidautoincre;

    16.7.1 开窗函数的使用 开窗函数是在聚合函数后面增加一个over关键字,其使用格式为: 函数名(列) over(选项) 其中over关键字表示把函数当成开窗函数而不是聚合函数。sql标准允许将所有的聚合函数用作开窗函数,仅仅使用over来区分。over关键字后的括号中还经常添加选项用以改变进行聚合运算的窗口范围,如果选项为空,则表示对结果集中所有行进行聚合运算。

    16.7.2 partition by partition by是用来定义行的分区来供进行聚合计算,与group by不同的是,partition by创建的分区是独立于结果集的,它创建的分区仅仅供聚合计算使用,而且不同的开窗函数中的partition by所创建的分区互不影响。

    16.7.3 order by order by用来指定排序规则,对结果集按照指定的规则进行排序,并且在一个指定范围内进行聚合运算。 order by 字段名 range|rows between 上界 and 下界 其中range表示按照值的范围进行范围定义,rows表示按照行的范围进行范围的定义。 上界和下界可取值有:

    current row :当前行n preceding : 前n行unbounded preceding : 一直到第一条记录n following : 后n行unbounded following :一直到最后一条记录

    tips:”order by fname range between unbounded preceding and current row”可以省略为”order by fname”。

    16.7.4 高级开窗函数

    排名,rank(),dense_rank(),row_number()百分比,ratio_to_report()ntile(n),将结果集平均分割成n个部分,返回当前行所属于的部分号lead(),lag(),访问当前行之前或者之后某个指定列first_value(),last_value() ……

    16.8 with子句与子查询 为了避免多次使用类似的子查询,于是就有了with子句,用法:

    with 别名(l1,l2,l3) as (子查询)

    Processed: 0.011, SQL: 8