Oracle 基础

SQL分类

DML(Data Mannipulation Language)数据操纵语言:查询、操纵数据表资料行
    SELECT : 检索数据库表或视图数据 
    INSERT :  将数据行新增至数据库表或视图中
    UPDATE : 修改表或视图中现有的数据行
    DELETE : 删除表或视图中现有的数据行
    注意:DML语句不会自动提交事务!

DDL(Data Definition Language)数据定义语言:建立、修改、删除数据库中数据表对象
    CREATE TABLE : 创建表 
    ALTER TABLE : 修改表
    DROP TABLE : 删除表
    注意:DLL语句会自动提交事务!
	所以:DML语句事务提交之前可以回滚,DDL语句不能回滚事务

DCL(Data Control Language)数据控制语言:用于执行权限授予与收回操作
    GRANT : 给用户或角色授予权限
    REVOKE : 收回用户或角色的所有权限
    
    1.授权
    GRANT <权限列表> to <user_name>;
    2.收回权限
    REVOKE <权限列表> from <user_name>
    Oracle 的权限列表
    connect 连接
    resource 资源
    unlimited tablespace 无限表空间
    dba 管理员
    session 会话    

TCL(Transactional Control Language)事物控制语言:维护数据的一致性
    COMMIT : 提交已经进行的数据库改变
    ROLLBACK : 回滚已经进行的数据改变
    SAVEPOINT : 设置保存点,用于部分数据改变的取消

虚拟表dualOracle中的dual表是一个单行单列的虚拟表。Oracle的SELECT语法的限制为 SELECT * | [column1 [AS alias1], column2 [AS alias2]] FROM table,所以没有表名就没有办法查询,而时间日期并不存放在任何表中,于是这个dual虚拟表的概念就被引入了。

--虚表
select * from dual; 
SELECT ABS(100),ABS(-100),ABS('100') FROM DUAL;
select sysdate from dual;  

序列语法

最大值: https://www.cnblogs.com/CandiceW/p/10062413.html

CREATE SEQUENCE <sequencen_name>
INCREMENT BY n
START WITH n
[MAXVALUE n][MINVALUE n]
[CYCLE|NOCYCLE]
[CACHE n|NOCACHE];

INCREMENT BY n --表示序列每次增长的幅度;默认值为1.
START WITH n --表示序列开始时的序列号。默认值为1.
MAXVALUE n --表示序列可以生成的最大值(升序).
MINVALUE n --表示序列可以生成的最小值(降序).
CYCLE --表示序列到达最大值后,在重新开始生成序列.默认值为 NOCYCLE。
CACHE --允许更快的生成序列.

ALTER SEQUENCE <sequencen_name>
INCREMENT BY n
START WITH n
[MAXVALUE n][MINVALUE n]
[CYCLE|NOCYCLE]
[CACHE n|NOCACHE];

类似mssql 的自增id

  1. 序列刚建立后序列的CURRVAL值为NULL,所以不能直接使用。否则报错“SQL 错误 [8002] [72000]: ORA-08002: 序列 SE_1.CURRVAL 尚未在此会话中定义”

可以先初始化序列:

方法:select <sequence_name>.nextval from dual;

示例:select se_1.nextval from dual;

之后就可以使用CURRVAL属性了

当前值:select <sequence_name>.currval from dual;

下一个值:select <sequence_name>.nextval from dual;

  1. 不能直接修改START WITH值,比如 alter sequence se_1 start with 1,会报错:SQL 错误 [2283] [42000]: ORA-02283: 无法变更启动序列号
--创建基本序列从1开始递增
CREATE SEQUENCE quence;
--查询序列
SELECT quence.nextval FROM dual;
SELECT quence.currval FROM dual;
-- 前面可以加上数据库 SELECT dbname.quence.currval FROM dual;
--删除序列
DROP SEQUENCE quence;


其他属性
-- Create sequence 
create sequence test
minvalue 1           --最小值
maxvalue 9999    --最大值
start with 10         --开始值,默认是1
increment by 1;    --增量值1

--创建序列
create sequence my_seq increment by 1 start with 1 nomaxvalue nocycle cache 20;

--表使用序列,数据库是先拿序列的下一个id,然后插入数据,如果插入数据失败,序列会更新
insert into 表名 values(序列名.nextval,列1值,列2值, ...);


曲线救国,修改启动号

-- 创建序列
create sequence se_1
increment by 1
start with 100
maxvalue 999999
cycle;

-- 初始化序列,返回100
select se_1.nextval from dual;
-- 步长-99
alter sequence se_1 increment by -99;
-- 将当前值更新为1
select se_1.nextval from dual;
-- 更新步长为1
alter sequence se_1 increment by 1;

DDLCREATE TABLE基本创建

CREATE TABLE imx_file
( 
    imx01 VARCHAR2(60),
    imx02 VARCHAR2(10),
    imx03 SMALLINT,
    imx04 DATE,
    imx05 NUMBER(6)
)

现有数据来创建表

#从查询表中字段创建表
CREATE TABLE … AS SELECT

#复制表和数据
CREATE TABLE imx_temp AS SELECT * FROM imx_file

#复制表结构
CREATE TABLE imx_temp AS  SELECT * FROM imx_file WHERE 1=0

#从几个表中选取记录来创建    
CREATE TABLE imx_temp AS 
    SELECT imx01,imd02 FROM imx_file,imd_file 
    WHERE imx01=imd01 

ALTER TABLE

1.向表中添加新字段
ALTER TABLE <table_name> ADD (字段1 类型 [NOT NULL],字段2 类型 [NOT NULL].... );
	ALTER TABLE imx_file add imx11 varchar2(10);

