SQL基础-- 数据处理(DML、RETURNING、MERGE INTO)

--=================================================

--SQL基础--> 数据处理(DMLRETURNINGMERGE INTO)

--=================================================

 

一、常用的DML语句及事物处理

    向表中插入数据(INSERT)

    更新表中数据(UPDATE)

    从表中删除数据(DELETE)

    将表中数据和并(MERGE)

    控制事务(TRANSACTION)

 

二、DML 可以在下列条件下执行:

    向表中插入数据

    修改现存数据

    删除现存数据

    事务是由完成若干项工作的DML语句组成的。

 

三、插入数据

    INSERT 语句语法:

    INSERT INTO table [(column [, column...])]

    VALUES (value [, value...]);

 

    使用这种语法一次只能向表中插入一条数据。

    为每一列添加一个新值。

    按列的默认顺序列出各个列的值。

    INSERT 子句中随意列出列名和他们的值。

    字符和日期型数据应包含在单引号中。

 

    --查看emp表的表结构

       SQL> DESC emp;

        Name                                                  Null?    Type

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

        EMPNO                                                 NOT NULL NUMBER(4)

        ENAME                                                          VARCHAR2(30)

        JOB                                                            VARCHAR2(9)

        MGR                                                            NUMBER(4)

        HIREDATE                                                       DATE

        SALARY                                                         NUMBER(8,2)

        DEPTNO                                                         NUMBER(2)

 

    1.向表中插入空值

       隐式方式: 在列名表中省略该列的值。

           SQL> INSERT INTO emp(empno,ename,job,salary)    --列出部分列名

             2  VALUES(1234,'Frank','saleman',8000);

 

           1 row created.

 

           SQL> SELECT  * FROM emp WHERE ename='Frank';

 

               EMPNO ENAME                          JOB              MGR HIREDATE      SALARY     DEPTNO

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

                1234 Frank                          saleman                              8000

 

       显示方式: VALUES 子句中指定空值NULL

           注意此处省略了列列表,当列的列表被省略时,则values关键字中应当为所有的字段列提供列值

           SQL> INSERT INTO emp VALUES(100,'Jack','manager',null,null,20000,10);

 

           1 row created.

 

    2.插入指定的值

       SYSDATE 记录当前系统的日期和时间。

           SQL> INSERT into EMP(empno,ename,job,hiredate,salary)

             2  VALUES(1235,'Tony','boy',sysdate,7000);

 

           1 row created.

 

           SQL> ALTER SESSION SET nls_date_format= 'yyyy-mm-dd hh24:mi:ss';

 

           Session altered.

 

           SQL> SELECT * FROM emp WHERE ename = 'Tony';

 

               EMPNO ENAME           JOB              MGR HIREDATE                SALARY     DEPTNO

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

                1235 Tony            boy                  2010-06-28 13:48:59       7000

 

       插入特定的日期值

           SQL> INSERT INTO emp

             2  VALUES(1236,'Ben','IT',null,TO_DATE('JUN 28 2010','MON DD YYYY'),3000,20);

   

    3.在列中使用单引号和双引号

       --单引号的使用

           SQL> INSERT INTO emp VALUES

             2  (1238,'Dan','Malley''K','',sysdate,2900,20);

 

           1 row created.   

          

       --双引号的使用 

           SQL> INSERT INTO emp VALUES

             2  (1239,'Dane','A "Big" L','',sysdate,2900,20);

 

           1 row created.

 

           SQL> SELECT * FROM emp WHERE ename LIKE 'Dan%';

 

               EMPNO ENAME              JOB              MGR HIREDATE                SALARY     DEPTNO

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

                1238 Dan                Malley'K             2010-06-28 14:04:35       2900         20

                1239 Dane               A "Big" L            2010-06-28 14:07:12       2900         20

               

    4.从其它表中拷贝数据(利用子查询向表中插入数据)

       INSERT 语句中加入子查询。

       不必书写VALUES 子句。

       子查询中的值列表应与INSERT 子句中的列名对应

       --克隆表结构   

           SQL> CREATE TABLE test AS SELECT * FROM scott.emp WHERE 0 = 1;

 

           Table created.

 

       --使用select 子句插入新值

           SQL> INSERT INTO test SELECT * FROM scott.emp;

 

           21 rows created.

 

       --使用select 子句插入部分列值

           SQL> INSERT INTO test(empno,ename,job,salary)

             2  SELECT empno,ename,job,salary

             3  FROM scott.emp

             4  WHERE ename LIKE 'Dan%';

 

           2 rows created.

 

    5.利用替代变量向表中插入数据

           SQL> INSERT INTO test(empno,ename,job,salary)

             2  VALUES(&empno,'&ename','&job',&salary);

           Enter value for empno: 1240

           Enter value for ename: Andy

           Enter value for job: Singer

           Enter value for salary: 3600

           old   2: VALUES(&empno,'&ename','&job',&salary)

           new   2: VALUES(1240,'Andy','Singer',3600)

 

           1 row created.

                 

