1、数据操纵语言DML
包含INSERT/UPDATE/DELETE/MERGE
INSERT:
一、使用INSERT时需要注意一些常见的错误
1、对于NOT NULL列缺少强制措施的值:比如不允许NOT NULL的列中指定NULL值
2、重复值违反唯一性约束:列中已存在唯一值,又输入新的唯一值
3、违反外键约束:输入值不匹配CHECK约束表达式的值
4、数据类型不匹配:比如数字配型的值赋予了字符串类型
5、值的宽度超过了列的限制:比如字段接受20长度的,但是输入为40长度的
二、使用子查询插入多行数据(条件:字段列中列的数目和他们的数据类型必须与子查询中的数目及数据类型相匹配)
INSERT INTO TABLE1 SELECT * FROM TABLE2
三、使用INSERT插入多表数据
INSERT {FIRST | ALL}
[WHEN condition THEN] INTO table [VALUES(...)]
[WHEN condition THEN] INTO table [VALUES(...)]
...
ELSE INTO table [VALUES(...)]
subquery
FIRST:如果第一个WHEN子句的值为True,Oracle服务器对于给定的行执行相应的INTO子句,并且跳过后面的WHEN子句
ALL:Oracle服务器通过相应的WHEN条件过滤每一个插入子句,确定是否执行这个插入子句
ELSE:如果条件都不满足,则执行ELSE中插入的子句
subquery:要进行多表插入的子查询
UPDATE:
一、使用子查询更新记录
1、更新一列数据: UPDATE TABLE SET COLUMN = (SELECT COLUMNS FROM TABLE2) WHERE condition
--注意:这种写法子查询只能返回一个结果,如果返回多个会报错
2、更新多列数据:
UPDATE TABLE (SET COLUMN1,COLUMN2) = (SELECT COLUMN1,COLUMN2 FROM TABLE2 WHERE condition) WHERE condition
MERGE:
一、MERGE提供多个表之间合并的能力,当数据存在是执行UPDATE,不存在则执行INSERT
MERGE命令组合INSERT和UPDATE命令,需要对目标表有INSERT、SELECT和UPDARE权限
语法:
MERGE INTO table_name
USING (table | view | sub_query)
ON (join condition)
WHEN MATCHED THEN
UPDATE SET
column1=col_1,
column2=col_2,
column3_col_3
WHEN NOT MATCHED THEN
INSERT (column1,column2,column3) VALUES (value1,value2,value3);
插入所有的行到另外一个具有现存记录的表,如果要插入的行的键匹配已经存在,则更新已经存在的行而不是插入新行
可以通过desc+表名方法来查询表的架构定义
DELETE:
一、删除单行记录,必须理解如下几个要点
1、DELETE语句一次只能删除整行记录,不能删除某个字段
2、与INSERT、UPDATE一样,删除一个表中的记录可能会导致与其他表的引用完整性,对当前数据要有这个概念
3、DELETE语句只会删除记录,不会删除表,删除表是DROP
4、如果一次性清除表中数据,并且不需要撤销删除 ,可以使用TRUNCATE一次性对表数据进行清除
二、语法:DELETE FROM table [WHERE condition]
三、使用子查询删除记录
DELETE FROM table WHERE col = (SELECT column FROM table2 WHERE condition(条件使用等号只能返回一个数据))
DELETE FROM table WHERE col IN (SELECT column FROM table2 WHERE condition(条件使用IN、EXISTS可以返回多个数据))
四、TRUNCATE
使用TRUNCATE清除数据会清除当前表所有行的数据,并且释放该表所使用的存储空间
TRUNCATE TABLE table_name
TRUNCATE与DELETE语句相比,TRUNCATE命令速度要快一些,原因:
1、TRUNCATE语句不会激活表的删除触发器
2、TRUNCATE语句属于数据定义语言DDL语句,不会产生撤销信息
3、如果表是主外键关系的主表,则无法清除表的内容,必须在执行TRUNCATE语句之前禁用该约束
2、管理数据库表
CREATE INDEX 索引名称 ON 表名(字段名);
CREATE INDEX ENTER_DATE_INDEX ON EMPLOYEER(ENTER_DATE);