sqlplus里执行sql脚本:@path/xxx.sql

@?表示ORACLE_HOME,如

@@?/rdbms/admin/sqlsessstart.sql

sqlplus paastest/Paas1015@172.32.150.13:1521/orcl


锁/解锁 账号 alter user


使sqlplus可以使用上下左右键,就像shell一样: yum -y install readline* yum install rlwrap*

然后在.bash_profile中设置:

alias sqlplus='/usr/bin/rlwrap sqlplus'
alias rman='/usr/bin/rlwrap rman'


sqlplus的配置文件是$ORACLE_HOME/sqlplus/admin/glogin.sql

可以配置_editor=vim, 在sqlplus中执行ed可以编辑前一条执行过的SQL,编辑完了并不执行,而是在sqlplus中显示出来。

/ 回车执行

保存sqlplus的输出:

spool data.txt
执行SQL
spool off


调整列宽:col table_name for a30


启动监听
ORA-12541: TNS:no listener
lsnrctl stop
lsnrctl start


Oracle 以sys远程登录 
sqlplus sys/123456@172.32.148.156:1521/orcl as sysdba


在sqlplus中执行shell命令:前加!,如:
!ls


DBMS_OUTPUT.PUT_LINE();不输出:set serveroutput on


编译函数或存储过程出错,查看错误用 show errors


sqlplus中-是续行符的意思
EXECUTE DBMS_LOGMNR.START_LOGMNR( -DICTFILENAME => 'orcldict.ora', -STARTTIME => TO_DATE('01-Jan-1998 08:30:00','DD-MON-YYYY HH:MI:SS'), -ENDTIME => TO_DATE('01-Jan-1998 08:45:00', 'DD-MON-YYYY HH:MI:SS'));

to_char(start_timestamp, 'YYYY-MM-DD HH24:MI:SS')

to_timestamp('2021-03-12 00:09:45', 'YYYY-MM-DD HH24:MI:SS')


ORA-01109: database not open

alter database open;


select * from v$controlfile;

SHOW PARAMETER CONTROL_FILES;

show parameter <参数名>;

V$PARAMETER  列出所有参数信息


alter database add logfile group 4 ('/home/oracle/product/oradata/ORCL/redo04.log') size 200M;

alter database add logfile member '/u01/app/oracle/fast_recovery_area/orcl/redo03.log' to group 3;


PL/SQL命令行的变量,声明赋值打印

var name varchar2(10)
exec: name:='hello';
print name

分号;显示出前一条执行的命令,但并不执行


create user TESTLOGMNR2 identified by 123456;

grant connect, resource, dba to TESTLOGMNR2;

grant execute on DBMS_LOGMNR_D to TESTLOGMNR2;

grant execute on DBMS_LOGMNR to TESTLOGMNR2;

Oracle如何调用其他用户下的存储过程?首先在A用户下对B用户赋予 某个存储过程权限,然后在B用户下,执行存储过程, 但是要加 A.存储过程。


创建函数
create or replace function TO_TIMESTAMP(in ts varchar)
returns timestamp without time zone as $$
begin
return TO_TIMESTAMP(ts,'DD-MON-YY HH24.MI.SS');
end;$$
language plpgsql;


给新建用户分配表空间,不然用户没法向表里插入数据

alter user benchmarksql default tablespace users;

CREATE TABLESPACE BENCHMARK DATAFILE '/home/oracle/product/oradata/ORCL/benchmark.dbf' SIZE 2048M;
CREATE USER BENCHMARKSQL IDENTIFIED BY 123456 DEFAULT TABLESPACE BENCHMARK;
GRANT CONNECT, RESOURCE TO BENCHMARKSQL;
ALTER USER BENCHMARKSQL QUOTA UNLIMITED ON BENCHMARK;


计算oracle 的TPS:

先调用 select * from v$sysstat where name like 'user%'

记下user commits,过一段时间再查一下,记下user commits,然后两者相减,再除以时间。网上有人说user rollbacks应该也算在TPS中。