四、更新数据(UPDATE)

    语法:

       UPDATE table

       SET column = value [, column = value, ...]

       [WHERE  condition];

   

    可以一次更新多条数据。

    使用WHERE 子句指定需要更新的数据,如果省略WHERE子句,则表中的所有数据都将被更新。

   

    1.直接更新

       SQL> UPDATE emp SET salary = salary + 100 WHERE ename = 'SCOTT';

 

       1 row updated.

 

    2.UPDATE语句中使用子查询

       SQL> UPDATE emp SET salary = 

         2      (SELECT salary FROM emp WHERE ename = 'SCOTT')

         3  WHERE empno = 7839;

 

       1 row updated.

 

    3.使用多列子查询来修改记录:

       SQL> UPDATE emp SET(job,salary)

         2      = (SELECT job,salary FROM emp WHERE ename = 'SCOTT')

         3  WHERE ename = 'Jack';

 

       1 row updated.

 

五、删除数据

    使用DELETE 语句从表中删除数据。

    DELETE [FROM] table [WHERE condition];

 

    1.使用WHERE 子句指定删除的记录,如果省略WHERE子句,则表中的全部数据将被删除。

       SQL> DELETE FROM emp WHERE empno = 1234;

 

       1 row deleted.

 

    2.DELETE 中使用子查询

       DELETE 中使用子查询,使删除基于另一个表中的数据。

       SQL> DELETE FROM emp

         2  WHERE deptno =

         3      (SELECT deptno FROM scott.dept WHERE dname = 'ACCOUNTING');

 

       4 rows deleted.

 

