zoukankan      html  css  js  c++  java
  • SQL语句整理

              有些操作很久没有做了,因此mark一下,以防忘记了。

             1. Oracle数据库合并行记录,WMSYS.WM_CONCAT 函數的用法

        10 CLARK
        10 KING
        10 MILLER
        20 ADAMS
        20 FORD
        20 JONES
        20 SCOTT
        20 SMITH
        30 ALLEN
        30 BLAKE
        30 JAMES
        30 MARTIN
        30 TURNER
        30 WARD

        我们通过 10g 所提供的 WMSYS.WM_CONCAT 函数即可以完成 行转列的效果

       

    select t.rank, WMSYS.WM_CONCAT(t.Name) TIME From t_menu_item t GROUP BY t.rank;

    DEPTNO ENAME
    ------ ----------
        10 CLARK, KING, MILLER
        20 ADAMS, FORD, JONES, SCOTT, SMITH
        30 ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD

    2.ROW_NUMBER() OVER函数的基本用法

    简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记录返回一个序号。

    row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的)

    例如:

    根据部门分组,显示每个部门的工资等级,SQL语句应该是:

    SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee

    返回的结果是:

    3.lef join, right join, innner join

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
    right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
    inner join(等值连接) 只返回两个表中联结字段相等的行

    举例如下:
    --------------------------------------------
    表A记录如下:
    aID     aNum
    1     a20050111
    2     a20050112
    3     a20050113
    4     a20050114
    5     a20050115

    表B记录如下:
    bID     bName
    1     2006032401
    2     2006032402
    3     2006032403
    4     2006032404
    8     2006032408

    --------------------------------------------
    a.left join
    sql语句如下:
    select * from A
    left join B
    on A.aID = B.bID

    结果如下:
    aID     aNum     bID     bName
    1     a20050111    1     2006032401
    2     a20050112    2     2006032402
    3     a20050113    3     2006032403
    4     a20050114    4     2006032404
    5     a20050115    NULL     NULL

    (所影响的行数为 5 行)
    结果说明:
    left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
    换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.aID = B.bID).
    B表记录不足的地方均为NULL.
    --------------------------------------------
    b.right join
    sql语句如下:
    select * from A
    right join B
    on A.aID = B.bID

    结果如下:
    aID     aNum     bID     bName
    1     a20050111    1     2006032401
    2     a20050112    2     2006032402
    3     a20050113    3     2006032403
    4     a20050114    4     2006032404
    NULL     NULL     8     2006032408

    (所影响的行数为 5 行)
    结果说明:
    仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
    --------------------------------------------
    c.inner join
    sql语句如下:
    select * from A
    innerjoin B
    on A.aID = B.bID

    结果如下:
    aID     aNum     bID     bName
    1     a20050111    1     2006032401
    2     a20050112    2     2006032402
    3     a20050113    3     2006032403
    4     a20050114    4     2006032404

    结果说明:
    很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
    --------------------------------------------
    注:
    LEFT JOIN操作用于在任何的 FROM 子句中,组合来源表的记录。使用 LEFT JOIN 运算来创建一个左边外部联接。左边外部联接将包含了从第一个(左边)开始的两个表中的全部记录,即使在第二个(右边)表中并没有相符值的记录。

    语法:FROM table1 LEFT JOIN table2 ON table1.field1 compopr table2.field2

    说明:table1, table2参数用于指定要将记录组合的表的名称。
    field1, field2参数指定被联接的字段的名称。且这些字段必须有相同的数据类型及包含相同类型的数据,但它们不需要有相同的名称。
    compopr参数指定关系比较运算符:"=", "<", ">", "<=", ">=" 或 "<>"。
    如果在INNER JOIN操作中要联接包含Memo 数据类型或 OLE Object 数据类型数据的字段,将会发生错误.

    4.Merge是一个非常有用的功能,类似于Mysql里的insert into on duplicate key.

    通过这个merge你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表。

    merge into products p using newproducts np on (p.product_id = np.product_id) 
    when matched then 
    update set p.product_name = np.product_name 
    when not matched then 
    insert values(np.product_id, np.product_name, np.category)

    UPDATE子句后面可以跟DELETE子句来去除一些不需要的行 
    delete只能和update配合,从而达到删除满足where条件的子句的纪录 
    merge into products p using (select * from newproducts) np on (p.product_id = np.product_id) 
    when matched then 
    update set p.product_name = np.product_name delete where p.product_id = np.product_id where np.product_name like 'OL%' 
    when not matched then 
    insert values(np.product_id, np.product_name, np.category) 
    这里我们达到的目的就是 会把匹配的记录的prodcut_name更新到product里,并且把product_name开头为OL的删除掉。

    5. Dual

    1. dual 确实是一张表.是一张只有一个字段,一行记录的表. 
    2.习惯上,我们称之为'伪表'.因为他不存储主题数据.
    3. 他的存在,是为了操作上的方便.因为select 都是要有特定对象的.
    如:select * from mytable ;
    select * from myview;
    等等.
    但如果我们不需要从具体的表来取得表中数据,而是单纯地为了得到一些我们想得到的信息,并要通过select 完成时,就要借助一个对象,这个对象,就是dual;
    如我们要计算 999*999 的值,可以用:
    select 999*999 from dual;
    来实现;
    要拼接一个电话信息:
    select concat('010-','88888888')||'转23' 高乾竞电话 from dual;

    就变成了我们想要的格式输出.

    <![CDATA[
                    merge into con_queue a  
                    using dual b   
                    on (a.id = :Id)   
                    when not matched then
                           insert (a.pkid, a.bookid, a.id, a.status, a.type, a.time)
                         values (:pkId, :bookId, :Id, :Status, :Type, sysdate)
                ]]>

    6.增加分区
    alter table con_drmrecord add partition P_20150501 values less than(TO_DATE(' 2015-05-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'));

    7.查看分区的信息
    select *
      from user_tab_partitions t
      where t.table_name = 'TBL_SERVICE_INFO'; 表名要大写
  • 相关阅读:
    getAttribute()方法
    getElementsByTagName()方法
    DOM方法 getElementsByName()方法
    python 与
    run_debug和run_demo的区别
    sh脚本写法
    使用snapshot继续训练网络
    安卓获取数据demo出现的问题
    查看文件大小
    重命名文件夹名字
  • 原文地址:https://www.cnblogs.com/yedu/p/4486843.html
Copyright © 2011-2022 走看看