oracle查看一个包有没有安装:select * from dba_objects  where object_name = upper('Dbms_Crypto');

sqlplus配置文件:
/home/oracle/product/dbhome_1/sqlplus/admin


1.字符串和日期要用单引号引起来。
2.字符串大小写敏感。(区分大小写)
select * from emp where hiredate = to_date('1980-12-17','yyyy-mm-dd');

数据库默认日期格式:
select property_name, property_value from database_properties where property_name = 'NLS_DATE_FORMAT';

当前回话默认日期格式:
select * from v$nls_parameters where parameter='NLS_DATE_FORMAT';

修改当前回话日期格式:
alter session set nls_date_format ='yyyy-mm-dd hh24:mi:ss';
select sysdate from dual;

rownum< 和 and 并用时, 是在另一个条件 and 基础上的 rownum<

between用于日期:
select * from emp where hiredate between '09-JUN-81' and '23-JAN-82';

like字符模糊查询,%代表一个或多个字符,_ 代表一个字符,% 和 _ 可以同时使用。
select * from emp1 where ename like '%\_%' escape '\';  以 \ 为转义符对 _ 进行转义。

空值和空值不能用 = 比较,判断空值只能用 is null,is not null 。

包含 null 值的列排序时, 默认把 null 值看做无限大:
在升序排序时, nulls last
在降序排序时, nulls first 空值最小

1.order by 后面不能跟 LOB、 LONG、 LONG ROW 类型的列。
2.select 语句中有 distinct 关键字, order by 后面的列 必须出现在 select 子句中。
3.order by 根据字符排序时, 区分大小写。

distinct 的误用:
distinct 关键字前不能查询其他列:select empno,distinct deptno from emp;
一个 select 子句中不能出现多个 distinct:select distinct empno,distinct deptno from emp;
distinct后面有多个列时,修饰的是它后面的多个列,而不仅仅是后面的第一个列。

查看执行计划:
explain plan for select * from emp2 where ename like '%O%';
@?/rdbms/admin/utlxplp

重新收集统计信息:
execute dbms_stats.delete_table_stats ('benchmarksql','bmsql_warehouse');

DUAL 表是一个“伪表”(虚拟表), 只包含一个列 DUMMY, 数据类型为 VARCHAR2(1)。
DUAL 表只包含一行, 其 DUMMY 列的值为 X。
DUAL 表是为了语法上的完整性。

时间信息包含在 SYSDATE 中, 默认不显示。
可以通过 TO_CHAR 转换函数提取时间信息或者通过改变 NLS_DATE_FORMAT 会话参数来更改
设置。

日期的算术运算:
在日期上加上或减去一个数字,结果仍为日期。
两个日期相减返回两个日期相差的天数。
可以用小时数除以24,可以加小时到日期上。

单行函数嵌套:
单行函数可以嵌套到任意层级。
嵌套函数的执行顺序是由内到外。

隐式类型转换:
VARCHAR2 / CHAR  ---> NUMBER
VARCHAR2 / CHAR  ---> DATE
NUMBER ---> VARCHAR2 / CHAR
DATE ----> VARCHAR2 / CHAR
隐式转换时,日期和数字使用默认格式

显式类型转换:

to_char() 日期,数字转字符串。
to_date() / to_timestamp() 按指定格式将字符串转为日期/时间戳类型。
to_number() 字符串到数字。

nvl() 将某种类型的空值转为已知值,可处理数字,日期,字符类型,被转换的变量类型必须与默认值的类型相同,如nvl(mgr,'No Manager'), 变量mgr必须是字符类型。

NVL2(expr1,expr2,expr3) 如果expr1非null,返回expr2,否则返回expr3。

nullif(expr1,expr2) 比较两个表达式是否相同, 如果相同返回 null, 否则返回 expr1。

条件表达式:

CASE表达式:
select empno,ename,sal,job,
case job when 'ANALYST' then sal*1.1
when 'CLERK' then sal*1.15
when 'MANAGER' then sal*1.2
else sal*1.25
end new_sal

