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

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