ORACLE基本使用
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基本使用相关推荐
- 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法
数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...
- oracle 提示:ORA-02292:integrity constraint(xxxxxxx) violated - child record found
当我们删除 数据的时候 oracle 提示:ORA-02292:integrity constraint(xxxxxxx) violated - child record found 这种情况呢是因为 ...
- sql特殊字符转义,oracle中将字符 ‘ 转义
oracle中使用sql语句或多或少地会遇到使用特殊字符,比如" ' ",这时,这个单引号就会与前面的单引号匹配,将文本从中间断开,引发问题和错误.这就需要我们进行转义. 而ora ...
- Oracle根据日期区间查询Date类型的数据
在Oracle数据库中,根据日期区间查询Date类型的数据 select proposalno,policyno,enddate from 表名 where 时间字段 between to_date( ...
- Linux/docker下oracle开启监听,开启自动启动
写在前头: 之前呢,使用docker安装了oracle,但它默认是会关闭的.使用了几天以后突然连接异常了,报的问题是oracle监听有问题了,我知道了是oracle服务自动关闭了,监听也跟着关了.所以 ...
- Linux下docker安装配置oracle,oracle创建用户并远程连接,实测可用!
最近在给同学弄毕业设计的数据库,因为oracle在个人电脑上极不稳定,所以他的电脑数据库崩溃了,这时候我就在docker上为他拉了一个oracle,解决了问题. docker的安装共有以下几步,实测没 ...
- Oracle type (自定义类型的使用)
oracle - type type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要 ...
- Mysql,SqlServer,Oracle主键自动增长的设置
Mysql,SqlServer,Oracle主键自动增长的设置 参考文献 http://blog.csdn.net/andyelvis/article/details/2446865 1.把主键定义为 ...
- oracle自动备份
oracle自动备份,支持BLOB,BINARY_DOUBLE字段 #!/bin/sh #请设置以下参数 db_array=(csop) db_user=csop db_pwd=csop #默认备份目 ...
- oracle sqlserver 查看指定用户下面的表
一.oracle 的sql语句查看指定用户下表的数量 (KOKO提供) ---------------------------------------------------------------- ...
最新文章
- 查看数据库中有哪些活动的事务,对应的会话id,执行的语句
- [原][osg]osgconv浅析
- 神经网络架构演进史:全面回顾从LeNet5到ENet十余种架构
- docker 推送镜像到私有地址
- linux定期清理日志文件
- JZOJ 5410. 【NOIP2017提高A组集训10.22】小型耀斑
- coap python3_node-coap入门(三)——Observe
- malloc动态分配数组以及指针数组大小
- mysql主从同步原理_mysql主从同步以及原理
- 评分组件(RatingBar)
- JS对象 数组排序sort() sort()方法使数组中的元素按照一定的顺序排列。 语法: arrayObject.sort(方法函数)...
- 音视频开发(33)----麦克风阵列入门(一)
- 苹果收购人工智能初创公司Voysis以改善语音助手Siri功能
- 【洛谷 P1772】 [ZJOI2006]物流运输(Spfa,dp)
- 好的项目需要有好的需求
- 去除vue路由跳转地址栏后的哈希值#
- linux安装openssl、swoole等扩展的具体步骤
- ffmpeg yuv数据存储方式_一文理解 YUV
- 【IoT】 产品研发:位深为1的BMP格式图片详解
- python打开xlsm_关于python:如何使用openpyxl使用Macro保存XLSM文件