from emp order by job;

select empno,ename,sal,job,
case when job='ANALYST' then sal*1.1
when job='CLERK' then sal*1.15
when job='MANAGER' then sal*1.2
else sal*1.25
end new_sal

from emp order by job;

decode函数:
需求: 工作是 ANALYST 的, 工资涨 10%;
工作是 CLERK 的, 工资涨 15%;
工作是 MANAGER 的, 工资涨 20%;
其他的涨 25%。
select empno,ename,job,sal,
decode(job,'ANALYST', sal*1.1,
                   'CLERK', sal*1.15,
                   'MANAGER', sal*1.20,
                  sal*1.25) new_sal

from emp order by job;

分组(聚合)函数:

avg,max,min,sum,count 这些称为分组函数,是指输入是多行数据,输出是一个值。
COUNT(*)返回表中行的总数, 包括重复行与数据列中含有空值的行, 而其他分组函数的统计都不包括空值的行。
select count(distinct mgr) from emp; 只计算mgr非null且不重复的行。
select avg(comm) from emp; 分组函数忽略common值为null的行,select avg(nvl(comm,0)) from emp; 这样就不会忽略空行了。
GROUP BY的使用限制:
SELECT列表中,没有使用分组函数的的列表达式,必须包含在GROUP BY列表中,GROUP BY列表中的列不必出现在SELECT列表中,GROUP BY列表中不能使用列别名。
不能使用where子句过滤组函数的值,应使用having子句:
select deptno,avg(sal) from emp where avg(sal) > 2000 group by deptno; where应该是对基表或衍生表的每一行进行过滤!
select deptno,avg(sal) from emp having avg(sal) > 2000 group by deptno;

HAVING对分组函数的返回结果进行过滤:
select deptno, max(sal) from emp group by deptno having max(sal) > 2900; 可以放在group by前或后
分组函数可以嵌套,最多嵌套两层, 嵌套时必须有 group by,这个group by是对内层的分组函数起作用:

分组函数还可以出现在order by子句中:
select w_ytd, avg(w_tax) from bmsql_warehouse group by w_ytd order by avg(w_tax);
Oracle 和 Pg还支持自定义聚合函数。

查看表连接的执行计划:

explain plan for select W_NAME, D_NAME from BMSQL_WAREHOUSE, BMSQL_DISTRICT where W_ID = D_W_ID;
select * from table(dbms_xplan.display);

使用表前缀可以提高效率:

JOIN时使用表别名,并且作为列的前缀可以提高语义分析的效率。
select w.W_NAME, d.D_NAME from BMSQL_WAREHOUSE w, BMSQL_DISTRICT d where w.W_ID = d.D_W_ID;

内连接的写法:

select emp.ename,emp.deptno,dept.deptno,dept.dname
from emp inner join dept
on ( emp.deptno=dept.deptno);
等价于:
select emp.ename,deptno,dept.dname
from emp inner join dept
using (deptno);
连接列名称相同时, 可以使用 using, 但列名前不能加修饰

自然连接 NATRURAL JOIN:

以表中相同名字,且相同类型的列,创建等值连接条件。
如果只是列名相同但是类型不同则会报错。
如果多个列名符合,都会作为条件。

内、外连接:

SQL1999中,如果只返回匹配行,则称为内连接。
除了返回匹配行,还返回左/右表的不匹配行,称为左/右外连接。
除了返回匹配行,还返回左右表的全部不匹配行,称为全外连接。
同一个外连接查询需求, 使用左外连接或者右外连接都可以实现。
左外连接是把左边表里数据显示完整, 包括不符合连接条件的行。
右外连接是把右边表里数据显示完整, 包括不符合连接条件的行。
可以用外连接查出一个表中不符合条件的行。
Oracle中左右外连接专有语法,PG不支持:
select w.W_NAME, d.D_NAME from BMSQL_WAREHOUSE w, BMSQL_DISTRICT d where w.W_ID = d.D_W_ID(+);            左外连接
select w.W_NAME, d.D_NAME from BMSQL_WAREHOUSE w, BMSQL_DISTRICT d where w.W_ID(+) = d.D_W_ID;            右外连接
select w.W_NAME, d.D_NAME from BMSQL_WAREHOUSE w full outer join BMSQL_DISTRICT d on w.W_ID=d.D_W_ID;    全连接
全连接不是笛卡尔积!
自连接,一个表自己和自己JOIN,条件是两个列(相同或不同)
select a.W_ID, a.W_NAME from bmsql_warehouse a, bmsql_warehouse b where a.W_STREET_1 = b.W_STREET_2;