2.修改表中字段
ALTER TABLE <table_name> modify(字段1 类型,字段2 类型.... );
	ALTER TABLE imx_file modify imx11 varchar2(20);
    ALTER TABLE imx_file rename column imx1 to imx2; 
    ALTER TABLE imx_temp modiy imx11 null/not null;

3 .删除表中字段
ALTER TABLE <table_name> drop(字段1,字段2.... );
	ALTER TABLE imx_file drop column imx11;

4 .修改表的名称
RENAME <table_name> to <new table_name>;

5 .对已经存在的表添加约束
ALTER TABLE <table_name> ADD CONSTRAINT <constraint_name> 约束类型 (针对的字段名);
示例:
Alter table emp add constraint S_F Foreign key (deptno) references dept(deptno); 

6 .对表里的约束禁用;
ALTER TABLE <table_name> DISABLE CONSTRAINT <constraint_name>;

7 .对表里的约束重新启用;
ALTER TABLE <table_name> ENABLE CONSTRAINT <constraint_name>;

8 .删除表中约束
ALTER TABLE <table_name> DROP CONSTRAINT <constraint_name>;
示例:
ALTER TABLE emp drop CONSTRAINT <Primary key>;

DROP TABLE

截断表的结果是将表中数据全部删除,和使用DELETE语句的效果相同,两者的区别在与截断操作不记录Redo Log信息,所以更快,但操作无法恢复,所以在程序撰写过程中,一般对于临时表使用截断语句

DROP TABLE imx_temp;
TRUNCATE TABLE imx_temp; --截断表

DESC TABLE

desc 表名称  不能在sql查询窗口使用

创建同义词

CREATE SYNONYM <synonym_name> for <tablename/viewname>
同义词即是给表或视图取一个别名。
示例:
create synonym mm for emp; 
DROP SYNONYMmm ;

DMLINSERT

插入多条记录注意oracle不能像mysql一样直接插入多条数据 values(),()

--方法一:INSERT ALL INTO
INSERT ALL
  INTO sale(MONTH,sell) VALUES('200001',10000)
  INTO sale(MONTH,sell) VALUES('200002',10001)
select 1 from dual;

--方法二:从子查询中插入数据 insert列的数据个数必须和subQuery子查询的列的个数及数据类型完全匹配
INSERT INTO table_name1(column_name1,column_name2,...)
select column_name1,column_name2...FROM table_name2;

插入自增序列

--创建序列
create sequence quence;
--
insert into table(id) values(quence.NEXTVAL)

SELECT

NULL

默认情况下,升序排列时它在最后,降序排列时它在首位。

WHERE XXX IS NOT NULL;--IS NULL  

如果希望NULL值数据在首位:ORDER BY XXX NULLS FIRSET|(LAST);

字符串连接符

||

SELECT 'A'||'B' FROM dual;

ROWID

返回数据唯一id值

ROWNUM

mssql :top 1,mysql:limit 1

返回行号,一般都会外面套一层select

SELECT  * FROM ACCOUNT WHERE ROWNUM=1

--先将查询排序做为1个结果集,再从这个子查询的结果集里面再取rownum=1的数据,取得到才是按排序后的第一条数据  
SELECT * FROM   
  (SELECT t_salary.* FROM t_salary  
    WHERE slip='201308'  
  ORDER BY slip ASC,item ASC  
  )  
 WHERE rownum = 1  

分页查询

利用rownum

SELECT *
FROM
    (
        SELECT t.*, rownum rn
        FROM
            (
                SELECT * FROM TABLE ORDER BY COLUMN ASC -- 分组
            ) t
    )
WHERE
    rn > (currentPage-1)*pageSize
AND rn <= currentPage*pageSize;

ANY,SOME,ALL

https://www.cnblogs.com/feiquan/p/8654171.html

intersect交集

交集(结果为前五条数据)

SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=5 
INTERSECT 
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=8; 

MINUS差集

--下面结果为空,第一个查询的5条记录减去第二个查询的记录
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=5 
MINUS 
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=8; 

--下面返回3条记录
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=8
MINUS 
SELECT PERSON_NAME FROM PERSON WHERE ROWNUM <=5; 

UPDATE

update from

oracle不支持两表关联更新没update from的语法

image

https://blog.csdn.net/liangmengbk/article/details/103886792

 UPDATE PERSON P
   SET (UP_D, UP_TYPE) =
   (
    SELECT M.YYYYMMDD,M.MOB_KIND  FROM MOBILIZE_PER M where  M.corp_no='2931'
       and M.MOBI_NO ='YD211031004' AND M.CORP_NO = P.CORP_NO AND M.PNL_NO =P.PNL_NO 
   ) 
WHERE EXISTS 
(
    SELECT * FROM MOBILIZE_PER M WHERE M.corp_no='2931' and M.MOBI_NO ='YD211031004'
    AND M.CORP_NO = P.CORP_NO AND M.PNL_NO =P.PNL_NO 
);

DELETE

语法:

DELETE FROM [WHERE ]

注意事项:

如果有外键关联,则删除数据之前,需先删除外键关联数据

delete from gem_file where gem01 = '2BSB';  --where还可以用子查询作为condition  

delete 与 truncate 应用区别:

1、对于删除整个表的所有数据时,delete并不会释放表所占用的空间

2、如果用户确定是 删除 整表的所有数据,那么使用 truncate table 速度更快truncate 不可恢复表

delete from gem_file;

truncate table gem_file;

posted @ 2026-08-30 18:52  清哥的码农生活  阅读(3)  评论(0)    收藏  举报