Oracle进阶(一)基础知识

目录

1.ORACLE数据库简介

2.sqlplus和sqldeveloper

3.术语

4.数据库对象

5.约束类型

6.关系型数据库

7.运算符

8.伪列ROWID和ROWNUM

9.SQL常用语法

10.SQL进阶语法

1.ORACLE数据库简介

Oracle数据库是一种文件集合(包括数据文件、临时文件、日志文件和控制文件)。
ORACLE数据库是一种网络上的数据库,支持多用户,支持服务器/客户端部署。
ORACLE服务器由ORACLE数据库和ORACLE实例两部分组成,实例指的是操作数据库的一些进程。
操作ORACLE的一般过程:启动数据库服务实例、挂载数据库、打开数据库、关闭数据库、卸载数据库、关闭实例。

2.sqlplus和sqldeveloper

sqlplus是Oracle11g自带的一个客户端黑屏界面工具。

sqldeveloper是Oracle公司出品的一个免费非开源的集成开发环境。

使用客户端sqlplus工具进入与退出orcl数据库

① 以超级管管理员角色进入
c:/>sqlplus / as sysdba
sql>exit
② 以普通用户进入
c:/>sqlplus scott/tiger
sql>exit

3.术语

3.1 数据操作语言(DML)
设计操作语句的增,删,改,合并

3.2 事务处理语言(TPL)
3.2.1 事务
也称工作单元,是由一个或多个SQL语句所组成的操作序列,这些SQL语句作为一个完整的工作单元,要么全部执行成功,要么全部执行失败。在数据库中,通过事务来保证数据的一致性。

3.2.2 事务组成
–在数据库中,事务由一组相关的DML或SELECT语句,加上一个TPL语句(COMMIT、ROLLBACK)或一个DDL语句(CREATE、ALTER、DROP、TRUNCATE等)或一个DCL(GRANT、REVOKE)语句。

3.2.3 事务特征
原子性(Atomicity)
•事务就像“原子”一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况。
一致性(Consistency)
•一旦事务完成,不管是成功的,还是失败的,整个系统处于数据一致的状态。
隔离性(Isolation)
•一个事务的执行不会被另一个事务所干扰。比如两个人同时从一个账户从取钱,通过事务的隔离性确保账户余额的正确性。
持久性(Durability)
•也称为永久性,指事务一旦提交,对数据的改变就是永久的,不可以再被回滚。

3.3 事务结束
提交(COMMIT):使用COMMIT命令实现,以成功的方式结束事务,组成事务的DML语句操作全部生效。
回滚(ROLLBACK):使用ROLLBACK命令实现,以失败的方式结束事务,组成事务的DML语句操作全部被取消。

3.4 事务开启
事务自动开启于上一个事务结束后,执行的第一个DML语句。

3.5 提交或回滚前数据状态
–数据变化前的状态可以被恢复;
–当前会话可以使用SELECT语句来验证DML操作后的结果;
–其它会话不能查看由当前用户的DML操作结果;
–受影响记录被锁定,也就是其它用户不能改变受影响记录中的数据;

3.6 提交后数据状态
提交(COMMIT) 后的数据状态
–在数据库中数据变化成为永久性的,先前的数据状态永久性的消失;
–所有用户/会话都可以查询到提交COMMIT后的结果;
–锁定的记录被释放,可以有效地被其他用户操作;
–所有的存储节点被清除;

3.7 回滚(ROLLBACK)后的数据状态
–先前的数据状态被恢复;
–锁定的记录被释放;
–所有的存储节点被清除;

3.8 数据定义语言(DDL)

由CREATE、ALTER与DROP三个语法所组成。

4.数据库对象

数据库对象:是数据库的组成部分,有表、约束、索引、视图、序列、同义词、触发器、存储过程、函数等。

约束:表是用来存放用户数据的对象,由行和列组成,列就是字段,行就是表中的记录。
表:是一种保证数据完整性的规则。约束设置在单个字段或者多个字段组合上,写入这些字段的行数据必须要符合约束的规则。
索引:构建于表的单字段或者字段组合上,用于加速对表中数据的查询。
视图:虚表,是一个命名的查询,用于改变基表数据的显示,简化查询。访问方式与表相同,同样可使用查询语句。
序列:产生顺序的不重复数字串,被作为主键约束值的参照。
同义词:数据库对象的别名。