子查询:

子查询在主查询之前执行,出现位置:select,where,from,having。
只查询要放在括号内,单行运算符对应单行子查询结果,多行运算符对应多行子查询结果。



HAVING 中使用子查询:
select job,avg(sal) from emp group by job having avg(sal)=(select max(avg(sal)) from emp group by job);
查询哪个部门工资最高:

多行子查询使用 in,not in,any,all
select empno,ename from emp where empno in (select mgr from emp);

注意 NOT IN 表达式列表中的 NULL

ANY 表达式:
查询工资比职位是 clerk 的员工中任意一个低的员工信息
select empno,ename,job,sal from emp where sal < any (select sal from emp where job = 'CLERK' ) and job <> 'CLERK';
< any 小于最大值
> any 大于最小值
= any 等价于 in

查询工资比各部门平均工资都高的员工
select empno, job, sal from emp where sal > all ( select avg(sal) from emp group by deptno);
>all 大于最大值
!=all 等价于 not in

找出与 1号员工 job,sal 相匹配的员工
select empno, ename, sal job from emp where job=(select job from emp where empno=1) and sal=(select sal from emp where empno=1) and empno <> 1;
等价语句:
select empno, ename, sal, job from emp where (job, sal) = (select job, sal from emp where empno = 1) and empno <> 1;

FROM中的子查询
查询工资比本部门平均工资高的员工
select a.ename, a.sal, a.deptno, b.salavg from emp a, (select deptno, avg(sal) salavg from emp group by deptno) b where a.deptno = b.deptno and a.sal > b.salavg;
普通子查询: 在主查询执行之前, 子查询首先执行一次。 子查询的结果要在主查询中使用。
关联子查询: 需要重复执行子查询。
查询工资比本部门平均工资高的员工
select e.ename, e.sal, e.deptno from emp e where e.sal > (select avg(s.sal) from emp s where e.deptno = s.deptno);
这个关联子查询等价于上面的查询,哪个执行效率高呢?——研究执行计划

SELECT LIST中的子查询
select e.empno, e.ename, e.deptno, (select d.dname from dept d where e.deptno = d.deptno) from emp e;

还不能简单地转换为JOIN,应该是一个外连接,

在 exists 和 not exists 中使用子查询:
select m.empno,m.ename from emp m
where exists (select 1 from emp e where e.mgr=m.empno);
select m.empno,m.ename from emp m
where not exists (select 1 from emp e where e.mgr=m.empno);

列出 emp 表第 5 - 第10 名员工的信息,在第一层表使用rownum过滤是不行的:

select * from (select rownum rn, emp.* from emp) t1 where t1.rn between 5 and 10;

select * from (select rownum rn, emp.* from emp) t1 where t1.rn >= 5 and t1.rn <= 10;


使用交互式替代变量:

select * from emp where deptno = &deptnum;  请求输入deptnum的值
替代字符串和日期要用单引号把变量包起来:
select ename, deptno,sal*12 from emp where job='&job_title';
交互式输入列名、where条件、和order by 条件:
select empno, ename, job, &column_name from emp where &condition order by &order_column;
同一个变量在SQL语句中重复使用,在第一个变量前加&&:
select empno,ename,job, &&col from emp order by &col;
定义变量define,undefine:
define ename = 'SMITH';
select * from emp where ename = '&ename';
只输入define显示所有已定义的变量。
accept命令,接收用户输入时,指定变量类型、提示信息,或是输入密码时,隐藏密码:
accept dept prompt 'Provide the department name:
accept password prompt 'Please input your password: ' hide

