oracle的学习总结

    技术2022-05-19  26

    2011-05-18 11:56:55

    1.查询内容重复字段

    distinct关键字只能过滤查询字段中所有字段内容相同的(记录集相同),另外distinct关键字会排序,效率很低。

    如:

    select distinct name from t1 能消除重复记录,但只能取一个字段,现在要同时取id,name2个字段的值。  select distinct id,name from t1 可以取多个字段,但只能消除这2个字段值全部相同的记录  所以用distinct达不到想要的效果,用group by   可以解决这个问题。 例如要显示的字段为ABC三个,而A字段的内容不能重复可以用下面的语句: select A, min(B),min(C),count(*) from [table] where [条件] group by   A having [条件] order by A desc 为了显示标题头好看点可以把select A, min(B),min(C),count(*) 换称select A as A, min(B) as B,min(C) as C,count(*) as 重复次数  显示出来的字段和排序字段都要包括在group by  但显示出来的字段包有min,max,count,avg,sum等聚合函数时可以不在group by  如上句的min(B),min(C),count(*) 一般条件写在where 后面 有聚合函数的条件写在having 后面 如果在上句中having加 count(*)>1   就可以查出记录A的重复次数大于1的记录 如果在上句中having加 count(*)>2   就可以查出记录A的重复次数大于2的记录 如果在上句中having加 count(*)>=1   就可以查出所有的记录,但重复的只显示一条,并且后面有显示重复的次数----这就是所需要的结果,而且语句可以通过hibernate

    查询出那些数据是重复的:    select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1          将上面的>号改为=号就可以查询出没有重复的数据了。

     

    2.wm_concat(column)函数的使用(字段合并)

    (1).

    wm_concat(column)函数实现字段合并。

    shopping:

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

    u_id       goods            num

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

    1                苹果        2

    2                 梨子        5

    1                 西瓜        4

    3                 葡萄        1

    3                 香蕉        1

    1                 橘子        3

    =======================

    想要的结果为:

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

    u_id          goods_sum

    ____________________

    1              苹果,西瓜,橘子

    2              梨子

    3              葡萄,香蕉

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

    select u_id, wmsys.wm_concat(goods) goods_sum  

     from shopping  

    group by u_id  

    想要的结果2:

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

    u_id          goods_sum

    ___________________

    1              苹果(2),西瓜(4),橘子(3)

    2              梨子(5)

    3              葡萄(1),香蕉(1)

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

    使用oracle wm_concat(column)函数实现:

    select u_id, wmsys.wm_concat(goods || '(' || num || ')' ) goods_sum  

     from shopping  

     group by u_id  

    (2)

    把多行转换 wmsys.wm_concat //数据库内部函数:把多行转换成一合并列

    例如:

    select b.fchannel_id from sinocms_bindle_channel b where b.channel_id='1000000027'   

    结果:

    1 1000000029

    2 1000000030

    3 1000000031

    4 1000000032

    5 1000000033

    6 1000000034

     

     把多行转换成一合并列

    select wmsys.wm_concat(b.fchannel_id) from sinocms_bindle_channel b where b.channel_id='1000000027'  

     结果:1000000029,1000000030,1000000031,1000000032,1000000033,1000000034

     ====

    =====

    4、说明:创建新表

    create table tabname(col1 type1 [not null][primary key],col2 type2 [not null],..)

     

    根据已有的表创建新表:

    A:create table tab_new like tab_old (使用旧表创建新表)

    B:create table tab_new as select col1,col2… from tab_old definition only

    =======================================================

    =========================================================

    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),不消除重复行。

    注:使用运算词的几个查询结果行必须是一致的。

    1.按姓氏笔画排序:

    Select * From TableName Order ByCustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多


    最新回复(0)