六、在DML语句中使用WITH CHECK OPTION

    子查询可以用来指定DML语句的表和列

    WITH CHECK OPTION 关键字可以防止更改不在子查询中的行

   

    --deptno列不在select列表中,故不能被更新

       SQL> INSERT INTO   

         2      (SELECT empno,ename,job,mgr,salary FROM emp

         3       WHERE deptno = 20 WITH CHECK OPTION)

         4  VALUES(1250,'Smith','Clerk',7902,3000);

           (SELECT empno,ename,job,mgr,salary FROM emp

                                              *

       ERROR at line 2:

       ORA-01402: view WITH CHECK OPTION where-clause violation

   

七、TRUNCATE TABLE 截断表

    删除所有数据,保留表结构

    TRUNCATE TABLE语句不能回滚

        SQL> TURNCATE TABLE emp;

   

八、使用默认值

    显式默认值

    使用DEFAULT 关键字表示默认值

    可以使用显示默认值,控制默认值的使用

    显示默认值可以在INSERT UPDATE 语句中使用

           SQL> CREATE TABLE tb  

             2  (

             3      orderid INT PRIMARY KEY,

             4      status VARCHAR2(20) DEFAULT 'Delivery' NOT NULL,

             5      last_update DATE DEFAULT sysdate

             6  );

 

           Table created.

 

           --自动使用默认值

           SQL> INSERT INTO tb(orderid) SELECT 10 FROM DUAL;

 

           1 row created.

 

           --指定新值来覆盖默认值

           SQL> INSERT INTO tb SELECT 20, 'No Delivery','28-MAY-10' FROM DUAL;

 

           1 row created.

 

           --使用default关键字来设置为默认值

           SQL> SELECT * FROM tb;

 

              ORDERID STATUS               LAST_UPDA

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

                  10 Delivery             28-JUN-10

                  20 No Delivery          28-MAY-10

 

           SQL> UPDATE tb SET status = DEFAULT WHERE orderid = 20;

 

           1 row updated.

 

           SQL> SELECT * FROM tb;

 

              ORDERID STATUS               LAST_UPDA

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

                  10 Delivery             28-JUN-10

                  20 Delivery             28-MAY-10

 

九、RETURNING 子句

    使用RETURNING子句返回聚合函数的结果集             

       SQL> VARIABLE avg_salary NUMBER

       SQL> UPDATE emp SET salary = salary + 100

         2  RETURNING AVG(salary) INTO : avg_salary;

 

       16 rows updated.

 

       SQL> PRINT avg_salary;

 

       AVG_SALARY

       ----------

        2554.6875

 

十、MERGE INTO   

    将一个表中的行合并到另一个表中

    MERGE INTO 语法:

       MERGE INTO table_name table_alias

       USING (table|view|sub_query) alias

       ON (join condition)

       WHEN MATCHED THEN

           UPDATE SET

           col1 = col_val1,

           col2 = col2_val

       WHEN NOT MATCHED THEN

           INSERT (column_list)

           VALUES (column_values);

      

    --创建演示环境

       SQL> CONN hr/hr;

       Connected.

    --hr.job_history提取唯一的数据并复制到新表job_hs

       SQL> CREATE TABLE job_hs AS

         2  SELECT employee_id,start_date,end_date,job_id,department_id  FROM job_history jh

         3  WHERE end_date =

         4      (SELECT MAX(end_date) FROM job_history WHERE employee_id = jh.employee_id);

 

       Table created.

 

       SQL> SELECT * FROM job_hs ORDER BY employee_id;

 

       EMPLOYEE_ID START_DAT END_DATE  JOB_ID     DEPARTMENT_ID

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

              101 28-OCT-93 15-MAR-97 AC_MGR               110

              102 13-JAN-93 24-JUL-98 IT_PROG               60

              114 24-MAR-98 31-DEC-99 ST_CLERK              50

              122 01-JAN-99 31-DEC-99 ST_CLERK              50

              176 01-JAN-99 31-DEC-99 SA_MAN                80

              200 01-JUL-94 31-DEC-98 AC_ACCOUNT            90

              201 17-FEB-96 19-DEC-99 MK_REP                20

    --hr.employees中的记录当job_hs中存在时,则更新相关项,否则插入到job_hs表中      

       SQL> MERGE INTO job_hs h

         2  USING employees e

         3  ON (h.employee_id = e.employee_id)

         4  WHEN MATCHED THEN

         5  UPDATE

         6      SET

         7         start_date = sysdate,

         8         end_date = sysdate + 100,

         9         job_id = e.job_id,

        10         department_id = e.department_id

        11  WHEN NOT MATCHED THEN

        12      INSERT (h.employee_id,h.start_date,h.end_date,h.job_id,h.department_id)

        13      VALUES (e.employee_id,e.hire_date,sysdate,e.job_id,e.department_id);

        

        SQL> SELECT COUNT(*) FROM job_hs;

 

         COUNT(*)

       ----------

              107

             

    MERGE INTO 使用注意事项

        MERGE INTO子句应指明需要合并的目的表

       USING ... ON 子句用于表之间的连接

       WHEN MATCHED THEN 子句指明当条件满足时则对目的表执行何种操作(此处是UPDATE操作)

       WHEN NOT MATCHED THEN 子句指明当条件不满足时对目的表执行何种操作(此处是INSERT操作)

 

十一、更多

Oracle 用户、对象权限、系统权限

 SQL 基础--> ROLLUPCUBE运算符实现数据汇总

 SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)

 SQL 基础--> 视图(CREATE VIEW)

 Oracle 常用目录结构(10g)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大型网站系统架构实践(四)http层负载均衡之haproxy实践篇(一)

方案 上篇文章讲到了负载均衡的相关理论知识,这篇文章我打算讲讲实践方法以及实践中遇到的问题 方案:haproxy http层负载均衡 安装一个haproxy服务,两个web服务 haproxy:192.168.1.227:80 web1 http://192.168.1.226:8081/login w…

[Python]使用 lambda 函数