5.约束类型

NOT NULL:非空约束
UNIQUE:不能重复
CHECK:检查性约束
PRIMARY KEY: 主键约束 每个表只能创建一个主键约束。主键列唯一且不能为空
FOREIGN LEY :外键约束

6.关系型数据库

(1)数据模型的是三个层次
概念模型,逻辑模型,物理模型
(2)关系模型的组成
1)关系数据结构
就是一张由列和行组成的二维数据表
2)关系操作集合
选择,投影,连接,增加,删除,修改
3)关系完整性约束
实体完整性,参照完整性,用户自定义的完整性

7.运算符

1)+,-,*,/ :优先级与数学运算一样
2)null :是一种无效的,为赋值的,未知的或不可用的值,不同于零和空格
任何包含空值的算术表达式运算后的结果都是空值 (可以用NVL来进行计算)

分类

符号

释义

示例

算术运算符 + n := 1 + 1;
- n := 2 - 1;
* n := 2 * 3;
/ n := 6 / 2;
mod(,) 取模,取余 n : = mod(3,2)
** 乘方 10**2 =100
关系运算符 = 等于 n = 1
<>或!=或~= 不等于 n != 1
< 小于 n < 1
> 大于 n > 1
<= 小于等于 n <= 1
>= 大于等于 n >= 1
比较运算符 LIKE 是否满足匹配 ‘YIERSHANREN’ like ‘%Y’返回true
BETWEEN 是否处于一个范围中(包括左右边界) 2 between 1 and 3 返回true
IN 是否处于一个集合中 ‘x’ in (‘x’,’y’) 返回true
IS NULL 判断变量是否为空 n:=3,n is null,返回false
逻辑运算符 AND 逻辑与 m=3 and n is null
OR 逻辑或 m=3 or n is null
NOT 逻辑非 not n is null
其它 := 赋值 n := 0;
.. 范围 1..3,即1至3范围
|| 字符串连接 ‘yuan’||’jun’

8.伪列ROWID和ROWNUM

1) 伪列
在Oracle的表的使用过程中,实际表中还有一些附加的列,称为伪列。伪列就像表中的列一样,但是在表中并不存储。伪列只能查询,不能进行增删改操作

2) ROWID
rowid在创建记录时生成且不变,是物理位置的唯一标识,直接指向硬件上的存储位置(用作去重)

id是逻辑上的唯一标识,所以rowid查找速度要快于id,是目前最快的定位一条记录的方式。


--ROWID删除重复数据,相同数据只保留一条.

	DELETE FROM 表名 别名
	 WHERE ROWID NOT IN (SELECT MIN(ROWID) FROM 表名 别名 GROUP BY 列名);
	 
--查看D_DEPT的ROWID的值,它在数据插入的时候已经存储

SELECT ROWID,D.* FROM D_DEPT D

--举例:每个事业部查询一条课信息
--方案: 按照每个事业部分组,找到相应的唯一值,比如LN_ID或者ROWID。
SELECT *
	FROM D_LESSON
	WHERE LN_ID IN (SELECT MIN(LN_ID) FROM D_LESSON GROUP BY DT_DID);
  
SELECT *
	  FROM D_LESSON
	 WHERE ROWID IN (SELECT MIN(ROWID) FROM D_LESSON GROUP BY DT_DID);

Oracle进阶(一)基础知识_第1张图片

3) ROWNUM
rownum是个伪数列(默认隐藏的数列),查询的时候除非特别指定,否则不会显示(用作分页)

rownum用于标记结果集中结果顺序的一个字段,特点是按顺序标记且连续,其主要用处是控制查询返回的行数。

rownum关键字只能和<或者<=直接关联(不能直接等于或者大于或者不是从1开始的某个区间段),如果是>或者=则需要给他起个别名。

--ROWNUM 查询只能是小于或小于等于某个值
--(不能直接等于或者大于或者不是从1开始的某个区间段)

SELECT D.*,ROWID, ROWNUM
   FROM D_DEPT D
   WHERE ROWNUM<=10;

--抽取排在第7到第10行的数据

  -- 1.补集
