Oracle-SQL语法

-----------------------------DML语法-----------------------------
1、SELECT查询语句的执行顺序
【⑤确定要显示的数据列】SELECT [DISTINCT] *| 分组列[别名],分组列[别名],分组列[别名]...
【①确定数据来源(行与列的集合)】FROM 表名称 [别名],表名称[别名],....
【②针对数据进行筛选】[WHERE 限定条件]
【③针对筛选的行分组】[GROUP BY 分组字段,分组字段,分组字段,...]
【④针对筛选的行分组进行过滤】[HAVING 分组过滤]
【⑥对选定数据的行与列排序】[ORDER BY 排序字段[ASC|DESC],排序字段[ASC|DESC],...];

2、INSERT增加数据语法
INSERT INTO 表名称[(字段名称,字段名称,...)] VALUES (数据,数据,...);

3、UPDATE修改数据语法
UPDATE 表名称 SET 字段=内容,字段=内容,...[WHERE 更新条件(s)];

4、DELETE删除数据语法
DELETE FROM 表名称 [WHERE 删除条件(s)];

-----------------------------DDL语法-----------------------------
1、事务
①事物的和兴处理命令:COMMIT、ROLLBACK;
②每一个session具备独立的事务,并且在未提交前更新的数据行锁定。

2、ROWNUM----分页操作语法
SELECT *
FROM (
SELECT ROWNUM RN,列,... FROM 表名称
WHERE ROWNUM <= currentPagelineSize) temp
) WHERE temp.rn > (currentPage - 1)
lineSize;

3、表的创建
CREATE TABLE 表名称(
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
...
列名称 类型 [DEFAULT 默认值]
);

4、表的复制
CREATE TABLE 表名称 AS 子查询;

5、表的重命名
RENAME 表名称 TO 新名称;

6、表的删除
DROP TABLE 表名称; --没有真正删除,在回收站
DROP TABLE 表名称 PURGE; --彻底删除

7、闪回技术
FLASHBACK TABLE 表名称 TO BEFORE DROP;
清空回收站 PURGE RECYCLEBIN;

8、修改表结构
①修改表的已有列 ALTER TABLE 表名称 MODIFIY (字段名 数据类型 [DEFAULT 默认值]);
②为表增加列 ALTER TABLE 表名称 ADD (列名称 类型 [DEFAULT 默认值],列名称 类型 [DEFAULT 默认值],...);
③删除表中的列 ALTER TABLE DROP COLUMN 列名称;

9、非空约束 NOT NULL 在创建表的时候在字段声明时加上 NOT NULL

10、唯一约束 UNIQUE NULL不在判断范围之中
CREATE TABLE 表名称(
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
...
列名称 类型 [DEFAULT 默认值],
CONSTRAINT 约束名 UNIQUE(列名)
);

11、主键约束
CREATE TABLE 表名称(
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
...
列名称 类型 [DEFAULT 默认值],
CONSTRAINT 约束名 PRIMARY KEY(列名)
);

12、检查约束 该约束越多查询越慢一般不用
CREATE TABLE 表名称(
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
...
列名称 类型 [DEFAULT 默认值],
CONSTRAINT 约束名 CHECK(列名 检查范围)
);

13、外键约束
CREATE TABLE 表名称(
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
...
列名称 类型 [DEFAULT 默认值],
CONSTRAINT 约束名 FOREIGN KEY(当前表列名) REFERENCES 父表名(列名)
);

级联删除:
CREATE TABLE 表名称(
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
...
列名称 类型 [DEFAULT 默认值],
CONSTRAINT 约束名 FOREIGN KEY(当前表列名) REFERENCES 父表名(列名) ON DELETE CASCADE
);

级联更新:
--主表删除记录,字表记录不删除,把父ID设置为NULL
CREATE TABLE 表名称(
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
列名称 类型 [DEFAULT 默认值],
...
列名称 类型 [DEFAULT 默认值],
CONSTRAINT 约束名 FOREIGN KEY(当前表列名) REFERENCES 父表名(列名) ON DELETE SET NULL
);

14、定义序列 -- 自动增长列,它能创建流水号。Oracle12C之前没有自动增长列。
CREATE SEQUENCE 序列名称
[MAXVALUE 最大值|NOMAXVALUE]
[MINVALUE 最小值|NOMINVALUE]
[INCREMENT BY 步长][START WITH 开始值] --每次增加多少,从哪里开始
[CYCLE|NOCYCLE] --是否为循环序列
[CACHE 缓存个数|NOCACHE]

使用序列:使用伪列
nextval:取得序列下一个内容,每一次调用序列的值都会增长;
currval:表示取得序列的当前内容,每次调用序列不会增长,如果要想使用此伪劣,必须先使用一次nextval伪列;

15、定义视图
CREATE[OR REPLACE] VIEW 视图名称 AS 子查询 [WITH CHECK OPTION|WITH READ ONLY];
为用户创建视图权限
CONN sys/change_on install AS SYSDBA;
GRANT CREATE VIEW TO 用户名;
CONN 用户名/密码;

16、同义词
CREATE [PUBLIC] SYNONYM 同义词名称 FOR 用户名(模式).表名称;
如果要想让一个同义词被所有用户去使用,那么应该定义为 PUBLIC 同义词

17、索引
打开查询追踪器-查看语句执行计划
CONN sys/change_on_install AS SYSDBA;
SET AUTOTRACE ON;

例:
为scott.emp表在sal字段上创建索引
CREATE INDEX emp_sal_ind ON scott.emp(sal);