使用set控制当前回话:

set verify off/on;   开启关闭变量值前后的校验
show verify          显示变量前后校验状态
show linesize
set linesize 100   行宽度
show pagesize
select * from emp;

系统当前时间:
set time on
!date
set time off

执行脚本时显示脚本内容:
show echo
set echo on

显示执行时间:
set timing on/off

显示返回行数:
set feedback on/off

显示头信息,列名:
set heading on/off

设置列分隔符:
set colsep '|'

显示脚本执行结果:
set termout on/off

交互时每次返回客户端的行数:
show arraysize

控制 lob 对象查询的时候显示多少字符:
show long

可以将上面set操作保存在 glogin.sql 文件中,来定制回话默认属性。

column命令,可以设置列的宽度、显示格式、列名、对齐方式。
column ename  显示 ename 格式
column ename clear 清除 ename 格式

设置表头和表尾信息:
ttitle 'Employee|Report'
btitle 'Confidential'

保存sql结果到文件中:
spool /home/oracle/emp1.sql
select * from emp;
spool off;

set trimspool on 行显示紧凑
这些sqlplus里的命令主要用于生成报表。

create table emp1 as select * from emp where 1=2;
insert into emp1 select * from emp where job='MANAGER';
insert all into emp1 values (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) into emp2 values (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) select * from emp; (PG不支持)

savepoint 在一个事务内建立分隔点, 使后续的 rollback 语句可以进一步细分能够撤销操作的位置。 实现未提交事务的部分回滚。
savepoint 语句需要有一个名称。
在一个事务中不应重复 savepoint 名称, 如果重复, 新的 savepoint 会覆盖旧的, 从效果上是将之前的 savepoint 删除了。
一旦提交事件发生(显示、 隐式), 所有现有的存储点都将从内存中被删除。

select for update 会锁定所有检索的行。 除了发出命令的会话外, 其他会话都不能改变这些行。 在
这个会话 commit 或 rollback 之前, for update 设置的锁会一直存在。


在针对定义了约束的表执行 DML 操作时, 如果违反约束, 将自动回滚出现问题的整个语句, 而不是语句中的单个操作, 也不是整个事务。
有唯一键约束的列不可以插入重复的值, 但可以插入一个或多个空值。
主键约束= 非空+唯一。
外键约束定义在子表上, 所参考的父表列需要有唯一约束或主键约束。
有外键约束的列允许插入空值。
alter table emp02 add constraint fk_emp02_deptno foreign key (deptno) references dept02 (deptno) on delete set null;  -- 删除父表中的行, 子表中引用父表行的外键列为 null。
alter table emp02 add constraint fk_emp02_deptno foreign key (deptno) references dept02 (deptno) on delete cascade;  -- 子表的外键引用了父表中的列,当要删除父表中的行时,如果不指定on delete cascade ,则不能删除父表中已经被子表引用的行。指定了on delete cascade,则删除父表中的行时,
约束不能修改, 只能创建、 删除、 添加。
rownum 等伪列可以出现在 select 语句中, 但不是表中真正的列。
check约束:
check 约束通常是对某一列的值作出限制。
一个列上可以定义多个 check 约束。
check 约束可以定义在列级或表级。
create table dept03(deptno number(2)
constraint ck_dept03_deptno check ( deptno between 10 and 99));
自引用外键约束:
外键约束的父表和子表是同一个表。
alter table emp02 add constraint fk_emp02_mgr foreign key (mgr) references emp02(empno);
外键约束引用的父表列, 必须存在 unique 或 primary key 约束。

删除父表上的主键约束时, 如果被外键约束引用,则失败,可以使用级联选项,则主键和外键同事删除。