SELECT E.*, ROWNUM
    FROM D_DEPT E
   WHERE ROWNUM <= 10
  MINUS
SELECT E.*, ROWNUM
    FROM D_DEPT E
   WHERE ROWNUM <= 6;


--套用子查询,则可以不受小于或者小于等于等限制。
--但一定要记得用别名RN, 后面才能过滤。
-- 2.子查询
  SELECT t.*
    FROM (
      SELECT E.*, ROWNUM AS rn  -- rownum 一定要用到别名,后面才能过滤
        FROM D_DEPT E
       WHERE ROWNUM <= 10) t
   WHERE t.rn>=7;

9.SQL常用语法

--快速创建表

create table t1 as
select * from t2 where 1=0;

--如果表存在

insert into t1 select * from t2;

同一个表中,将col1字段的值赋给col2字段

update t1 set col2 =  col1;

--快速查询表结构

desc t1;

--自增长序列

CREATE SEQUENCE SEQ_T1
INCREMENT BY 1
START WITH 100000
NOMAXVALUE
NOCYCLE
CACHE 10;

--触发器

CREATE OR REPLACE TRIGGER TIB_t1
BEFORE INSERT ON t1
FOR EACH ROW
  BEGIN
    SELECT SEQ_t1.nextval
    INTO :new.ID
    FROM dual;
  END;

--flash闪回表

alter table t1 enable row movement;
flashback table t1 to timestamp to_timestamp('2021-04-20 15:10:00','yyyy-mm-dd hh24:mi:ss');
alter table t1 disable row movement;
select * from t1 ; 

--创建表空间

create tablespace YESR 
datafile 'D:\app\Administrator\oradata\YIERSHANREN\YESR.dbf' size 2048M --存储地址 初始大小2G
autoextend on next 200M maxsize unlimited   --每次扩展200M,无限制扩展
EXTENT MANAGEMENT local  autoallocate
segment space management auto;

--创建用户并指定表空间及赋予权限

create user junior  identified by junior default tablespace YESR;
grant dba to junior;

--重新指定用户表空间

alter user junior default tablespace YESR2;

--创建directory 

select * from dba_directories;
create directory DIR_YESR as 'E:\app\Administrator\dir_yesr';

--oracle 密码快过期 

-- 修改永不过期后 需要重新修改密码才生效
SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;

--指定用户JUNIOR查看T1表的权限

grant select on T1 to JUNIOR;

--数据链路

create public database link test_YSER(数据库链路的名字)   
  connect to eysonline(要连接数据库的用户名) identified by eysonline(要连接数据库的密码)  
  using   '(DESCRIPTION =
    (ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.xx.xx  )(PORT = 1521)))
    (CONNECT_DATA =(SID = test1))
  )';(单引号内的内容是要连接数据库的连接字符串) 

--数据库备份/迁移

--原数据库导出 
expdp user/psd@tt directory=DIR_tt dumpfile=2021-4-20bak.dmp logfile=2021-4-20bak.log 
--新数据库导入 
impdp user/psd@tt directory=DIR_tt dumpfile=2021-4-20bak.dmp  logfile=2021-4-20bak.log

--查看当前用户

show user;

--job启用/停用

--启动job
exec dbms_job.run(44);
--停用job
EXEC DBMS_JOB.BROKEN(44,TRUE);

--排序时空值放最后
select * from T1 ORDER BY in_date desc nulls last;

--minus(union的相反用法)

--t1结果集排除t2的结果集 把剩下的结果集查询出来
SELECT code FROM t1 where  isok='1' 
minus
select code from t2 where id = '123456';

--str1为null时 转成0
select nvl(str1,'0') from t1;

--case when函数

--当str1为0时 截取str1前4位(substr函数) 当str1位1时 截取前2位 否则等于本身
select 
(case nvl(str1,'1')  when '0' then substr(str1,0,4)
 when '1' then substr(str1,0,2)
else str1 end) as str1
from t1;

--DECODE函数

--当str1为0时 值为0 否则 汇总str2求和(sum聚合函数)
SELECT DECODE (str1,'0', 0,sum(str2))  FROM t1;

--聚合函数+group by+having (avg平均 max最大)