虽然利用索引可以进行查询的提升,但是需要明确的一个问题所在,索引提升查询的关键在于:那可索引树。
那么如果说现在你的数据表之中,sal字段的内容都在重复改变的时候,那么这棵树将“杀死你”。
树的维护操作是需要花费时间的,如果数据小,那么可以在很短的时间内进行树的生成,但是数据一大
那么就会花费很长时间。

如果要想查询速度快,那么必须使用索引。
如果要想保证更新速度,那么不能使用索引。
所以这个时候最好的做法是牺牲实时性。等于有两个数据库,一个数据库专门给用户查询,另一个数据库
专门个用户更新操作使用。

18、用户管理
用户创建必须有管理员权限,使用sys登录
①sys登录
CONN sys/change_on_install AS SYSDBA;

②创建一个新的用户,名字为dog,密码为:wangwang。
CREATE USER dog IDENTIFIED BY wangwang; --此时该用户还不能连接数据库,因为没有给用户创建session权限

③分配权限 GRANT 权限1,权限2,... TO 用户名;
将创建 SESSION 的权限赋予dog
例:GRANT CREATE SESSION TO dog; --至此用户只有连接数据库的权限,不能创建表、序列等等

在Oracle里面提供有一种角色的概念。所谓的角色指的是包含有若干个权限,那么在Oracle里面主要使用两个角色:
CONNECT(连接权限了解)、RESOURCE(表以及表空间操作)。
所以最简单是操作是把角色分配给用户,而不是一个一个区赋予权限
例:将CONNECT、RESOURCE授予dog
GRANT CONNECT,RESOURCE TO dog;

用户得到了新的权限之后必须重新登录后才可以取得新的权限。
一旦有了用户的问题,那么久会出现用户管理的问题。

修改用户密码,由于用户并不多,所以这种用户的维护就可以由sys进行了。
ALTER USER dog IDENTIFIED BY miaomiao;

让用户的密码过期: ALTER USER dog PASSWORD EXPIRE;

锁定用户: ALTER USER dog ACCOUNT LOCK;

用户解锁: ALTER USER dog ACCOUNT UNLOCK;

可以针对于一个对象下的数据表进行访问的定义:有四种权限: INSERT、UPDATE、DELTET、SELECT

下面将scott.emp表的SELECT、INSERT权限授予dog用户:
GRANT SELECT,INSERT ON scott.emp TO dog;

权限回收:
回收dog用户对scott.emp表的查询、添加权限: REVOKE SELECT,INSERT ON scott.emp FROM dog;

回收其他所授予的权限: REVOKE CONNECT,RESOURCE,CREATE SESSION FROM dog;

删除用户: DROP USER dog CASCADE;

19、数据导出与导入
数据库的冷备份: 指的是数据库要关闭服务,所有的事务都需要提交了。进行备份则需要备份如下的内容:

·控制文件:控制着整个Oracle的实例信息,可以使用“v$controlfile”数据字典找到
·重做日志文件:通过“v$logfile”数据字段找到;
·数据文件:通过“v$datafile”数据字典找到;
·核心配置文件(pfile):使用“SHOW PARAMETER pfile”找到。

数据库的备份操作肯定要由管理员进行。

①、使用sys登录
CONN sys/change_on_install AS SYSDBA;

②、查找控制文件
SELECT * FROM v$controlfile;

③、查找重做日志文件信息
SELECT * FROM v$logfile;

④、找到所有数据文件的信息
SELECT * FROM v$datafile;

⑤、找到pfile文件
SHOW PARAMETER pfile;

⑥、记录好这些文件的路径

⑦、关闭Oracle服务
SHUTDOWN IMMEDIATE

⑧、拷贝出所有的备份文件

⑨、重新启动服务
STARTUP

EXP(导出dmp):

有三种主要的方式(完全、用户、表) 
A、完全:EXP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y 如果要执行完全导出,必须具有特殊的权限 
B、用户模式:EXP SONIC/SONIC    BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC 这样用户SONIC的所有对象被输出到文件中。 
C、表模式:EXP SONIC/SONIC    BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC TABLES=(SONIC) 这样用户SONIC的表SONIC就被导出 

IMP(导入dmp):

具有三种模式(完全、用户、表) 
A、完全:IMP SYSTEM/MANAGER BUFFER=64000 FILE=C:\FULL.DMP FULL=Y
B、用户模式:IMP SONIC/SONIC BUFFER=64000 FILE=C:\SONIC.DMP FROMUSER=SONIC TOUSER=SONIC 这样用户SONIC的所有对象被导入到文件中。必须指定FROMUSER、TOUSER参数,这样才能导入数据。 
C、表模式:IMP SONIC/SONIC    BUFFER=64000 FILE=C:\SONIC.DMP OWNER=SONIC TABLES=(SONIC) 这样用户SONIC的表SONIC就被导入。

导出步骤:

1、执行下面命令    select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 OR num_rows IS NULL
2、将结果集在执行一遍
3、执行EXP语句     exp jygzb/oracle@192.168.20.80:1521/ortv file=D:/jygzb.dmp owner = jygzb

20、oracle计算百分比函数 ratio_to_report(count("primarySystem")) OVER ()

例:select count("primarySystem"), round(ratio_to_report(count("primarySystem")) OVER () ,4)pct_total,"locoType" from XA_JCZB_JT6 group by "locoType";

你可能感兴趣的:(Oracle-SQL语法)