一、Oracle体系结构 1、概念关系 数据库与实例:Oracle只有一个数据库,但可以有多个实例 Oracle数据库与实例一对多,一般情况下只有一个实例,我们平常说的Oracle数据库名,其实是Oracle的实例名 实例与用户一对多 实例与表空间一对多 表空间与用户一对多 2、Oracle结构 物理结构:数据文件(xxx.dbf、xxx.ora) 逻辑结构:数据库 表空间 段 区 Oracle数据块二、Oracle实用命令及语句 在物理机的dos窗口输入:sqlplus system/password@192.168.25.128:1521/orcl 查询所有表空间:select tablespace_name from dba_tablespaces; 查询所有角色:select * from dba_sys_privs; 查看所有用户:select * from all_users; 查看当前用户:show user 通过scott登录可以做测试:sqlplus scott/tiger@192.168.25.128:1521/orcl 账号锁定报错:ERROR:ORA-28000: the account is locked 解决:重新用system登录,执行alter user scott account unlock;给scott用户解锁 密码过期报错:ERROR:ORA-28001: the password has expired 解决:重新输入密码tiger即可 查看当前用户下的所有表:select table_name from user_tables; 查看表结构:desc emp 清屏:host cls 设置行宽:set linesize 150 显示行宽:show linesize 设置列宽:col ename for a8(8个字符的宽度) 设置每页多少条数据:set pagesize 20 显示每页多少条数据:show pagesize 将命令行的语句写入到指定的目下的指定的文件中: 指定写到哪个目录的哪个文件上:spool d:\1.text 写入完毕:spool off 编辑之前输入过的命令: 输入ed,然后回车 该命令主要用在当前一个sql语句写错时,又不想重新写,这个时候可以用ed命令调出记事本 对先前的命令进行编辑(如果该命令用在Linux系统中,调出来的是vi编辑器) 执行之前缓存过的命令:/三、创建表空间+创建用户+系统管理员授权 1、创建表空间tablespace create tablespace waterbos datafile 'c:\waterbos.dbf' size 100m autoextend on next 10m;
2、创建用户user create user xuming identified by itcast default tablespace waterbos; 3、给创建的新用户授权grant ORA-01045: user lacks CREATE SESSION privilege; logon denied 解决办法:系统管理员给新用户授权: grant create session,resource to 用户名; 等同于grant connect,resource to 用户名; grant dba to 用户名; 张三 超级管理员 对A资源的增加 李四 普通管理员 对A资源的删除 王五 项目经理 对A资源的修改 赵六 产品经理 对A资源的查询 钱七 技术顾问 对B资源的查询
四、创建表+维护表结构 DDL:Data Definition Language 数据定义语言 如:create、alter、drop、truncate DML:Data Manipulation Language 数据操纵语言 如:select、update、delete、insert DCL:Data Control Language 数据控制语言 如:grant、revoke 1、oracle常用数据类型 char,varchar2,long,number,date,clob,blob
2、创建表+约束 1)基本创建表语句
create table myemp3(
id number(10),
name varchar2(10) constraint myemp3_name_nn not null,--非空约束
gender varchar2(4) default '男',--默认值
deptno NUMBER(2),
email varchar2(20),
constraint myemp3_id_pk primary key(id), --主键约束
constraint myemp3_gender_ck check(gender in('男','女')), --检查约束
constraint myemp3_email_uk unique(email), --唯一约束
constraint myemp3_deptno_fk foreign key(deptno) references dept(deptno) on delete set null --外键约束 -- 没有这种写法constraint myemp3_name_nn not null
);
2)使用子查询创建表
create table emp2 as select * from emp where 1=2;
由于1=2为假,该语句只拷贝了结构,没有拷贝数据
3、修改表 1)修改表中列
oracle: alter table myemp3 modify ename vachar2(20); 不能带column
mysql : alter table myemp3 modify (column) ename varchar(20);
2)增加表中列
oracle: alter table myemp3 add gender varchar2(4);
mysql : alter table myemp3 add (column) gender varchar(4);
3)删除表中列
oracle: alter table myemp3 drop column gender; 必须带column
mysql : alter table myemp3 drop (column) gender;
4)重新命名表中列名
oracle: alter table myemp3 rename column ename to myname; 必须带column
mysql : alter table myemp3 change (column) ename myname varchar(20);
5)重新命名表名
oracle: rename myemp3 to myemp4;
mysql : rename table mysqltname3 to mysqltname4; 必须带table
4、删除表 1)彻底删除表
drop table myemp3 purge; 不加purge是暂时放到回收站中了
2)drop之后的数据放到了recyclebin回收站中
查看回收站:show recyclebin;
彻底清除回收站:purge recyclebin;
彻底删除表:drop table myemp3 purge;
查看回收站表数据: select * from "BIN$cd/KYgV5RY6/RxGTjn2Skg==$0";
3)闪回
flashback table myemp3 to before drop;
五、对表数据操作(insert,update,delete) 1)向表中插入数据(insert into values) insert into t_owners values(2,'张三',1,'3-3','7895',sysdate,1); insert into t_owners2 select * from t_owners; insert into 表名(id,name) values(xx,yy),(xx1,yy1) (mysql中可以这样写,oracle不能这样写) 向多张表中插入数据:insert all into 表名(id,name) values(xx1,yy1) into 表名(id,name) values(xx2,yy2);
2)修改表中数据(update set) update 表名 set dateddd=dateadd-3,col1=col1+1; 3)删除表中数据 使用delete删除数据 delete from myemp where empno=7369; 使用truncate 删除整张表数据 truncate table myemp;功能上与delete from myemp; 相同 delete和truncate 删除数据的区别: (1)delete可以回滚,truncate不可以 (2)truncate比delete效率要高 实际企业开发中删除数据库中数据注意点: (1)先把要删除的数据备份 (2)确认用于删除的sql语句无误 (3)尽量选择能够回滚数据的方式delete (4)drop > truncate > delete
六、导入和导出 1)整库导入导出 exp system/itcast full=y exp system/itcast full=y file=abc.dmp imp system/itcast full=y imp system/itcast full=y file=abc.dmp
2)按用户导入与导出 exp system/itcast owner=xuming file=abc.dmp imp system/itcast file=abc.dmp fromuser=xuming 3)按表导入导出 exp xuming/itcast file=a.dmp tables=t_owners; imp xuming/itcast file=a.dmp tables=t_owners; 4)mysql导入导出 第一种导入数据: mysql -uroot -proot mysql>create database crm; mysql>use crm; mysql>source d:/crm.sql 第二种导入数据: 先创建好数据库crm,执行 mysql -uroot -proot crm < d:\crm.sql mysql导出数据 mysqldump -uroot -proot crm > d:\crm1.sql
七、总结oracle与mysql在项目中使用区别 1、导入jar包不同 oracle:ojdbc14.jar 版本可能会变 mysql:mysql-connector-java-5.1.7-bin.jar 版本可能会变 注意:不同项目,jar包版本会有区别 2、jdbc获取连接写法 oracle:Connection connection = DriverManager.getConnection(" jdbc:oracle:thin:@192.168.25.128:1521:orcl", "xuming","itcast"); mysql:Connection connection = DriverManager.getConnection("jdbc: mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root"); 3、配置文件 # oracle jdbc properties jdbc.url = jdbc:oracle:thin:@localhost:1521:xe jdbc.driver= oracle.jdbc.driver.OracleDriver jdbc.user = bos jdbc.password = bos
#mysql jdbc properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/bos?characterEncoding=utf-8 jdbc.user=root jdbc.password=root
=========================================================================一、单表查询 完整语句:select from where group by having order by 1、简单条件查询 =,!=,>,>=,<,<= like and 和or 逻辑运算,and的优先级大于or between and:小值在前,大值在后;左右两边都包括边界 is null/is not null:在mysql和oracle中没有=null和!=null not like,not between and,not in 2、去重:select distinct deptno,mgr保证deptno和mgr两个列组成的值的唯一性 3、排序 order by sal,deptno desc; desc只能对deptno进行降序排列 底层实现的顺序:首先按照sal升序排列,然后如果有相同的sal,再按照deptno进行降序排列。 4、伪列rowid和rownum rowid:每一行的物理地址 rownum:每一行排序的序号 select rowid,rownum,empno,ename from emp; ROWID ROWNUM EMPNO ENAME ------------------ ---------- ---------- ------ AAAMfPAAEAAAAAgAAA 1 7369 SMITH AAAMfPAAEAAAAAgAAB 2 7499 ALLEN AAAMfPAAEAAAAAgAAC 3 7521 WARD AAAMfPAAEAAAAAgAAD 4 7566 JONES AAAMfPAAEAAAAAgAAE 5 7654 MARTIN AAAMfPAAEAAAAAgAAF 6 7698 BLAKE AAAMfPAAEAAAAAgAAG 7 7782 CLARK AAAMfPAAEAAAAAgAAH 8 7788 SCOTT AAAMfPAAEAAAAAgAAI 9 7839 KING AAAMfPAAEAAAAAgAAJ 10 7844 TURNER AAAMfPAAEAAAAAgAAK 11 7876 ADAMS
5、聚合函数:min(),max(),avg(),sum(),count(),其中count(对于null值行直接滤过) group by 分组 select deptno,max(sal) from emp group by deptno;//这里的deptno为非聚合函数的列,所有需要参与到分组中去 select deptno,job,max(sal) from emp group by deptno,job;//多列分组,首先按照deptno分组,相同的组再按照job分组 select empno,deptno,sum(sal) from emp group by empno,deptno; 聚合函数group by使用having来过滤分组后的结果, 普通的列使用where过滤 6、别名:select ename as "员工姓名",sal 工资 from emp; as可以加,也可以省略,如果别名包含了特殊的关键词必须加上"";否则可以不用加"" oracle中字符串和日期都是单引号,只有别名才是双引号。
二、多表查询 只要两个表能够建立关联关系,两个表都能够联合查询 1、内连接:在笛卡尔集上选择了满足on条件的记录行,连接的是两个相同的列的值 (笛卡尔集:记录条数是多个表记录乘积,列数是多个表的列之和) 显式内连接:select * from emp e inner join dept d on e.deptno=d.deptno; 隐式内连接:select * from emp e , dept d where e.deptno=d.deptno;
2、外连接:左外连接left join on/right join on 遵循的SQL99语法 select * from emp left join dept on emp.deptno=dept.deptno; oracle中(+) select * from emp where emp.deptno=dept.deptno(+); select d.deptno 部门编号,d.dname 部门名称,count(e.empno) 部门总人数 from emp e, dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname order by d.deptno;
三、子查询 1、子查询写法 where后的子查询:先查子查询,子查询的结果作为主查询的过滤条件 select ename from emp e where e.deptno in (select dept.deptno from dept where deptno>10); from后的子查询:先查子查询,子查询的结果,可以看成一张表,被主查询查 select t.部门总人数 from (select d.deptno 部门编号,d.dname 部门名称, count(e.empno) 部门总人数 from emp e, dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname order by d.deptno) t; select后的子查询:先查主查询,主查询的结果作为子查询的参数,最后再查主查询 select ename 员工编号, (select dname from dept where dept.deptno=emp.deptno) 部门名称 from emp; 注意:select后面的子查询,一定是单行子查询(只返回一条结果记录)
2、子查询运算符 单行子查询使用(=,<>,>,>=,<,<=),多行子查询使用单行运算符和(in(),any(),all())
四、分页查询 1、rownum 一张表不经过任何操作默认带有rownum行号,经过排序操作之后,该行号也随着排序了,但不是从1-2-3排序的 为了重新按照1-2-3排序,我们把rownum当成列来使用而不是行号 2、可以提炼成公式: 页码pageNo=1 每页条数pageSize=5 select * from (select rownum r,t.* from (select * from emp order by sal desc) t where rownum <=pageNo pageSize) where r>(pageNo-1)pageSize;
select * from emp order by sal desc limit 0,5; select * from emp order by sal desc limit (pageNo-1)*pageSize,pageSize;
五、函数:任何一个函数都有返回值 (只作了解,把握可以处理哪几种数据,以及处理数据功能) 参考"oracle函数大全(分类显示).chm" 字符函数 length(),concat()和||,substr()
数值函数round() trunc()select round(45.926,2) 一,round(45.926,1) 二,round(45.926,0) 三,round(45.926,-1) 四,round(45.926,-2) 五 from dual;select trunc(45.926,2) 一,trunc(45.926,1) 二,trunc(45.926,0) 三,trunc(45.926,-1) 四,trunc(45.926,-2) 五 from dual;日期函数 sysdate systimestampnext_day(,'星期一')last_day()trunc()months_between()add_months()转换函数to_char() 可以转换成日期或者指定格式to_number() 字符串转换成数字to_date() 字符串转换日期 其他函数 关于null的函数:nvl(a,b) a为null,则返回bnvl2(a,b,c) a为null,则返回c,否则返回b 在mysql中nullif(a,b) a=b,则返回null,否则返回a 在mysql中使用ifnull(a,b) 如果a为null ,则返回b 条件语句函数(重要)case when then else end decode(ename,'',,,,)分析排名函数()rank() over(order by xxx ) 相同的值排名相同,排名跳跃DENSE_RANK() over(order by xxx) 相同的值排名相同,排名连续ROW_NUMBER() over(order by xxx) 连续的排名,无论值是否相等
六、集合操作 union 去重,union all不去重 集合参与运算(并集,交集,差集),笔记中图案的黄色部分为查询结果 差集:a minus b a-(a和b的交集) 集合操作必须满足如下原则: 1、两个集合的列数要一致 2、两个集合中的列要顺序相同,对应类型相同 order by放在最后; select ename,sal from emp union all select sal,ename from emp; 会报错 =========================================================================一、视图 1、普通视图(复杂查询结果放到一张虚拟表中,对视图的操作其实是构成视图基表操作) 创建视图:create or replace view myview_view as select * from myemp3; 删除视图:drop view myview; 理解:视图一般不推荐做插入、修改操作,推荐做查询, 因为如果遇到一些特殊语句,insert,update 操作就不行, 企业开发中用的最多的是with read only视图
2、物化视图(能够说出来,物化视图是怎么一个原理) 创建视图时是否生成数据:BUILD IMMEDIATE(默认,创建即生成),BUILD DEFERRED 刷新方法有三种: FAST(增量刷新),COMPLETE(全量刷新) ,FORCE(默认强制刷新) 刷新的模式有两种:ON DEMAND(默认,手动刷新) 和 ON COMMIT(自动刷新) 理解:物化视图存储基于基表的数据,也可以称为快照,可以理解成一种特殊的表。 删除物化视图:drop materialized view myemp3_materialized; 3、 普通视图与物化视图的异同 1)相同:都指向一段sql语句 2)不同:普通视图相当于虚拟表;物化视图会真正生成一张特殊的表 3)查询物化视图和查询表的效率一样 4、增量刷新的物化视图 1)增量刷新跟全量刷新的区别?提示:下载app 2)创建物化视图日志,记录基表数据的变化:insert、update、delete 3)创建物化视图的sql语句里面(as后面)一定要有rowid, 物化视图日志表的rowid和物化视图表的rowid做比较
二、序列(主键自增使用) 创建序列:create sequence myemp3_seq; 删除序列:drop sequence myemp3_seq; 使用序列:在insert into myemp3 values(myemp3_seq.nextval,'张三','男',10,' 101001@qq.com'); 获取当前值使用myemp3_seq.currval 注意:myemp3_seq.nextval 每调用一次nextval 指针向后移动一位,也就是该序列增加一次;
create sequence seq_test999 increment by 10start with 1minvalue 0maxvalue 190cycle;会报错:CACHE值必须小于CYCLE值(因为一次CACHE的值有重复的会出错)-- cache值:默认20 指20个数 -- cycle值:ceil((maxvalue-minvalue)/abs(increment))-- CACHE值必须小于等于CYCLE值 需要满足一个公式:cache <= ceil((maxvalue-minvalue)/abs(increment)) 1 11 21 31 ... 191 20个数 cache 1 11 21 31 ... 191 1 11 21 ...191场景:发消息 1、2、3、4、5、6、720 <= ceil((190-0)/10)改成 create sequence seq_test999 increment by 10start with 1minvalue 0maxvalue 191cycle;
三、同义词(给其他对象取一个别名,方便其他用户调用和缩写对象名称) 创建同义词:create synonym mysys_synonym for myemp3; for 可以是其他对象 删除同义词:drop synonym mysys_synonym;四、索引(提高检索速度) 创建索引:create index myemp3_index on myemp3(name,email) 联合(复合)索引 删除索引:drop index myemp3_index; 创建索引的场景: 该列值很多(覆盖很多条记录),经常被查询,例如where ename="",where A.xx=B.xx 如果该列值经常做update操作不适合建索引 =========================================================================一、plsql的基本结构和变量声明 1、基本结构 declare --声明变量 begin --plsql体执行其他操作 exception --有异常捕获处理可以加上该关键字 --异常处理 end;
2、变量声明:(常量、普通变量、引用普通类型变量、引用行类型变量、异常类型变量、游标类型变量)set serveroutput on --注意这里使用sqldeveloper 工具需要将控制台输出打开一次就行DECLARE id constant number(2):=1;--使用constant 关键词定义常量 name VARCHAR2(10):='悟空';--定义指定类型变量 mysal emp.sal%type;--定义引用存在表的列类型 myrow emp%rowtype;--定义引用存在表行类型,相当于java中对象,该行类型包含所有列 select * into v_account from xx no_data exception;--异常定义 cursor c1 is select sal from emp;--游标定义,该c1中相当于java中集合,给 cursor c2(dno number) is select sal from emp where deptno=dno;---带参游标定义,该c2相当于java中带泛型集合BEGIN raise no_data;exception when no_data then xx; when others then xx; --常量就不能再赋值了 id:=2 错误 SELECT sal INTO mysal FROM emp WHERE empno=7369; SELECT * INTO myrow FROM emp WHERE empno=7369; dbms_output.put_line(id); dbms_output.put_line(name); dbms_output.put_line(mysal); dbms_output.put_line(myrow.ename || ' ' || myrow.sal);END;
二、条件判断语句 1、select case when then when then else end 2、select decode() 3、if then elsif then else end if; if xx then xx elsif xx then xx --注意不能写成elseif elsif xx then xx else xx end if;---注意加上分号三、循环语句 第1种: for i in 1..100 --退出循环是根据循环次数来定的 loop end loop; 游标使用for in格式更简单 for 不需要定义任意变量名称 in c1; loop end loop; 第2种: while --此处while后面声明退出循环条件 loop end loop; 第3种: open c1; ---此处打开游标 loop fetch c1 into xx; exit when c1%notfound; --此处exit when 声明退出循环条件 end loop; close c1; --此处关闭游标四、存储过程 第1种创建方式:不带参数 create or replace procedure mypro1 as --这里可以声明变量 begin end; 第2种创建方式:带in和out参数,参数个数不限制 create or replace procedure mypro2(eno in emp.empno%type,name out varchar2) as --这里可以声明变量 myrow emp%rowtype; begin select * into myrow from emp where empno=eno; name:=myrow.ename; end; plsql调用存储过程: execute mypro1;---对于无参数存储过程可以这样调用 或者 call mypro1(xxx)--对于只有in 参数可以这样调用 或者 declare --存储函数和存储过程都可以这样调用 name varchar2; begin mypro2(7369,name);---此处声明一个变量用于接收out参数输出 end;五、存储函数 1、创建存储函数: create or replace function myfn1(eno in emp.empno%type) return varchar2 as --实际return name 的name类型一定要和定义的return varchar2要一致 --这里可以声明变量 myrow emp%rowtype; name varchar2; begin select * into myrow from emp where empno=eno; name:=myrow.ename; return name; end; 2、plsql调用存储函数: select myfn1(7369) from dual; 或者 declare name varchar2;--此处要声明一个变量用于接收返回的结果 begin name:=mypro2(7369); dbms_output.put_line(ename); end;六、java api 调用存储过程和存储函数 DriverManager.getConncetion() -> Connection ->CallableStatement prepareCall -> 设置传入参数直接通过设置类型setInt() -> 设置传出参数,需要registerOutParameter CallableStatement execute();
CallableStatement调用存储过程和存储函数的语句{call mypro1(?,?)} 调用存储过程{?=call myfn1(?)} 调用存储函数
七、触发器 1、前置与后置 前置触发器:sql语句commit之前 后置触发器:sql语句commit之后 2、从影响行数来看 insert into emp() values() 插入了3条记录 行级触发器:触发3次 表级触发器(或者说语句触发器):触发了1次 3、语法 create or replace trigger 触发器名 before|after delete|update|insert on 表名 for each row--行级触发器 begin pl/sql语句 end;====================================================================================================================================oracle总结: 一、数据库基本功底(ddl+dml(insert/update/delete)+单表+多表) 基本语句:select from where group by having order by 多表:where连接内连接+on连接的外连接 jdbc操作相关: Statement/PreparedStatement/CallableStatement con.prepareCall("存储函数和存储过程") mysql连接语法:jdbc: mysql://localhost:3306/mybatis?characterEncoding=utf-8 oracle连接语法: jdbc:oracle:thin:@192.168.25.128:1521:orcl二、数据库优化 1、sql语句优化 1)查询的时候尽量使用列名;如:select empno,所有列名写出来 from emp; 2)分组查询有聚合函数,如果使用过滤,使用having 普通查询带条件,使用where 3)在子查询和多表查询之间选择,尽量使用多表查询 4)在集合运算中,如果union 和union all都可以,考虑使用union all因为union需要去掉重复的 5)能够不要使用集合运算就不要使用集合运算 6)对于多个条件连接,可以将false的放在and最右边,可以将true的条件放在or的最右边
2、索引优化 建立索引:单个列建立索引以及多个列上建立索引(复杂或者联合索引) 怎么建立索引:建立索引的两个场景需要斟酌 1)建立索引:在某一个列上建立索引,必须考虑到该列的值是否覆盖更广,并且查询很频繁 2)不建立索引:某一个列经常被改变,就不要建立索引
三、实际中常用的: DML insert+update+delete+select DDL create alter drop truncate
编辑推荐:
- Oracle、mysql数据库增、删、改03-03
- 【DATAGUARD】Oracle19c dataguard新特性及部署03-03
- Oracle 11g impdp 先数据后索引导入方法03-03
- 利用oracle的日志挖掘实现回滚03-03
- expdp导出遇到ORA-31626/ORA-31638/ORA-39077/ORA-6502报错03-03
- SQLT 概要和安装03-03
- SQLT 使用指南03-03
- Oracle数据库中数据行迁移与行链接03-03
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- expdp导出遇到ORA-31626/ORA-31638/ORA-39077/ORA-6502报错
- 2020年3月数据库流行度排行:疫情烽烟四起,数据价值为王
2020年3月数据库流行度排行:疫情烽烟四起,数据价值为王
26-03-03 - 数据库启动报错:ORA-01102: cannot mount database in EXCLUSIVE mode
- Oracle 19c RAC on Linux 7.6安装手册
Oracle 19c RAC on Linux 7.6安装手册
26-03-03 - 启动报错:ORA-00376:file x cannot be read at this time
- oracle ADG ora-30927
oracle ADG ora-30927
26-03-03 - Oracle面试宝典-表连接篇
Oracle面试宝典-表连接篇
26-03-03 - ocr voting disk 有备份和无备份的恢复
ocr voting disk 有备份和无备份的恢复
26-03-03 - 由OGG引发的数据库故障
由OGG引发的数据库故障
26-03-03 - Oracle cluster table(1)_概念介绍
Oracle cluster table(1)_概念介绍
26-03-03
