设为首页 收藏本站
查看: 841|回复: 0

[经验分享] SQL提高及优化

[复制链接]

尚未签到

发表于 2018-10-19 06:03:39 | 显示全部楼层 |阅读模式
  一基础单表查询
  1.1查询表结构
  desc 表名
  SQL> desc emp
  Name                                      Null?    Type
  EMPNO                                     NOT NULL NUMBER(4)
  ENAME                                              VARCHAR2(10)
  JOB                                                VARCHAR2(9)
  MGR                                                NUMBER(4)
  HIREDATE                                           DATE
  SAL                                                NUMBER(7,2)
  COMM                                               NUMBER(7,2)
  DEPTNO                                             NUMBER(2)
  1.2查找空值
  使用 is null
  SQL> select empno from emp where comm is null;
  

EMPNO  

  

  7369  7566
  7698
  7782
  7839
  7900
  7902
  7934
  

  8 rows selected.
  1.3 将空值转换成实际值,推荐使用coalesce
  SQL> select empno,nvl(comm,0) from emp where comm is null;
  

EMPNO NVL(COMM,0)  

  

  7369           0  7566           0
  7698           0
  7782           0
  7839           0
  7900           0
  7902           0
  7934           0
  

  8 rows selected.
  SQL> select empno,nvl2(comm,comm,0) from emp where comm is null;
  

EMPNO NVL2(COMM,COMM,0)  

  

  7369                 0  7566                 0
  7698                 0
  7782                 0
  7839                 0
  7900                 0
  7902                 0
  7934                 0
  

  8 rows selected.
  SQL> select empno,nullif(0,comm) from emp where comm is null;
  

EMPNO NULLIF(0,COMM)  

  

  7369              0  7566              0
  7698              0
  7782              0
  7839              0
  7900              0
  7902              0
  7934              0
  

  8 rows selected.
  SQL> select empno,coalesce(comm,0) from emp where comm is null;
  

EMPNO COALESCE(COMM,0)  

  

  7369                0  7566                0
  7698                0
  7782                0
  7839                0
  7900                0
  7902                0
  7934                0
  

  8 rows selected.
  NVL(expr1,expr2)
  如果expr1和expr2的数据类型一致,则:
  如果expr1为空(null),那么显示expr2,
  如果expr1的值不为空,则显示expr1。
  NVL2(expr1,expr2, expr3)
  如果expr1不为NULL,返回expr2; expr1为NULL,返回expr3。
  expr2和expr3类型不同的话,expr3会转换为expr2的类型,转换不了,则报错。
  NULLIF(expr1,expr2)
  如果expr1和expr2相等则返回空(NULL),否则返回expr1。
  coalesce(expr1, expr2, expr3….. exprn)
  返回表达式中第一个非空表达式,如果都为空则返回空值。
  所有表达式必须是相同类型,或者可以隐式转换为相同的类型,否则报错。
  Coalese函数和NVL函数功能类似,只不过选项更多。
  1.4 在SELECT语句中使用条件逻辑
  SQL> select empno,
  2       ename,
  3       sal,
  4       case
  5         when sal=4000 then '过高'
  7         else 'OK'
  8       end as status
  9    from emp
  10  where deptno=10;
  

EMPNO ENAME             SAL STATUS  

  

  7782 CLARK            2450 OK  7839 KING             5000 过高
  7934 MILLER           1300 过低
  

  1.5限制返回行数
  SQL> select empno from emp where rownum select empno,ename from (select empno,ename from emp order by dbms_random.value()) where rownum select empno,ename from (select empno,ename from emp order by dbms_random.value()) where rownum select TRANSLATE('ab 你好 abcdef','abcdef','123456') as newstring from dual;

NEWSTRING
  12 你好 123456
  SQL> select TRANSLATE('ab 你好 abcdef','abcdef','1234') as newstring from dual;

NEWSTRING
  12 你好 1234
  SQL> select TRANSLATE('ab 你好 abcdef','acdef','1234') as newstring from dual;