select str1,sum(str2),avg(str3),max(str4) from t1
group by str1 having sum(str2) > 1;

--日期函数+to_char函数

select * from t1 where str1 = TO_CHAR ( ADD_MONTHS ( TO_DATE (str2, 'yyyy-mm-dd'), -1),'yyyy-mm');
 
--REGEXP_LIKE正则表达式函数(与LIKE功能相似)

select * from t1 where REGEXP_LIKE(str1,'^(01|02|03)');

--行转列

select wm_concat(str1) name from t1;

--update +exists

update t1 set (str1,str2) = (select ss1,ss2 from t2 where t1.id = t2.id)
where exists(select 1 from t2 where t1.id = t2.id);

--alter操作

--添加字段及注释
alter table t1 add (str1 varchar2(10));
COMMENT ON COLUMN t1.str1 IS '这是备注';
--修改列名
ALTER TABLE t1 RENAME COLUMN str1 to str2;
--删除字段
alter table t1 drop column str1;

--insert into select 快速插入

Insert into t2 
select  *  from t1;

10.SQL进阶语法

10.1 常用进阶语法

--SYS:查找数据库名字

SELECT NAME FROM V$DATABASE ;

--根据关键字查找对应的存储过程

SELECT DISTINCT NAME FROM USER_SOURCE WHERE TYPE = 'PROCEDURE' AND TEXT LIKE '%PRO_7_SELINTO%';
 
SELECT * FROM USER_SOURCE T WHERE UPPER(T.TEXT) LIKE UPPER('%NO_DATA_FOUND异常%');

--SYS:查看数据库的死锁
 
SELECT 'ALTER SYSTEM KILL SESSION '''||SESS.SID||','||SESS.SERIAL#||''';'
FROM V$LOCKED_OBJECT LO,DBA_OBJECTS AO,V$SESSION SESS
WHERE AO.OBJECT_ID = LO.OBJECT_ID
AND LO.SESSION_ID = SESS.SID;
 
--杀死进程

ALTER SYSTEM KILL SESSION '28,32460';

--查找表空间使用情况

SELECT D.TABLESPACE_NAME,
       ROUND(D.SPACE/(1024*1024*1024),2) 
       SPACE,ROUND(D.MAXSPACE/(1024*1024*1024),2),
       ROUND(F.FREE_SPACE/(1024*1024*1024),2) FREE_SPACE,
       ROUND((D.SPACE - NVL(F.FREE_SPACE,0))/DECODE(D.MAXSPACE,0,NULL,D.MAXSPACE) * 100,2) USE_RATE 
FROM
(SELECT TABLESPACE_NAME,SUM(BYTES) SPACE,SUM(BLOCKS) BLOCKS,SUM(MAXBYTES) AS MAXSPACE 
FROM DBA_DATA_FILES T
GROUP BY TABLESPACE_NAME) D,
(SELECT TABLESPACE_NAME,SUM(BYTES) AS FREE_SPACE FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F 
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+); 

--查找每个表对接的数据量

SELECT TABLE_NAME,NUM_ROWS FROM USER_TABLES ORDER BY NUM_ROWS DESC;

--ORACLE 用一张表的更新另外一张表某个字段
 
SELECT * FROM T1 FOR UPDATE 
 
DELETE FROM T1
 
MERGE INTO T2 B
   USING T1 A
    ON ( A.SKU = B.SKU)                    
WHEN MATCHED
THEN
  UPDATE SET B.RESERVEDFIELD = A.JUN 

10.2 查看用户所有权限

--登录到需要查询的用户(如YJ)上,执行下面的SQL

--1.查看TEST用户被赋予了哪些角色。

SELECT * FROM USER_ROLE_PRIVS;

--2.查看当前用户所拥有的全部权限

SELECT * FROM SESSION_PRIVS;    

--3.查看用户所授予的系统权限

SELECT * FROM USER_SYS_PRIVS;

--4.查看用户所授予的对象权限

SELECT * FROM USER_TAB_PRIVS;

10.3 查询SQL执行

--SYS:查询执行最慢的sql

