2020-09-14
SELECT LAST_NAME ,SALARY FROM EMPLOYEES WHERE SALARY BETWEEN 2500 AND 3500;
SELECT LAST_NAME ,SALARY,MANAGER_ID FROM EMPLOYEES WHERE MANAGER_ID IN (‘100’,‘101’);
SELECT LAST_NAME FROM EMPLOYEES WHERE LAST_NAME LIKE ‘S%’;
SELECT LAST_NAME ,SALARY FROM EMPLOYEES WHERE MANAGER_ID IS NULL;
SELECT LAST_NAME ,SALARY FROM EMPLOYEES WHERE DEPARTMENT_ID=‘100’ ORDER BY 2;
SELECT LAST_NAME ,SALARY FROM EMPLOYEES
WHERE DEPARTMENT_ID=‘100’
ORDER BY 2
FETCH NEXT 2 ROWS ONLY
FETCH FIRST 3 ROWS ONLY
FETCH FIRST 3 ROWS WITH TIES
OFFSET 3 ROWS --显示结果集第三行之后的数据,不含第三行
OFFSET 3 ROWS FETCH FIRST 3 ROWS ONLY
;
SELECT TO_CHAR(TO_DATE(TRUNC(SYSDATE),‘YYYY-MM-DD HH24:MI:SS’)) FROM DUAL;
SELECT TO_CHAR(TO_DATE(ROUND(SYSDATE),‘YYYY-MM-DD HH24:MI:SS’)) FROM DUAL;
INTERSECT UNION UNION ALL EXCEPT MINUS
CREATE GLOBAL TEMPORARY TABLE T1 (
A CHAR(4)
) ON COMMIT PRESERVE ROWS;
INSERT INTO T1 VALUES(‘A’);
INSERT INTO T1 VALUES(‘A’);
INSERT INTO T1 VALUES(‘B’);
INSERT INTO T1 VALUES(‘B’);
INSERT INTO T1 VALUES(‘C’);
CREATE GLOBAL TEMPORARY TABLE T2 (
A CHAR(4)
) ON COMMIT PRESERVE ROWS;
INSERT INTO T2 VALUES(‘B’);
INSERT INTO T2 VALUES(‘C’);
INSERT INTO T2 VALUES(‘D’);
INSERT INTO T2 VALUES(‘E’);
----除了unionall,其他的集合操作都会进行distinct处理
select * from t1 union select * from t2 ; --去重后合并
select * from t1 union all select * from t2 ; --全量合并
select * from t1 intersect select * from t2 ; --去重后相交
select * from t1 minus select * from t2 ; --去重后相减 (TD中是Except)
----数值转换
–日期操作 fm去除 数据中的 如
select last_name ,to_char(hire_date,‘fmDD Month YYYY’) as mo from employees;
select last_name ,to_char(hire_date,‘DD Month YYYY’) as mo from employees;
select last_name ,to_char(hire_date,‘YYYY-MM-DD’) as mo from employees;–>2020-07-12
select last_name ,to_char(hire_date,‘YYYY-fmMM-DD’) as mo from employees; -->2020-7-12
select to_char(60000,‘9,999.00’) number from dual;
----空值函数
SELECT NVL(1,NULL) FROM DUAL ; -->1
SELECT NVL(NULL,2) FROM DUAL ; -->2
SELECT NVL2(‘null’,‘Y’,‘N’) FROM DUAL ; -->N 非空值输出第1个表达式
SELECT NVL2(NULL,‘Y’,‘N’) FROM DUAL ; -->N 空值输出第2个表达式
SELECT NULLIF(‘Y’,‘Y’) FROM DUAL; --NULL 当两个表达式相等时输出空值
SELECT NULLIF(‘Y’,‘N’) FROM DUAL; --Y 两个表达式不等时输出expr1
SELECT COALESCE(‘A’,‘B’,‘C’) FROM DUAL ; —> A 返回第一个非空
SELECT COALESCE(NULL,‘B’,‘C’) FROM DUAL ; —> B
CREATE TABLE TEST2 (
id char(1)
,VAL1 INT
,VAL2 INT
);
INSERT INTO TEST2 VALUES('a',1,1);
INSERT INTO TEST2 VALUES('b',2,NULL);
select sum(VAL1) from test2; -->3
select sum(VAL2) from test2; -->1 聚合函数忽略null
select count(VAL2) from test2; -->1
select id,val1+val2 from test2;-->null 值得加减运算会返回null
----case表达式
case expr1 when val1 then ‘1’ when val2 then ‘2’ else ‘3’;
case when expr1=val1 then ‘1’ when expr1=val2 then ‘2’ else ‘3’;
----decode函数
SELECT LAST_NAME,SALARY,
DECODE(TRUNC(SALARY/2000,0),0,0.00,1,0.09,0.45) TAX --返回第一匹配的值,否则返回最后一个
FROM EMPLOYEES WHERE DEPARTMENT_ID=‘80’;
----分组函数
--group by语句不确保汇总结果的顺序(同一个group by语句返回结果集的顺序可能不同)
-- 使用聚合函数时不一定非要由group by 语句: SELECT MAX(VAL) FROM T1;
SELECT AVG(SALARY) FROM EMPLOYEES; -->平均值
SELECT COUNT(DISTINCT SALARY) FROM EMPLOYEES; -->计数
SELECT SUM(SALARY) FROM EMPLOYEES; -->汇总
SELECT MIN(SALARY) FROM EMPLOYEES; -->最小值
SELECT MAX(SALARY) FROM EMPLOYEES; -->最大值
SELECT DEPARTMENT_ID,count(SALARY) FROM EMPLOYEES GROUP BY DEPARTMENT_ID;
SELECT DEPARTMENT_ID,FIRST_NAME FROM EMPLOYEES where DEPARTMENT_ID IN ('60','90');
--SELECT ID2 AS ID3 ,SUM(ID) FROM TEST1 GROUP BY ID3 ; 不能使用列的别名进行分组
--you canot use a column alias in then group by clause
--SELECT DEPARTMENT_ID,AVG(SALARY) FROM EMPLOYEES GROUP BY 1 ; 这种写法在oracle中不允许
----列传行函数
SELECT
DEPARTMENT_ID
,LISTAGG(FIRST_NAME,’,’) WITHIN GROUP(ORDER BY SALARY) AS LSNAME
FROM EMPLOYEES
where DEPARTMENT_ID IN (‘60’,‘90’)
GROUP BY DEPARTMENT_ID
PIVOT–行转列函数
STDDEV --偏差
VARIANCE --方差
----集合操作
CREATE TABLE A (
A VARCHAR(20)
,B VARCHAR(20)
);
INSERT INTO A VALUES (‘A1’,‘B1’);
INSERT INTO A VALUES (‘A1’,‘B1’);
INSERT INTO A VALUES (‘A2’,‘B2’);
INSERT INTO A VALUES (‘A3’,‘B3’);
INSERT INTO A VALUES (‘A5’,‘B6’);
INSERT INTO A VALUES (‘A5’,‘B6’);
CREATE TABLE B (
A VARCHAR(20)
,B VARCHAR(20)
);
INSERT INTO B VALUES ('A1','B1');
INSERT INTO B VALUES ('A2','B2');
INSERT INTO B VALUES ('A3','B3');
INSERT INTO B VALUES ('A4','B4');
--并集,去重
SELECT * FROM A
UNION
SELECT * FROM B ;
--并集,不排重
SELECT * FROM A
UNION ALL
SELECT * FROM B ;
--交集,去重
SELECT * FROM A
INTERSECT
SELECT * FROM B ;
--排他,去重
SELECT * FROM A
MINUS
SELECT * FROM B ;
----DML语句
CREATE TABLE SUN_EMP (
EMP_ID VARCHAR(2)
,EMP_NAME VARCHAR(20)
,DEP_ID VARCHAR(2)
,HIRE_DATE DATE
);
INSERT INTO SUN_EMP VALUES('01','anni','10',sysdate);
INSERT INTO SUN_EMP(EMP_ID,DEP_ID) VALUES ('02','10');
INSERT INTO SUN_EMP VALUES ('03','ruizi','30',to_date('2020-01-01','yyyy-mm-dd'));
INSERT INTO SUN_EMP VALUES ('04','ruizi','30',to_date('2020-01-02','yyyy-mm-dd'));
INSERT INTO SUN_EMP SELECT * FROM SUN_EMP;
UPDATE SUN_EMP SET EMP_NAME='gailun' WHERE EMP_ID='02';
DELETE FROM SUN_EMP WHERE ROWID NOT IN (SELECT MIN(rowid) from SUN_EMP group by emp_id);
--delete from DML语句,删除数据时逻辑删除,标记数据为不可用。可以rollback
--truncate table DDL语句,彻底删除表中的数据,释放存储空间。 不可以rollback;删除速度更快。
--delete 和truncate产生的结果是不一样的。
----事务控制
commit
–显式提交:需要commit命令
–隐式提交:当时用DDL语句时,自动提交了,如: create,drop ;
rollback
savepoint
–保存点,可以恢复到这个时间点的数据,commit之后保存点自动释放。
–可以用于恢复数据
–实例:savepoint sp_name; dml… ; rollback to sp_name;
FOR UPDATE
--普通的select一般不会对数据加锁,但可以通过for update语句加锁数据。
SELECT * FROM SUN_EMP WHERE EMP_ID='01' FOR UPDATE;
--上述语句会对检索出来的数据进行加锁,知道会话commit位置,在此期间
--其他会话对加锁数据的任何操作,都会进入等待状态。
----数据对象
table :表
view :视图
sequence :序列
index :索引
synonym :同义词
----数据类型
VARCHAR2 :变长4000bytes
VARCHAR
CHAR :定长2000bytes
NUMBER(N,M) :数值 ,n总长度,m精度
long :
raw and long raw :存储二进制数据
CLOB
BLOB :图片,音频视频
BFILE : 主要要是存放在数据服务器上的,操作系统存储或者大型存储器上划拨的空间
ROWID : 行号
DATE
timestamp :时间戳
INTERVAL YEAR TO MONTH --描述事件间隔
INTERVAL DAY TO SECOND --描述事件间隔
----时间测试:
ALTER SESSION SET NLS_DATE_FORMAT=‘YYYY-MM-DD HH24:MI:SS’;
DROP TABLE TEST1;
CREATE TABLE TEST1 (
TIME1 TIMESTAMP,
TIME2 TIMESTAMP WITH TIME ZONE,
TIME3 TIMESTAMP WITH LOCAL TIME ZONE,
TIME4 INTERVAL YEAR(3) TO MONTH
);
INSERT INTO TEST1 VALUES(
current_date
,SYSDATE
,SYSDATE
,interval '123' year(3)
);
SELECT to_char(sysdate+time4,'yyyy-mm-dd hh34:mi:ss') from test1;
----时间间隔
--时间精度位要设置合理
SELECT INTERVAL '30' DAY(3) FROM DUAL; --间隔三天
SELECT CURRENT_DATE+(INTERVAL '3' HOUR) FROM DUAL; --三个小时后
SELECT CURRENT_DATE+(INTERVAL '0 5' DAY TO HOUR) FROM DUAL; --0天5小时之后
SELECT CURRENT_DATE+(INTERVAL '1:30:30' HOUR TO SECOND) FROM DUAL; --1小时30分30秒之后
SELECT CAST(CURRENT_DATE AS VARCHAR(10) FORMAT 'YYYY-MM-DD') FROM DUAL;
SELECT FROM DUAL ;
SELECT
CEIL((TO_DATE('2020-01-01 10:00:00','YYYY-MM-DD HH24:MI:SS')-TO_DATE('2020-01-01 10:01:00','YYYY-MM-DD HH24:MI:SS'))*24*60*60) --间隔到秒
AS INTER
FROM DUAL;
SELECT EXCEPT(HOUR FROM SYSDATE) FROM DUAL; --HOUR 获取小时 YEAR 获取年 MINUS 获取分
----约束
NOT NULL
UNIQUE
PRIMARY KEY
FOREIGN KEY :指定一个或多个列组合为外键,建立与同一个表或不同表中的主键唯一关键字之间的关系。
CHECK
--列级约束
CREATE TABLE TEST1 (
DEPT_ID NUMBER PRIMARY KEY
,DEPT_NAME VARCHAR2(60) UNIQUE
);
INSERT INTO TEST1 VALUES(10,'D1');
INSERT INTO TEST1 VALUES(20,'D2');
INSERT INTO TEST1 VALUES(40,'D4');
--表级约束:定义一个或多个列,可以定义任何约束,not null除外。
CREATE TABLE TEST2(
ID NUMBER
,NAME VARCHAR(60)
,DEPT_ID NUMBER
,CONSTRAINT T1_PK PRIMARY KEY (ID)
,CONSTRAINT T1_UK UNIQUE (NAME)
,CONSTRAINT T1_DEPT FOREIGN KEY (DEPT_ID) REFERENCES TEST1(DEPT_ID) --外键约束
);
INSERT INTO TEST2 VALUES(1,'A',10);
INSERT INTO TEST2 VALUES(2,'B',30); --违反外键
INSERT INTO TEST2 VALUES(2,'B',20);
INSERT INTO TEST2 VALUES(2,'B',20);--违反了主键、unique约束
INSERT INTO TEST2 VALUES(3,'C',20);
DELETE FROM TEST2 WHERE ID=3;--成功删除
DELETE FROM TEST1 WHERE DEPT_ID=10; --被引用的外键,无法删除
DELETE FROM TEST1 WHERE DEPT_ID=40;--未被引用,删除成功
DROP TABLE TEST1 PURGE;
DROP TABLE TEST2 PURGE;
--check 约束
-- 用于定义各行都需要满足的条件
-- 不许引用currval nextbal leve 和 rownum 伪列
-- 不允许调用sysdate uid user 和 pserenv函数
-- 不许涉及其他行的查询
CREATE TABLE TEST1 (
ID NUMBER
,NAME VARCHAR(20)
,SALARY NUMBER(18,2)
,CONSTRAINT T_C_ID CHECK (ID>10)
);
INSERT INTO TEST1 VALUES ( 9,'ZS',100); --插入失败
INSERT INTO TEST1 VALUES (12,'ZS',100); --插入成功
--约束操作
-- 已存在数据,不满足新增约束的,该约束无法添加,新加入数据,不满足已有约束的,数据不能插入。
-- 存在外键关联的主键无法被简单删除,可以通过 CASCADE 语句来删除
ALTER TABLE TEST1 ADD CONSTRAINT T1_PK PRIMARY KEY (ID,NAME);--添加约束,删除约束,修改约束
ALTER TABLE TEST1 DROP CONSTRAINT T1_PK; --删除约束
ALTER TABLE TEST1 DROP CONSTRAINT T1_PK CASCADE; --清空联系啊后删除
ALTER TABLE TEST1 DISABLE CONSTRAINT T1_PK CASCADE; --禁用,有主外键关系时需要使用cascade
ALTER TABLE TEST1 ENABLE CONSTRAINT T1_PK; --启用
--【删除】相关级联约束
--如果没有相关级联约束,可以通过alte drop语句删除表的列
ALTER TABLE TEST1 DROP (ID) CASCADE CONSTRAINTS ; --删除列和列上的主键外键约束,之后再对表进行DML操作就可以顺利进行。
--查看相关约束
SELECT TABLE_NAME,CONSTRAINT_NAME ,CONSTRAINT_TYPE FROM USER_CONSTRAINTS WHERE TABLE_NAME ='TEST1';
----DDL 语句
--建表 : CREATE TABLE 权限,一个可以使用的表空间。
CREATE TABLE SUN_EMPLOYEES (
EMPLOYEE_ID NUMBER(6)
,LAST_NAME VARCHAR2(25) NOT NULL
,EMAIL VARCHAR2(25) UNIQUE
,SALARY NUMBER(8,2)
,COMMISSION_PCT NUMBER(2,2)
,HIRE_DATE DATE DEFAULT SYSDATE
,CONSTRAINT EMP_PK PRIMARY KEY (EMPLOYEE_ID)
);
INSERT INTO SUN_EMPLOYEES VALUES ( '01' ,'LIMING' ,'email..' ,1234 ,0.1 ,sysdate);
INSERT INTO SUN_EMPLOYEES VALUES ( '02' ,'LIMING' ,'email22' ,1234 ,0.2 );
--表备注
COMMENT ON TABLE SUN_EMPLOYEES IS '员工表';
COMMENT ON COLUMN SUN_EMPLOYEES.EMPLOYEE_ID IS '员工编号';
--查看
SELECT TABLE_NAME,COMMENTS FROM USER_TAB_COMMENTS WHERE TABLE_NAME='SUN_EMPLOYEES';--查看表注释
SELECT TABLE_NAME,COMMENTS FROM USER_COL_COMMENTS WHERE TABLE_NAME='SUN_EMPLOYEES' AND COLUMN_NAME='EMPLOYEE_ID'; --查看表注释
SELECT DBMS_METADATA.GET_DDL('TABLE','SUN_EMPLOYEES') FROM DUAL;--查看表的DDL语句
SELECT DBMS_METADATA.GET_DDL('VIEW','SUN_EMPLOYEES') FROM DUAL;--查看视图
----ALTER语句 : ALTER TABLE T_NAME ADD|MODIFY|DROP [COLUMN] …
–对列的默认值修改,直接影响到后续的数据insert操作。
–删除列时,尽量只每次只删除一个列;一旦被删除就不能恢复;
–可以使用set unused设置列不可用
ALTER TABLE SUN_EMPLOYEES ADD DEPT_ID VARCHAR2(2); --增
ALTER TABLE SUN_EMPLOYEES DROP COLUMN COMMISSION_PCT;--删
ALTER TABLE SUN_EMPLOYEES MODIFY DEPT_ID VARCHAR(4);--改:只有为空时才能更改类型
--ALTER TABLE SUN_EMPLOYEES SET UNUSED (HIRE_DATE) ; --标记为不可用
--ALTER TABLE SUN_EMPLOYEES DROP UNUSED COLUMNS HIRE_DATE;
ALTER TABLE SUN_EMPLOYEES RENAME TO SUN_EMPLOYEES2 ;
ALTER TABLE SUN_EMPLOYEES READ ONLY;
ALTER TABLE SUN_EMPLOYEES READ WRITE;
DESCRIBE SUN_EMPLOYEES; --查
TRUNCATE TABLE --清除表数据,不记录日志,无法rollback,降低高水位线。
--CTAS创建表
CREATE TABLE TEST2 AS SELECT * FROM TEST1 WHERE 1=0;
----删除表
DROP TABLE SUN_EMPLOYEES; --不是把表删除了,只是改个名放入回收站里。(用于闪回)
DROP TABLE SUN_employees PURGE; --彻底删除 select tname from tab;删除前后查看
PURGE TABLE SUN_EMPLOYEES; --从回收站清空表
PURGE RECYCLEBIN;–彻底清空回收站
----默认值测试
CREATE TABLE TEST1 (
ID NUMBER
,NAME VARCHAR(20)
,HDATE DATE DEFAULT SYSDATE
);
insert into test1 values (1,'user1',TO_DATE('2020-08-23','YYYY-MM-DD'));
insert into test1 values (1,'user1',null);
insert into test1 (id,name) values (1,'user2');
commit;
—数据库中表的分类:
用户表:用户创建和维护的表,记录了用户的信息。
数据字典表:由oracle server创建和维护的表和集合。
--尝用的表
USER_XXX 用户拥有对象的信息
ALL_XXX 用户客户访问对象的信息
DBA_XXX 这些表或者视图都是受限的,只能由DBA可以访问
V$_XXX 动态性能视图,反应了数据库内存,性能和锁的相关信息
SHOW USER 查看当前用户
SELECT TABLE_NAME FROM USER_TABLES;
SELECT TNAME FROM TAB;
SELECT STAT
----同义词 synonym
--我们可以把synonym和视图理解为同种功能
----视图
--可以对视图做DML语句操作,但对应的表中数据也会被删除
--视图被定义语句,会被存放在user_views
--视图的底层表可以被删除,底层表删除之后视图仍然保留。底层被被重建之后,视图才能继续正常使用。
--视图就是一个查数规则
CREATE VIEW VIEW_TEST1 AS SELECT * FROM TEST1; --创建视图
DROP VIEW VIEW_TEST1; --删除视图
DESC VIEW_TEST1; --查看视图格式
--视图中增加约束
--增加约束语句之后,对where之后的字段修改会被禁止(仅限于等值:如果是>或其他仍可被修改)
CREATE OR REPLACE VIEW VTEST1 (EMPLOYEE_ID,SALARY) AS
SELECT EMPLOYEE_ID,SALARY FROM TEST1
WHERE SALARY =3000
WITH CHECK OPTION CONSTRAINT T_CK ;
--只读语句
WITH READ ONLY;
--内联视图
--可以在SQL中使用的带别名的子查询
--内联视图不是数据对象
SELECT A.LAST_NAME ,A.SALARY,A.DEPARTMENT_ID,B.MAXSAL
FROM EMPLOYESS A ,
(SELECT DEPARTMENT_ID ,MAX(SQLARY) MAXSAL FROM EMPLOYEES) B
AND A.SALARY < B.MAXSAL
;
----序列 sequence
--生成唯一整数值得结构; 只有一个会话能读取下一个值,强制递增。
--通常用于创建主键
--使用缓存到内存中的方式,虽然提高了效率,但存在造成序列断链的风险;
--系统视图: SELECT * FROM USER_SEQUENCES;
--不可以在SQL文中使用nextval和currval;
-- 带有distinct、group、having、order by、delete、update、create tale、alter table 的语句;
--每一次SEQ.NEXTVAL的访问都会使序列,增长。 (包括select)
CREATE SEQUENCE DEPT_ID_SEQ
INCREMENT BY NUMBER --步长,默认是1
START WITH NUMBER --起始点
[MAXVALUE NUMBER | NOMAXVALUE] --最大值
[MINVALUE NUMBER | NOMINVALUE] --最小值
[CYCLE | NOCYCLE ] --是否循环:达到最大或最小值限制之后,默认是抛出一个错误。
[CACHE NUMBER | NOCACHE] --为了提高性能,Oracle预先生成序列值(默认20个),给使用者分发; 可以提供性能,但依旧有资源竞争。
--系统关闭后,会丢失20个序列值。
[ORDER | NOORDER] --只与群集数据库有关,Oracle强制集群中的实例协同递增序列
;
--序列使用
--对于持久递增序列来说,commit并不会对其有影响。事务是否提交与序列递增无关,序列是一个全局可见变量。
CREATE SEQUENCE SEQ_TEST1 START WITH 10;
--会话A(不提交)
DROP TABLE TEST1 PURGE ;
CREATE TABLE TEST1 AS (ID NVUMBER , val NUMBER ,NAME VARCHAR2(10));
INSERT INTO TEST1 VALUES (SEQ_TEST1.NEXTVAL,10,'zhangsan'); --序列值为10
ROLLBACK;
INSERT INTO TEST1 VALUES (SEQ_TEST1.NEXTVAL,11,'zhangsan'); --序列值为:11
INSERT INTO TEST1 VALUES (SEQ_TEST1.CURRVAL,11,'zhangsan'); --当前值为:11
--会话B
SELECT SEQ_TEST1.CURRVAL FROM DUAL;--查看序列当前值
INSERT INTO TEST1 VALUES (SEQ_TEST1.NEXTVAL,12,'zhangsan'); --序列值为:12
--会话C
CREATE TABLE TEST2 AS SELECT SEQ_TEST1.NEXTVAL , ID FROM TEST1; --序列会正常递增
SELECT SEQ_TEST1.NEXTVAL FROM DUAL; --也会造成序列增长
--序列增长
--每次访问nextval时都会使得序列递增。
--当前会话中调用 nextval 则当前会话的 currval会更新;其他会话中的currval会保留当前会后上一次调用nextval之后的值;
--虽然currval值未发生变化,但是序列已经增长。
SELECT SEQ_TEST1.NEXTVAL FROM DUAL; --会导致序列增长
SELECT SEQ_TEST1.NEXTVAL FROM TEST1; --如果表中友3行数据,曾序列增加三个步长。
--会话a
SELECT SEQ_TEST1.CURRVAL FROM DUAL; --10
SELECT SEQ_TEST1.NEXTVAL FROM DUAL; --11
SELECT SEQ_TEST1.CURRVAL FROM DUAL; --11
--会话b
SELECT SEQ_TEST1.CURRVAL FROM DUAL; --10
SELECT SEQ_TEST1.NEXTVAL FROM DUAL; --12
SELECT SEQ_TEST1.CURRVAL FROM DUAL; --12
--序列修改
--必须是序列的拥有者才能修改序列,实行alter权限
--修改只会影响已后的序列号
--ALTER命令不能设置start with ,如果要从不同的序号出重新开始,则必须删除序列后重建。
ALTER SEQUENCE SEQ_TEST1
[INCREMENT BY NUMBER]
[START WITH NUMBER]
[MAXVALE/MINVALE NUMEBR | NOMAXVALUE/MINVALUE]
[CYCLE|NOCYCLE ]
[CACLE|NOCACHE]
[ORDER|NOORDER]
;
--测试
SELECT SEQ_TEST1.CURRVAL FROM DUAL; --当前值
SELECT SEQ_TEST1.NEXTVAL FROM DUAL; --下一个值
ALTER SEQUENCE SEQ_TEST1 INCREMENT BY 10 ; --修改步长为10
SELECT SEQ_TEST1.CURRVAL FROM DUAL; --当前值
SELECT SEQ_TEST1.NEXTVAL FROM DUAL; --下一个值
--删除序列
DROP SEQUENCE SEQ_TEST1;
----索引
--注意:具体应不应该创建索引,在哪里创建,要根据业务情景和具体的执行计划来决定。
-- 并不一定创建完索引查询就会变快,有时候会适得其反,加重系统运行负担
-- (如:频繁更新的列,添加索引后,数据库需要额外去频繁维护索引)
--索引使用
1、索引的作用就是是为了加快数据检索,他可以隐式创建或显示创建,
2、索引是一个独立的对象,由Oracle自动使用和维护,
--可以使用索引
1、列包含较大范围的值(大量重复值,不能算大范围)
2、列包含大量的值
3、在where语句中或关联条件中常用的列或多个列,适合创建索引
4、表很大,语句检索的数据范围在表数据2~4%。 (大范围的全表取值,更适合全表扫描)
--不建议使用索引
1、表较小
2、查询中不常用的列
3、语句检索的数据量超过表的2~4%。
4、表中数据更新频繁,导致索引列也会被更新,系统负担较大,不建议使用。
5、被索引的列,被用于表达式的一部分被引用。(如:计算,或者函数操作)
--索引操作
CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN_NAME); --创建
CREATE INDEX INDEX_UPER_NAME ON TABLE_NAME(UPPER(COLUMN_NAME)); --基于函数的索引
DROP INDEX INDEX_NAME;
DESC USER_INDEXES;
DESC USER_IND_COLUMNS;
--查询索引
SELECT
IC.INDEX_NAME
,IC.COLUMN_NAME
,IC.COLUMN_POSITION COL_POS
,IX.UNIQUENESS
FROM USER_INDEXES IX ,USER_IND_COLUMNS IC
WHERE IC.INDEX_NAME=IX.INDEX_NAME
AND IC.TABLE_NAME=IX.TABLE_NAME
;
本文地址:https://blog.csdn.net/weixin_38360072/article/details/108571516
下一篇: 师傅说我很适合做这个行业
推荐阅读