ORACLE基本使用相关推荐

  1. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  2. oracle 提示:ORA-02292:integrity constraint(xxxxxxx) violated - child record found

    当我们删除 数据的时候 oracle 提示:ORA-02292:integrity constraint(xxxxxxx) violated - child record found 这种情况呢是因为 ...

  3. sql特殊字符转义,oracle中将字符 ‘ 转义

    oracle中使用sql语句或多或少地会遇到使用特殊字符,比如" ' ",这时,这个单引号就会与前面的单引号匹配,将文本从中间断开,引发问题和错误.这就需要我们进行转义. 而ora ...

  4. Oracle根据日期区间查询Date类型的数据

    在Oracle数据库中,根据日期区间查询Date类型的数据 select proposalno,policyno,enddate from 表名 where 时间字段 between to_date( ...

  5. Linux/docker下oracle开启监听,开启自动启动

    写在前头: 之前呢,使用docker安装了oracle,但它默认是会关闭的.使用了几天以后突然连接异常了,报的问题是oracle监听有问题了,我知道了是oracle服务自动关闭了,监听也跟着关了.所以 ...

  6. Linux下docker安装配置oracle,oracle创建用户并远程连接,实测可用!

    最近在给同学弄毕业设计的数据库,因为oracle在个人电脑上极不稳定,所以他的电脑数据库崩溃了,这时候我就在docker上为他拉了一个oracle,解决了问题. docker的安装共有以下几步,实测没 ...

  7. Oracle type (自定义类型的使用)

    oracle - type type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要 ...

  8. Mysql,SqlServer,Oracle主键自动增长的设置

    Mysql,SqlServer,Oracle主键自动增长的设置 参考文献 http://blog.csdn.net/andyelvis/article/details/2446865 1.把主键定义为 ...

  9. oracle自动备份

    oracle自动备份,支持BLOB,BINARY_DOUBLE字段 #!/bin/sh #请设置以下参数 db_array=(csop) db_user=csop db_pwd=csop #默认备份目 ...

  10. oracle sqlserver 查看指定用户下面的表

    一.oracle 的sql语句查看指定用户下表的数量 (KOKO提供) ---------------------------------------------------------------- ...

最新文章

  1. 查看数据库中有哪些活动的事务,对应的会话id,执行的语句
  2. [原][osg]osgconv浅析
  3. 神经网络架构演进史:全面回顾从LeNet5到ENet十余种架构
  4. docker 推送镜像到私有地址
  5. linux定期清理日志文件
  6. JZOJ 5410. 【NOIP2017提高A组集训10.22】小型耀斑
  7. coap python3_node-coap入门(三)——Observe
  8. malloc动态分配数组以及指针数组大小
  9. mysql主从同步原理_mysql主从同步以及原理
  10. 评分组件(RatingBar)
  11. JS对象 数组排序sort() sort()方法使数组中的元素按照一定的顺序排列。 语法: arrayObject.sort(方法函数)...
  12. 音视频开发(33)----麦克风阵列入门(一)
  13. 苹果收购人工智能初创公司Voysis以改善语音助手Siri功能
  14. 【洛谷 P1772】 [ZJOI2006]物流运输(Spfa,dp)
  15. 好的项目需要有好的需求
  16. 去除vue路由跳转地址栏后的哈希值#
  17. linux安装openssl、swoole等扩展的具体步骤
  18. ffmpeg yuv数据存储方式_一文理解 YUV
  19. 【IoT】 产品研发:位深为1的BMP格式图片详解
  20. python打开xlsm_关于python:如何使用openpyxl使用Macro保存XLSM文件

热门文章

  1. 一种基于人脸追踪和特征分析的疲劳驾驶预警平台
  2. Arduino利用蓝牙远程操控舵机运转(Arduino+ZS040+电机)
  3. 超跌反弹之选牛股技巧
  4. Docker搭建RPG小游戏
  5. python操作数据库统计_python数据库-MySQL单表查询基本操作(50)
  6. 多商户发卡宝自动发卡系统源码
  7. 电影点播服务器系统,电影服务器系统 云
  8. Applet【总结】
  9. Cris 的 Docker 学习笔记
  10. 视音频编码要迎来一拨新高潮了