ALTER
TABLE
COMPANY_EMP
ADD
DESCRIPTION VARCHAR2(
200
)
NULL
;
ALTER
TABLE
COMPANY_EMP
DROP
COLUMN
DESCRIPTION;
DROP:移除数据库对象
DROP TABLE COMPANY_EMP;
创建表副本
CREATE TABLE <NEWTABLE> AS SELECT {*|COLUMN(S)} FROM <OLDTABLE> [WHERE <CONDITION>]
create table emp_back as SELECT * FROM emp
create table emp_back as SELECT * FROM emp where 1=2
5.2 创建约束
为什么要创建约束?
为了保证数据的完整性而实现的一套机制,它是数据库服务器强制用户必须遵从的业务逻辑,限制用户可能输入指定范围外的值;
有哪些约束?
非空约束:NOT NULL(该值不能为空)
唯一约束:UNIQUE(整个表相同列中是唯一的)
检查约束:CHECK (对字段执行检查条件)
主键约束:PRIMARY KEY(唯一约束+非空约束)
外键约束:REFERENCES(表间关联的约束,实现数据完整性)
CREATE TABLE TABLE_A
VENDOR_ID NUMBER,
INVOICE_TOTAL NUMBER(9,2) CHECK (INVOICE_TOTAL>0 AND
INVOICE_TOTAL<=5000),
VENDOR_NAME VARCHAR2(50) NOT NULL,
CONSTRAINT VENDORS_PK PRIMARY KEY (VENDOR_ID)
CONSTRAINT VENDOR_NAME_UQ UNIQUE (VENDOR_NAME)
如何查看约束?
SELECT * FROM user_constraints t where t.constraint_name = 'PRIMART_ENPNO';
5.3 修改表
ALTER TABLE 修改表列的4件事
向表中添加的列
修改已经存在的列的类型或数据范围
删除已经存在的列
重命名表列
SELECT * FROM emp;
alter table emp add yang varchar2(20);
alter table emp drop column yang;
alter table emp rename column yang to yang_new;
alter table emp modify yang_new varchar(40) check(length(yang_new)<30);
ALTER TABLE 修改约束的3件事
向表中添加一个新的约束
移除表中现有的约束
启用或禁用约束
ALTER TABLE EMP DROP CONSTRAINT PRIMART_ENPNO;
ALTER TABLE EMP ADD CONSTRAINT UQ_CONSTR UNIQUE (ENAME);
ALTER TABLE EMP ADD CONSTRAINT PRIMART_ENPNO PRIMARY KEY(EMPNO);
移除数据表
DROP TABLE EMP;
5.4 索引
索引是建立在数据库中的一列或多列用来加速访问表中数据的辅助对象;
加快检索数据的速度
保证数据唯一性
加快表与表之间的连接
减少查询分组和排序时间
5.5 视图
6. 查询数据表
查询相关关键字:
DISTINCT :该列去重
AS : 改列别名 (当使用字符串为别名时,必须使用双引号标注字符串)
NULL : (IS NULL 或 IS NOT NULL)
|| : 字符串连接符
范围操作符
BETWEEN-AND : 比较的值是否在两个值之间
IN :比较的值是否在任意的值列表中间
LIKE:通配符类匹配一个字符模板
%:表示0个或多个字符
_:表示一个字符
SELECT * FROM (
SELECT t.*,rownum rn FROM emp t) a where a.rn>1 and a.rn<4
ROWID伪列:记录物理位置的一个ID,常用于 更新数据、删除完全重复的两条记录
DELETE FROM EMP_BACK WHERE ROWID NOT IN (SELECT MIN(ROWID) FROM EMP_BACK GROUP BY EMPNO)
SELECT T.*,ROWID FROM EMP;
多表连接查询
SELECT * FROM test6 t1,test_61 t2 where t1.id = t2.id;
SELECT * FROM test6 t1,test_61 t2 where t1.id = t2.id(+);
SELECT * FROM TEST6 T1 LEFT JOIN TEST_61 T2 ON T1.ID = T2.ID;
SELECT * FROM test6 t1,test_61 t2 where t1.id(+) = t2.id;
SELECT * FROM TEST6 T1 RIGHT JOIN TEST_61 T2 ON T1.ID = T2.ID;
SELECT * FROM TEST6 T1 FULL JOIN TEST_61 T2 ON T1.ID = T2.ID;
相关子查询
内查询依赖于外部查询的数据,外查询执行一次,内查询就执行一次
非相关子查询
内查询只执行一次,并将执行结果返回给外查询
单行单列:
比较运算符:IN、>、<、=、!=、>=、<=
SELECT *
FROM test6
where id = (SELECT t.id FROM test_61 t where t.e_name = 'yang');
ANY、ALL
SELECT *
FROM test6
where id >all
(SELECT t.id FROM test_61 t where t.e_name in ('de','yang'));
INSERT INTO TEST6(ENAME,ID,NAME,AGE)VALUES('laowang',6,'老王',78);
INSERT INTO TEST6_BACK SELECT 11,'老八',19,0,'laoba',sysdate FROM DUAL;
INSERT INTO TEST6_BACK SELECT * FROM TEST6 T WHERE T.ID > 4;
INSERT {FIRST|ALL}
[WHEN CONDITION THEN] INTO TABLE [VALUES(...)]
[WHEN CONDITION THEN] INTO TABLE [VALUES(...)]
ELSE INTO TABLE [VALUES(...)]
SUBQUERY;
INSERT FIRST
WHEN MOD(ID,2)=0
INTO TEST_01
WHEN MOD(ID,2)<>0
INTO TEST_02
INTO TEST_03
SELECT * FROM TEST6;
UPDATE TEST6 SET AGE=17 WHERE ID = 2;
update (SELECT * FROM TEST6 WHERE ID = 2) set age =77;
MERGE合并表行
对比两个表,针对条件判断执行两种选择
MERGE INTO TEST_01 C
USING TEST6 E
ON (C.ID = E.ID)
WHEN MATCHED THEN
UPDATE
SET C.NAME = E.NAME,C.AGE=E.AGE,C.SEX=E.SEX,
C.ENAME=E.ENAME,C.ADDTIME=E.ADDTIME
WHEN NOT MATCHED THEN
INSERT VALUES(
E.ID,E.NAME,E.AGE,E.SEX,
E.ENAME,E.ADDTIME)
如果一次性清除表中数据且不需要撤销,使用TRUNCATE语句
delete from test6 where id = 8;
delete from (SELECT * FROM test6 t where t.id =8);
删除多行记录
DELETE FROM TEST6_BACK X WHERE EXISTS(SELECT 1 FROM TEST6 T2 WHERE T2.ID = X.ID )
TRUNCATE清除表数据
TRUNCATE数据DDL数据定义语言,跟CREATE TABEL等语句一样,不具有撤销功能
速度比DELETE效率高
不会激活表的删除触发器
有主外键关系的主表,使用TRUNCATE前禁用该约束
因属于DDL语言,因此不能被PL/SQL语句块调用,必须使用动态语句调用方式 : EXECUTE IMMEDIATE V_SQL;
TRUNCATE TABLE TEST6_BACK;
提交COMMIT:当执行DML语言时,隐式事务激活,被DML(insert、update、delete)操作的数据被放在数据段中,此时必须显示提交事务COMMIT,物理数据库才会更改
回滚ROLLBACK:当执行DML语言时,旧数据保存到回退表空间(UNDO TABLESPACE)中,执行ROLLBACK后,Oracle 会将回退表空间中的数据写到数据段中
主要用途是创建一个主键的值,它独立于表存储和生成
CREATE SEQUENCE SEQUENCE_NAME
[INCREMENT BY N]
[START WITH N]
[{MAXVALUE N | NOMAXVALUE}]
[{MINVALUE N | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE N | NOCACHE}];
NEXTVAL : 返回下一个可用序列值(SEQUENCE_NAME.NEXTVAL)
CURRVAL:获得当前的序列值(SEQUENCE_NAME.CURRVAL)
8. 记录与集合
DECLARE
TYPE INX_TABLE IS TABLE OF VARCHAR2(10) -- 定义INX_TABLE 为索引表名
INDEX BY pls_integer; -- pls_integer 为使用整数为索引
V_Y INX_TABLE; -- 定义索引表变量
BEGIN
FOR I IN 1.. 10 LOOP
V_Y(I):=
END LOOP;
FOR Y IN 1.. 10 LOOP
DBMS_OUTPUT.put_line(V_Y(Y));
END LOOP;
END;
-- 实例,字符串索引
DECLARE
A1 VARCHAR2(10);
A2 VARCHAR2(10);
TYPE INX_TABLE IS TABLE OF VARCHAR2(20)
INDEX BY varchar2(20);
V_Y INX_TABLE;
BEGIN
FOR I IN 1.. 10 LOOP
A1 :=
V_Y(A1) :=
--DBMS_OUTPUT.put_line(V_Y(A1));
END LOOP;
FOR Y IN 1.. 10 LOOP
A2 :=
DBMS_OUTPUT.put_line(V_Y(A2));
END LOOP;
END;
\