NEWSTRING
  1b 你好 1b234
  SQL> select TRANSLATE('ab 你好 abcdef','acdef','') as newstring from dual;

N
  替换值为空,返回空
  SQL> select TRANSLATE('ab 你好 abcdef','1abcdef','1') as newstring from dual;

NEWSTRING
  你好
  替换wei位置没有字符则删除
  1.8 混合字符串按字母排序
  SQL> set line 100
  SQL> col TRANSLATE(EMPNO||''||ENAME,'-1234567890','-') format A40
  SQL> select empno||' '||ename as data,translate(empno||' '||ename,'- 1234567890','-') from emp e order by 2 ;

DATA                                                TRANSLATE(EMPNO
''
ENAME,'-1234567890'  7499 ALLEN                                          ALLEN
  7698 BLAKE                                          BLAKE
  7782 CLARK                                          CLARK
  7902 FORD                                           FORD
  7900 JAMES                                          JAMES
  7566 JONES                                          JONES
  7839 KING                                           KING
  7654 MARTIN                                         MARTIN
  7934 MILLER                                         MILLER
  7369 SMITH                                          SMITH
  7844 TURNER                                         TURNER

DATA                                                TRANSLATE(EMPNO
''
ENAME,'-1234567890'  7521 WARD                                           WARD
  12 rows selected.
  SQL> select empno||' '||ename as data from emp e order by translate(empno||' '||ename,'- 1234567890','-') ;

DATA
  7499 ALLEN
  7698 BLAKE
  7782 CLARK
  7902 FORD
  7900 JAMES
  7566 JONES
  7839 KING
  7654 MARTIN
  7934 MILLER
  7369 SMITH
  7844 TURNER

DATA
  7521 WARD
  12 rows selected.
  1.9 NULL排序使用NULLS FIRST/LAST
  1.10按条件区不同列中值来排序
  SQL> select empno,
  2        ename,
  3        sal
  4    from emp
  5  where deptno=30
  6  order by Case
  7             when sal>=1000 and sal  select empno,
  2        ename,
  3        sal
  4    from emp
  5  where deptno=30
  6  order by Case
  7             when sal>=1000 and sal  select 'a' as c1 from dual
  2  union all
  3  select '' as c1 from dual;

C
  a
  2.2 union与or
  SQL> select empno,ename from emp where empno=7782 or ename='WARD';
  

EMPNO ENAME  

  

  7521 WARD  7782 CLARK
  

  SQL> select empno,ename from emp where empno=7782
  2  union
  3  select empno,ename from emp where ename='WARD';
  

EMPNO ENAME  

  

  7521 WARD  7782 CLARK
  


  SQL>>
  Session>  SQL> explain plan for select empno,ename from emp where empno=7782 or ename='WARD';
  Explained.
  SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
  Plan hash value: 3956160932

|>
|   0 | SELECT STATEMENT  |      |     2 |    20 |     3   (0)| 00:00:01 |
  |*  1 |  TABLE ACCESS FULL| EMP  |     2 |    20 |     3   (0)| 00:00:01 |

Predicate Information (identified by operation>
PLAN_TABLE_OUTPUT
  1 - filter("EMPNO"=7782 OR "ENAME"='WARD')
  13 rows selected.
  SQL> explain plan for select empno,ename from emp where empno=7782
  2  union
  3  select empno,ename from emp where ename='WARD';
  Explained.
  SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
  Plan hash value: 1027572458

  |>  me     |

PLAN_TABLE_OUTPUT
  |   0 | SELECT STATEMENT              |        |     2 |    20 |     6  (34)| 00
  :00:01 |
  |   1 |  SORT UNIQUE                  |        |     2 |    20 |     6  (34)| 00
  :00:01 |

2
UNION-ALL  |   3 |    TABLE ACCESS BY INDEX ROWID| EMP    |     1 |    10 |     1   (0)| 00
  :00:01 |

PLAN_TABLE_OUTPUT
  |*  4 |     INDEX UNIQUE SCAN         | PK_EMP |     1 |       |     0   (0)| 00
  :00:01 |
  |*  5 |    TABLE ACCESS FULL          | EMP    |     1 |    10 |     3   (0)| 00
  :00:01 |

PLAN_TABLE_OUTPUT

Predicate Information (identified by operation>  4 - access("EMPNO"=7782)
  5 - filter("ENAME"='WARD')
  18 rows selected.
  实际上ENAME也可以建索引那样更快
  需要注意的
  SQL> select deptno from emp where EMPNO=7698 or job='SALESMAN' ORDER BY 1;
  

DEPTNO  

  

    30  30
  30
  30
  30
  

  SQL> select deptno,empno from emp where EMPNO=7698 or job='SALESMAN' ORDER BY 1;
  

DEPTNO      EMPNO  

  

    30       7499  30       7521
  30       7844
  30       7698
  30       7654
  SQL> select deptno from emp where EMPNO=7698
  

  2  union
  3  select deptno from emp where job='SALESMAN';
  

DEPTNO  

  

    30  

  避免这样问题出现可以用唯一列,主键列或rowid
  SQL> select deptno,empno from emp where EMPNO=7698
  2  union
  3  select deptno,empno from emp where job='SALESMAN';
  

DEPTNO      EMPNO  

  

    30       7499  30       7521
  30       7654
  30       7698
  30       7844
  

  SQL> with
  2    e as (select rownum as sn,deptno,empno,job from emp)
  3  select deptno
  4    from
  5    (
  6       select sn,deptno from e where  EMPNO=7698
  7       union
  8       select sn,deptno from e where job='SALESMAN'
  9     )
  10   order by 1;
  

DEPTNO  

  

    30  30
  30
  30
  30
  

  2.3 组合相关的行
  SQL> select e.empno,e.ename,d.dname,d.loc
  2  from emp e
  3  inner join dept d on (e.deptno=d.deptno)
  4  where e.deptno =10;
  

EMPNO ENAME      DNAME          LOC  

  

  7782 CLARK      ACCOUNTING     NEW YORK  7839 KING       ACCOUNTING     NEW YORK
  7934 MILLER     ACCOUNTING     NEW YORK
  
SQL> select e.empno,e.ename,d.dname,d.loc
  

  2  from emp e
  3  inner join dept d using(deptno)
  4  where deptno =10;
  

EMPNO ENAME      DNAME          LOC  

  

  7782 CLARK      ACCOUNTING     NEW YORK  7839 KING       ACCOUNTING     NEW YORK
  7934 MILLER     ACCOUNTING     NEW YORK
  

  2.4 IN,EXISTS和INNER JOIN

  SQL>>  alter session set"_b_tree_bitmap_plans"=false
  *
  ERROR at line 1:
  ORA-12571: TNS:packet writer failure
  SQL> conn scott/tiger@clonepdb_plug
  Connected.

  SQL>>
  Session>  SQL> explain plan for select empno,ename,job,deptno,sal
  2  from emp
  3  where (empno,ename,sal) in (select empno,ename,sal from emp )
  4  ;
  Explained.
  SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
  Plan hash value: 3956160932

|>
|   0 | SELECT STATEMENT  |      |    12 |   300 |     3   (0)| 00:00:01 |
  |*  1 |  TABLE ACCESS FULL| EMP  |    12 |   300 |     3   (0)| 00:00:01 |

Predicate Information (identified by operation>
PLAN_TABLE_OUTPUT
  1 - filter("ENAME" IS NOT NULL AND "SAL" IS NOT NULL)
  13 rows selected.
  SQL> explain plan for select empno,ename,job,deptno,sal
  2  from emp a
  3  where exists (select null
  4                from emp b
  5                where b.ename=a.ename
  6                and b.job=a.job
  7                and b.sal=a.sal);
  Explained.
  SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
  Plan hash value: 977554918

|>
|   0 | SELECT STATEMENT   |      |    12 |   516 |     6   (0)| 00:00:01 |
  |*  1 |  HASH JOIN SEMI    |      |    12 |   516 |     6   (0)| 00:00:01 |
  |   2 |   TABLE ACCESS FULL| EMP  |    12 |   300 |     3   (0)| 00:00:01 |
  |   3 |   TABLE ACCESS FULL| EMP  |    12 |   216 |     3   (0)| 00:00:01 |

PLAN_TABLE_OUTPUT

Predicate Information (identified by operation>  1 - access("B"."ENAME"="A"."ENAME" AND "B"."JOB"="A"."JOB" AND
  "B"."SAL"="A"."SAL")
  16 rows selected.
  SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
  Plan hash value: 3638257876

|>
|   0 | SELECT STATEMENT   |      |    12 |   516 |     6   (0)| 00:00:01 |
  |*  1 |  HASH JOIN         |      |    12 |   516 |     6   (0)| 00:00:01 |
  |   2 |   TABLE ACCESS FULL| EMP  |    12 |   300 |     3   (0)| 00:00:01 |
  |   3 |   TABLE ACCESS FULL| EMP  |    12 |   216 |     3   (0)| 00:00:01 |

PLAN_TABLE_OUTPUT

Predicate Information (identified by operation>  1 - access("B"."JOB"="A"."JOB" AND "B"."ENAME"="A"."ENAME" AND
  "B"."SAL"="A"."SAL")
  16 rows selected.
  SQL> explain plan for select a.empno,ename,job,sal,a.deptno
  2  from emp a inner join emp b using(job,ename,sal)
  3  ;
  Explained.
  SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT
  Plan hash value: 3638257876

|>
|   0 | SELECT STATEMENT   |      |    12 |   516 |     6   (0)| 00:00:01 |
  |*  1 |  HASH JOIN         |      |    12 |   516 |     6   (0)| 00:00:01 |
  |   2 |   TABLE ACCESS FULL| EMP  |    12 |   300 |     3   (0)| 00:00:01 |
  |   3 |   TABLE ACCESS FULL| EMP  |    12 |   216 |     3   (0)| 00:00:01 |

PLAN_TABLE_OUTPUT

Predicate Information (identified by operation>  1 - access("A"."SAL"="B"."SAL" AND "A"."ENAME"="B"."ENAME" AND
  "A"."JOB"="B"."JOB")
  16 rows selected.
  2.5 INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN区别
  INNER JOIN 返回必配数据
  LEFT JOIN 左表为主,右表只返回左表匹配数据,右表没有显示的为空  等同于右(+)
  RIGHT JOIN与上面相反等同于左(+)
  FULL JOIN 左右表均返回索引数据,匹配的显示一行
  2.6 自关联
  SQL> run/
  1  select a.empno as "员工编号",
  2       a.ename as "员工姓名",
  3       a.job as "职位",
  4       b.empno as "主管编号",
  5       b.ename  as "主管姓名"
  6    from emp a
  7    left join emp b on(a.mgr=b.empno)
  8* order by 1
  员工编号 员工姓名   职位        主管编号 主管姓名
  

  7369 SMITH      CLERK           7902 FORD  7499 ALLEN      SALESMAN        7698 BLAKE
  7521 WARD       SALESMAN        7698 BLAKE
  7566 JONES      MANAGER         7839 KING
  7654 MARTIN     SALESMAN        7698 BLAKE
  7698 BLAKE      MANAGER         7839 KING
  7782 CLARK      MANAGER         7839 KING
  7839 KING       PRESIDENT
  7844 TURNER     SALESMAN        7698 BLAKE
  7900 JAMES      CLERK           7698 BLAKE
  7902 FORD       ANALYST         7566 JONES
  

  员工编号 员工姓名   职位        主管编号 主管姓名
  

  7934 MILLER     CLERK           7782 CLARK  

  12 rows selected.
  2.7 NOT IN、NOT EXISTS和 LEFT JOIN
  SQL> select count(*) from emp where deptno =40;

COUNT(*)
  

     0  

  SQL> select * from dept where deptno not in (select deptno from emp where deptno is null);
  

DEPTNO DNAME          LOC  

  

    10 ACCOUNTING     NEW YORK  20 RESEARCH       DALLAS
  30 SALES          CHICAGO
  
SQL> select * from dept where not exists (select null from emp where emp.deptno=dept.deptno );
  

  no rows selected
  SQL> select dept.* from dept left join emp  on dept.deptno=emp.deptno where emp.deptno is null;
  no rows selected
  2.8 外连接的条件不能乱放
  SQL> select dept.* from dept left join emp  on(dept.deptno=emp.deptno and emp.deptno is null);
  

DEPTNO DNAME          LOC  

  

    10 ACCOUNTING     NEW YORK  20 RESEARCH       DALLAS
  30 SALES          CHICAGO
  


  SQL>>
  Session>  SQL> explain plan for select dept.* from dept left join emp  on(dept.deptno=emp.deptno and emp.deptno is null);
  Explained.
  SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
  Plan hash value: 2251696546

  |>  me     |

PLAN_TABLE_OUTPUT
  |   0 | SELECT STATEMENT             |         |     3 |    69 |     6  (17)| 00
  :00:01 |
  |   1 |  MERGE JOIN OUTER            |         |     3 |    69 |     6  (17)| 00
  :00:01 |
  |   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     3 |    60 |     2   (0)| 00
  :00:01 |
  |   3 |    INDEX FULL SCAN           | PK_DEPT |     3 |       |     1   (0)| 00
  :00:01 |

PLAN_TABLE_OUTPUT
  |*  4 |   SORT JOIN                  |         |     1 |     3 |     4  (25)| 00
  :00:01 |
  |*  5 |    TABLE ACCESS FULL         | EMP     |     1 |     3 |     3   (0)| 00
  :00:01 |

PLAN_TABLE_OUTPUT

Predicate Information (identified by operation>  4 - access("DEPT"."DEPTNO"="EMP"."DEPTNO"(+))
  filter("DEPT"."DEPTNO"="EMP"."DEPTNO"(+))
  5 - filter("EMP"."DEPTNO"(+) IS NULL)
  19 rows selected.
  SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
  Plan hash value: 1353548327

  |>  me     |

PLAN_TABLE_OUTPUT
  |   0 | SELECT STATEMENT             |         |     1 |    23 |     6  (17)| 00
  :00:01 |
  |   1 |  MERGE JOIN ANTI             |         |     1 |    23 |     6  (17)| 00
  :00:01 |
  |   2 |   TABLE ACCESS BY INDEX ROWID| DEPT    |     3 |    60 |     2   (0)| 00
  :00:01 |
  |   3 |    INDEX FULL SCAN           | PK_DEPT |     3 |       |     1   (0)| 00
  :00:01 |

PLAN_TABLE_OUTPUT
  |*  4 |   SORT UNIQUE                |         |    12 |    36 |     4  (25)| 00
  :00:01 |
  |   5 |    TABLE ACCESS FULL         | EMP     |    12 |    36 |     3   (0)| 00
  :00:01 |

PLAN_TABLE_OUTPUT

Predicate Information (identified by operation>  4 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")
  filter("DEPT"."DEPTNO"="EMP"."DEPTNO")
  18 rows selected.
  2.9 检查两个表中数据及对应数据条数是否相等
  SQL> run
  1  select a.empno,a.ename,b.empno,b.ename
  2  from emp a
  3  full join emp b on(b.empno=a.empno)
  4* where b.empno is null or b.empno is null
  no rows selected
  SQL> 4
  4 where b.empno is null or b.empno is null
  SQL> del
  SQL> run
  1  select a.empno,a.ename,b.empno,b.ename
  2  from emp a
  3 full join emp b on(b.empno=a.empno)
  

EMPNO ENAME           EMPNO ENAME  

  

  7369 SMITH            7369 SMITH  7499 ALLEN            7499 ALLEN
  7521 WARD             7521 WARD
  7566 JONES            7566 JONES
  7654 MARTIN           7654 MARTIN
  7698 BLAKE            7698 BLAKE
  7782 CLARK            7782 CLARK
  7839 KING             7839 KING
  7844 TURNER           7844 TURNER
  7900 JAMES            7900 JAMES
  7902 FORD             7902 FORD
  

  EMPNO ENAME           EMPNO ENAME
  

  

  7934 MILLER           7934 MILLER  

  12 rows selected.
  2.10多表查询的空值处理
  比ALLEN提成低的
  SQL> select a.ename,a.comm
  2     from emp a
  3  where coalesce(a.comm,0) create table test(
  2  c1 varchar2(10) default '默认1',
  3  c2 varchar2(10) default '默认2',
  4  c3 varchar2(10) default '默认3',
  5  c4 date default sysdate
  6  );
  Table created.
  SQL> insert into test(c1,c2,c3) values(default,null,'test');
  1 row created.
  SQL> select * from test
  2  ;
  C1         C2         C3         C4
  默认1                 test       2017-12-26 09:46:20
  3.1阻止对某几列插入
  SQL> create or replace view v_test as select c1,c2,c3 from test;
  View created.
  SQL> insert into V_TEST values ('手输1',null,'不改4');
  1 row created.
  SQL> select * from test;
  C1         C2         C3         C4
  默认1                 test       2017-12-26 09:46:20
  手输1                 不改4      2017-12-26 09:57:36
  SQL> insert into V_TEST values (default,null,'不改4');
  insert into V_TEST values (default,null,'不改4')
  *
  ERROR at line 1:
  ORA-32575: Explicit column default is not supported for modifying views
  3.2复制表定义与结构
  SQL> create table test1 as select * from test where 1=2;
  Table created.
  SQL> select * from test1;
  no rows selected
  SQL> create table test2 as select * from test;
  Table created.
  SQL> select * from test2;
  C1         C2         C3         C4
  默认1                 test       2017-12-26 09:46:20
  手输1                 不改4      2017-12-26 09:57:36
  3.3利用with check option限制数据输入

  SQL>>
  Table>  SQL> create or replace view v_test1 as select c1,c2,c3 from test with check option;
  View created.
  SQL> insert into V_TEST1 values ('test',null,null);
  insert into V_TEST1 values ('test',null,null)
  *
  ERROR at line 1:
  ORA-01400: cannot insert NULL into ("SCOTT"."TEST"."C3")
  3.4多表插入语句
  无条件insert
  SQL> insert all
  2    into test1(c1,c2,c3) values ('1','2','3')
  3    into test2(c1,c2,c3) values ('1','2','3')
  4    into test(c1,c2,c3) values ('1','2','3')
  5  select from test1 ;
  插入次数取决于select 行数
  要一行的话建议用select  from dual;
  有条件insert
  SQL> run
  1  insert all
  2    when job in ('CLERK','SALESMAN') then
  3     into test (c1,c2,c3) values (ENAME,JOB,mgr)
  4    when job='MANAGER' then
  5     into test1 (c1,c2,c3) values (ENAME,JOB,mgr)
  6    else
  7     into test2 (c1,c2,c3) values (ENAME,JOB,mgr)
  8 select from emp
  12 rows created.
  SQL> select * from test
  2  ;
  C1         C2         C3         C4
  默认1                 test       2017-12-26 09:46:20
  手输1                 不改4      2017-12-26 09:57:36
  1          2          3          2017-12-26 10:29:31
  SMITH      CLERK      7902       2017-12-26 10:39:54
  ALLEN      SALESMAN   7698       2017-12-26 10:39:54
  WARD       SALESMAN   7698       2017-12-26 10:39:54
  MARTIN     SALESMAN   7698       2017-12-26 10:39:54
  TURNER     SALESMAN   7698       2017-12-26 10:39:54
  JAMES      CLERK      7698       2017-12-26 10:39:54
  MILLER     CLERK      7782       2017-12-26 10:39:54
  10 rows selected.
  SQL> select * from test1;
  C1         C2         C3         C4
  11         12         13
  JONES      MANAGER    7839
  BLAKE      MANAGER    7839
  CLARK      MANAGER    7839
  SQL> select * from test2;
  C1         C2         C3         C4
  默认1                 test       2017-12-26 09:46:20
  手输1                 不改4      2017-12-26 09:57:36
  21         22         23
  KING       PRESIDENT
  FORD       ANALYST    7566
  SQL> insert first
  2    when job in ('CLERK','SALESMAN') then
  3     into test (c1,c2,c3) values (ENAME,JOB,mgr)
  4    when empno in (7900,7934,7566) then
  5     into test1 (c1,c2,c3) values (ENAME,JOB,mgr)
  6    else
  7     into test2 (c1,c2,c3) values (ENAME,JOB,mgr)
  8  select job,ename,mgr,empno from emp;
  12 rows created.
  SQL> select * from test;
  C1         C2         C3         C4
  SMITH      CLERK      7902       2017-12-26 10:53:18
  ALLEN      SALESMAN   7698       2017-12-26 10:53:18
  WARD       SALESMAN   7698       2017-12-26 10:53:18
  MARTIN     SALESMAN   7698       2017-12-26 10:53:18
  TURNER     SALESMAN   7698       2017-12-26 10:53:18
  JAMES      CLERK      7698       2017-12-26 10:53:18
  MILLER     CLERK      7782       2017-12-26 10:53:18
  7 rows selected.
  SQL> select * from test1;
  C1         C2         C3         C4
  JONES      MANAGER    7839
  SQL> select * from test2;
  C1         C2         C3         C4
  BLAKE      MANAGER    7839
  CLARK      MANAGER    7839
  KING       PRESIDENT
  FORD       ANALYST    7566
  3.5Merge into用法总结
  MERGE INTO table_name alias1
  USING (table|view|sub_query) alias2
  ON (join condition)
  WHEN MATCHED THEN
  UPDATE table_name
  SET col1 = col_val1,
  col2 = col_val2
  WHEN NOT MATCHED THEN
  INSERT (column_list) VALUES (column_values);
  严格意义上讲,”在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数”。
  3.6删除重复记录
  SQL> insert into test values (1,2,3,default)
  2  ;
  1 row created.
  SQL> insert into test values (1,2,3,default);
  1 row created.
  SQL> select * from test;
  C1         C2         C3         C4
  1          2          3          2017-12-26 11:08:14
  1          2          3          2017-12-26 11:08:18
  SQL> select rowid as rid,
  2        c1,
  3        row_number() over(partition by c1 order by c4) as seq
  4  from test
  5  order by 2,3;
  RID                C1                SEQ
  AAASXpAALAAAACuAAA 1                   1
  AAASXpAALAAAACuAAB 1                   2
  SQL> delete
  2    from test
  3   where rowid in (select rid
  4         from (select rowid as rid,
  5                row_number() over(partition by c1 order by c4) as seq
  6               from test)
  7         where seq>1);
  1 row deleted.
  SQL> select * from test;
  C1         C2         C3         C4
  1          2          3          2017-12-26 11:08:14
  SQL> delete
  2     from test a
  3   where exists(select /+hash_sj/ null from test b where b.c1=a.c1 and b.rowid>a.rowid);
  保留最新的 select * from test;
  C1         C2         C3         C4
  1          2          3          2017-12-26 13:32:18
  第四字符串
  4.1 遍历字符串
  SQL> select level from dual  connect by level select "拼音",level,substr("拼音",level,1) from (select 'TTXS' as "拼音" FROM DUAL) connect by level  select q'[g'day mate]' qmarks from dual;

QMARKS
  g'day mate
  SQL> select q'{g'day mate}' qmarks from dual;

QMARKS
  g'day mate
  SQL> select q'

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-623289-1-1.html 上篇帖子: windows server2008 r2 下启用 sqlserver 2008的远程连接 下篇帖子: 用select模块实现的socket server
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表