From:http://woodpecker.org.cn/diveintopython/power_of_introspection/lambda_functions.html 4.7. 使用 lambda 函数 4.7.1. 真实世界中的 lambda 函数 Python 支持一种有趣的语法,它允许你快速定义单行的最小函数。这些叫做 lambda 的函数,是从 Li…

mysql修改子分区_创建MySQL子分区方法

创建MySQL子分区方法发布时间:2020-05-26 15:11:15来源:51CTO阅读:216作者:三月本文主要给大家介绍创建MySQL子分区方法,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还…

const char * array[]和char * const array[]

int main() {char abc[] "abc";char def[] "def";char * const array[] {"abc", "def"};char * const array2[] {abc, def};const char * array3[3] {"abc", "def"};//char * const array3[2]; //error,定义…

日志处理(二) 日志组件logback的介绍及配置使用方法(转)

本文转自:http://www.cnblogs.com/yuanermen/archive/2012/02/13/2348942.html http://www.cnblogs.com/yuanermen/archive/2012/02/13/2349609.html 一、logback的介绍 Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logba…

TNS-03505 oracle用户可以tnsping通,普通用户tnsping报错

From: http://zxf261.blog.51cto.com/701797/750308 今天碰到了一个有趣的问题 oracle用户可以tnsping通&#xff0c;普通用户tnsping报错 用普通用户tnsping数据库的时候报 TNS-03505: Failed to resolve name 而用oracle用户tnsping数据库的时候却可以ping通 <34 linux-si…

python package安装包_安装Python包(第三方库)

检查python版本如果“提示 python 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。”&#xff0c;可能有2种原因1、进入的目录不对 (切换目录后再查看)C:\Users\zhangXXXX>pythonpython 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。C:…

Windows2003+SQL2000的集群安装手册

1 集群服务器安装及配置 步骤节点1节点2存储注释安装配置系统上电上电断电检查所有共享总线上的存储设备是否都已经断电&#xff0c;给各节点上电。1.1 安装Windows Server 2003操作系统 在服务器1和服务器2分别独立安装Windows Server 2003操作系统。安装要开始安装过程&#…

wpf全局异常

在App.xaml文件中 添加DispatcherUnhandledExceptionEventArgs 新增对应事件 转载于:https://www.cnblogs.com/ChenRihe/p/4421049.html

shell执行oracle存储过程,获得存储过程返回值

From: http://www.flatws.cn/article/program/oracle/2011-06-27/32316.html 同事做一个小的etl调度&#xff0c;需要将存储过程执行情况进行返回并控制其后续依赖是否执行&#xff0c;本人只是将调用执行存储过程的shell脚本中存储过程输出参数返回&#xff0c;并没有写具体的…

一群人围成一圈从123报数,如果报到3就退出该圈中,直到最后一个人留下来!...

package com.pb.demo1;import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** 一群人围成一圈从123报数&#xff0c;如果报到3就退出该圈中&#xff0c;直到最后一个人留下来&a…

动画基础01

在silverlight动画中&#xff0c;动画类型被分为两类&#xff1a;From/To/By&#xff08;线性插值动画&#xff08;Linear Interpolation&#xff09;和关键帧动画 &#xff08;Key-frame Animation&#xff09;。 1.From/To/By 动画&#xff0c;也称为线性插值动画&#xff08…

async中series的实现 javascript构件

//同步流程 var seriesfunction(arr){function async(i){arr[i](function(){if(1i<arr.length){async(1i)}})}async(0) } //demo var back1function(callback){setTimeout(function(){cc.log(21)callback()},1000) }series([back1,back1,back1])转载于:https://www.cnblogs.…

Bash中执行存储过程或普通的SQL命令

演示&#xff1a; 在bash中执行一个存储过程和一个普通的SQL语句 0. 前提条件&#xff1a; 数据库&#xff1a;Oracle10g 表&#xff1a;oracle自带的emp表&#xff0c;默认有数据如下&#xff1a; 1. 在bash中执行oracle存储过程 首先&#xff0c;在oracle中建立一个存储过…

用c语言调用动态库

动态加载是在程序运行时用dlopen,dlsym函数进行的。静态加载发生在程序装载时。1.1 用c语言静态方式调用动态库libsthc.so&#xff1a;/** ctest.c* Testing program for libsthc.so library //测试程序为在c语言中调用libsthc.so库* in c languange* */#include "libsth…