SELECT * FROM (SELECT SA.SQL_TEXT,
SA.SQL_FULLTEXT,
SA.EXECUTIONS "执行次数",
ROUND(SA.ELAPSED_TIME / 1000000, 2) "总执行时间",
ROUND(SA.ELAPSED_TIME / 1000000 / SA.EXECUTIONS, 2) "平均执行时间",
SA.COMMAND_TYPE,
SA.PARSING_USER_ID "用户ID",
U.USERNAME "用户名",
SA.HASH_VALUE
FROM V$SQLAREA SA
LEFT JOIN ALL_USERS U
ON SA.PARSING_USER_ID = U.USER_ID
WHERE SA.EXECUTIONS > 0
ORDER BY (SA.ELAPSED_TIME / SA.EXECUTIONS) DESC)
WHERE ROWNUM <= 50;

--SYS:查询次数最多的 sql

SELECT * FROM (SELECT S.SQL_TEXT,
S.EXECUTIONS "执行次数",
S.PARSING_USER_ID "用户ID",
U.USERNAME "用户名",
RANK() OVER(ORDER BY EXECUTIONS DESC) EXEC_RANK
FROM V$SQL S
LEFT JOIN ALL_USERS U
ON U.USER_ID = S.PARSING_USER_ID) T
WHERE EXEC_RANK <= 100;

10.4 查询DDL

--用于获得某个schema下所有的表、索引、视图、存储过程、函数的DDL

SELECT DBMS_METADATA.GET_DDL('TABLE',U.TABLE_NAME,U.OWNER) FROM DBA_TABLES U;
SELECT DBMS_METADATA.GET_DDL('VIEW',U.VIEW_NAME,U.OWNER) FROM DBA_VIEWS U;
SELECT DBMS_METADATA.GET_DDL('INDEX',U.INDEX_NAME,U.OWNER) FROM DBA_INDEXES U;
SELECT DBMS_METADATA.GET_DDL('PROCEDURE',U.OBJECT_NAME, U.OWNER,) FROM DBA_OBJECTS U WHERE U.OBJECT_TYPE = 'PROCEDURE';
SELECT DBMS_METADATA.GET_DDL('FUNCTION',U.OBJECT_NAME, U.OWNER,) FROM DBA_OBJECTS U WHERE U.OBJECT_TYPE = 'FUNCTION';

--SYS:表空间(如DM_DATA)的DDL

select dbms_metadata.get_ddl('TABLESPACE','DM_DATA') from dual;

--SYS:单个用户(如SYS)的DDL

select dbms_metadata.get_ddl('USER','SYS') from dual;

10.5 查询锁

--查看有锁的进程

SELECT T2.USERNAME,T2.SID,T2.SERIAL#,T2.LOGON_TIME,T2.STATE
FROM V$LOCKED_OBJECT T1,V$SESSION T2 
WHERE T1.SESSION_ID=T2.SID ORDER BY T2.LOGON_TIME DESC

--杀掉进程

ALTER SYSTEM KILL SESSION 'SID,SERIAL#';

--或者:

SELECT 'ALTER SYSTEM KILL SESSION '||CHR(39)||T2.SID||CHR(44)||T2.SERIAL#||CHR(39)||';',T2.LOGON_TIME
FROM V$LOCKED_OBJECT T1,V$SESSION T2 
WHERE T1.SESSION_ID=T2.SID ORDER BY T2.LOGON_TIME

--查看相关的服务器对应的锁及对象

SELECT OBJECT_NAME, MACHINE, S.SID,S.SERIAL#,S.LOGON_TIME,S.STATE
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S
WHERE L.OBJECT_ID = O.OBJECT_ID
AND L.SESSION_ID =S.SID;

--查出系统中的PID

SELECT SPID, OSUSER, S.PROGRAM
FROM V$SESSION S, V$PROCESS P
WHERE S.PADDR = P.ADDR
AND S.SID =&SID;

--或者

SELECT OBJECT_NAME AS 对象名称,S.SID,S.SERIAL#,P.SPID AS 系统进程号
FROM V$LOCKED_OBJECT L , DBA_OBJECTS O , V$SESSION S , V$PROCESS P
WHERE L.OBJECT_ID=O.OBJECT_ID AND L.SESSION_ID=S.SID AND S.PADDR=P.ADDR;

 

你可能感兴趣的:(Oracle进阶,Oracle,数据库,oracle,plsql)