1.windows10安装Oracle 19

Database Software Downloads | Oracle
image.png
中间安装过程省略,可查看其他博客。

2.安装PL/SQL

Registered download PL/SQL Developer - Allround Automations
image.png
当Oracle是最新的,那么相应的配套软件一定要安装最新,最新的软件不用使用繁琐的配置,软件里自带配置,安装就可以使用。

3.登录Oracle

打开PL\SQL软件,密码就是你安装时设置的口令,而连接有三种方式,选择默认normal,因为开发不需要更改配置,而sysdata是用于更改配置的,所以选择normal。
image.png
新建SQL窗口
image.png

4.创建表空间

表空间,相当于一个划分给Oracle的内存,专门用于存储数据的区域。
create tablespace 表空间名
datafile 存储路径 文件路径必须存在,并且后缀文件名必须是 *.dbf
size 表空间的初始大小
autoextend on 自动增长 ,当表空间存储都占满时,自动增长
next 指定的是一次自动增长的大小

  1. -- 创建表空间
  2. create tablespace hikktn
  3. datafile 'E:\oracle_tablespaces\hikktn.dbf' size 100M
  4. autoextend on -- 自动增长
  5. next 10M; -- 自动增长大小

5. 删除表空间

  1. -- 删除表空间
  2. drop tablespace hikktn;

6.创建用户

Oracle 中已存在三个重要的角色:connect 角色,resource 角色,dba 角色。
CONNECT 角色: —是授予最终用户的典型权利,最基本的

  • ALTER SESSION —修改会话
  • CREATE CLUSTER —建立聚簇
  • CREATE DATABASE LINK —建立数据库链接
  • CREATE SEQUENCE —建立序列
  • CREATE SESSION —建立会话
  • CREATE SYNONYM —建立同义词
  • CREATE VIEW —建立视图

RESOURCE 角色: —是授予开发人员的

  • CREATE CLUSTER —建立聚簇
  • CREATE PROCEDURE —建立过程
  • CREATE SEQUENCE —建立序列
  • CREATE TABLE —建表
  • CREATE TRIGGER —建立触发器
  • CREATE TYPE —建立类型

DBA 角色:拥有全部特权,是系统最高权限,只有 DBA 才可以创建数据库结构,并且系统
权限也需要 DBA 授出,且 DBA 用户可以操作全体用户的任意基表,包括删除

  1. -- 创建用户【必须给用户授权,否则无法访问表空间】
  2. create user c##hikktn -- 用户名
  3. identified by hikktn -- 密码
  4. default tablespace hikktn; -- 表空间

7.授权用户

  1. -- 给用户授权
  2. -- oracle数据库中常用角色
  3. connect -- 连接角色,基本角色
  4. resource -- 开发者角色
  5. dba -- 超级管理员角色
  6. -- 授权
  7. grant dba to c##hikktn;

8.创建一个person表

  1. -- 创建一个person
  2. create table person(
  3. id number(20),
  4. name varchar2(10)
  5. );

image.png
image.png
image.png

9.数据库表结构定义

  1. -- 修改表结构
  2. -- 添加列
  3. alter table person add ( sex number(1), age number(5) );
  4. -- 修改列类型
  5. alter table person modify sex char(1);
  6. -- 修改列名称
  7. alter table person rename column sex to gender;
  8. -- 删除列
  9. alter table person drop column age;

10.CRUD

  1. -- CRUD
  2. -- 查询
  3. select * from person;
  4. -- 添加一条数据
  5. insert into person (id,name,gender) values (1,'王三','0');
  6. -- 提交
  7. commit;
  8. -- 修改
  9. update person set name = '李四' where id =1;
  10. commit;
  11. -- 三种删除方式
  12. -- 删除表中全部数据
  13. delete from person;
  14. -- 删除表结构
  15. drop table person;
  16. -- 先删除表,再创建表。效果等同于删除表中全部数据。
  17. -- 数据量大,先删除了索引,在删除全部数据,效率高
  18. truncate table person;

11.创建序列

  1. -- 序列不属于任何一张表,但是可以逻辑和表做绑定
  2. -- 序列:默认从1开始,依次递增,用于主键赋值
  3. -- dual:虚拟表,只是用来补全语法,没有任何存在意义
  4. create sequence s_person;
  5. select s_person.nextval from dual;

image.png

12.准备测试sql

如果你的版本还是12以前,那么可以执行下面命令

  1. -- 作为初学者,Oracle提供了测试案例,可完成大量学习
  2. -- 使用Scott用户,密码tiger
  3. -- 想要使用scott用户,需要在超级管理员解锁后才能使用
  4. -- scott用户不存在
  5. -- 创建scott用户
  6. CREATE USER c##scott IDENTIFIED BY tiger;
  7. -- 为用户授权
  8. grant connect,resource to c##scott;
  9. -- 设置用户使用的表空间
  10. ALTER USER c##scott DEFAULT TABLESPACE hikktn;
  11. ALTER USER c##scott TEMPORARY TABLESPACE TEMP;
  12. -- 解锁scott用户命令
  13. alter user c##scott account unlock;
  14. -- 解锁Scott用户的密码,该命令也可以用于重置密码
  15. alter user c##scott identified by tiger;
  16. -- 删除用户
  17. drop user c##scott cascade;

此SQL是从SCOTT用户里拷贝过来的,一些不明原因,无法使用scott用户,那么就直接使用自己创建的用户,运行一下下面的SQL,创建好一样的数据就行。

拷贝的路径 :

E:\software\WINDOWS.X64_193000_db_home\rdbms\admin\scott.sql

  1. DROP TABLE DEPT;
  2. CREATE TABLE DEPT
  3. (DEPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
  4. DNAME VARCHAR2(14) ,
  5. LOC VARCHAR2(13) ) ;
  6. DROP TABLE EMP;
  7. CREATE TABLE EMP
  8. (EMPNO NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY,
  9. ENAME VARCHAR2(10),
  10. JOB VARCHAR2(9),
  11. MGR NUMBER(4),
  12. HIREDATE DATE,
  13. SAL NUMBER(7,2),
  14. COMM NUMBER(7,2),
  15. DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO REFERENCES DEPT);
  16. INSERT INTO DEPT VALUES
  17. (10,'ACCOUNTING','NEW YORK');
  18. INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
  19. INSERT INTO DEPT VALUES
  20. (30,'SALES','CHICAGO');
  21. INSERT INTO DEPT VALUES
  22. (40,'OPERATIONS','BOSTON');
  23. INSERT INTO EMP VALUES
  24. (7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
  25. INSERT INTO EMP VALUES
  26. (7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
  27. INSERT INTO EMP VALUES
  28. (7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
  29. INSERT INTO EMP VALUES
  30. (7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
  31. INSERT INTO EMP VALUES
  32. (7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
  33. INSERT INTO EMP VALUES
  34. (7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
  35. INSERT INTO EMP VALUES
  36. (7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
  37. INSERT INTO EMP VALUES
  38. (7788,'C##SCOTT','ANALYST',7566,to_date('13-JUL-87')-85,3000,NULL,20);
  39. INSERT INTO EMP VALUES
  40. (7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
  41. INSERT INTO EMP VALUES
  42. (7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
  43. INSERT INTO EMP VALUES
  44. (7876,'ADAMS','CLERK',7788,to_date('13-JUL-87')-51,1100,NULL,20);
  45. INSERT INTO EMP VALUES
  46. (7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
  47. INSERT INTO EMP VALUES
  48. (7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
  49. INSERT INTO EMP VALUES
  50. (7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,NULL,10);
  51. DROP TABLE BONUS;
  52. CREATE TABLE BONUS
  53. (
  54. ENAME VARCHAR2(10) ,
  55. JOB VARCHAR2(9) ,
  56. SAL NUMBER,
  57. COMM NUMBER
  58. ) ;
  59. DROP TABLE SALGRADE;
  60. CREATE TABLE SALGRADE
  61. ( GRADE NUMBER,
  62. LOSAL NUMBER,
  63. HISAL NUMBER );
  64. INSERT INTO SALGRADE VALUES (1,700,1200);
  65. INSERT INTO SALGRADE VALUES (2,1201,1400);
  66. INSERT INTO SALGRADE VALUES (3,1401,2000);
  67. INSERT INTO SALGRADE VALUES (4,2001,3000);
  68. INSERT INTO SALGRADE VALUES (5,3001,9999);
  69. COMMIT;

image.png
image.png

13.单行函数

作用域一行,返回一个值

字符函数

转大写 upper

  1. -- 转大写
  2. select upper('yes') from dual;

image.png

转小写 lower

  1. -- 转小写
  2. select lower('YES') from dual;

image.png

首字符大写 initcap

  1. -- 首字符大写
  2. select initcap('hello') from dual;

image.png

左剪切 ltrim

  1. -- 左剪切
  2. select ltrim('xyzadmins','xyz') from dual;

image.png

右剪切 rtrim

  1. -- 右剪切
  2. select rtrim('xyzadmins','admins') from dual;

image.png

字符替换 translate

  1. -- 字符替换
  2. -- 返回将(所有出现的)from_str中的每个字符替换为to_str中的相应字符以后的string
  3. -- a 替换为1c替换为3
  4. select translate ('jack', 'abcd', '1234') from dual;

image.png

字符串替换 replace

  1. -- 字符串替换
  2. select replace ('jack and jue', 'j', 'bl') from dual;

image.png

字符串索引 instr

  1. -- 查找子串位置,返回该字段索引位置
  2. select instr ('worldwide', 'd') from dual;

image.png

截取字符串 substr

  1. -- 截取字符串,从第三个字符截取两个字符
  2. select substr ('abcdefg',3,2) from dual;

image.png

拼接字符串 concat

  1. -- 拼接字符串
  2. select concat ('hello','world') from dual;

image.png

数值函数

绝对值 abs

  1. -- 绝对值
  2. select abs(-15) from dual;

image.png

向上取整 ceil

  1. -- 向上取整
  2. select ceil(44.2) from dual;

image.png

正弦 sin

  1. -- 正弦
  2. select sin(1.34) from dual;

image.png

余弦 cos

  1. -- 余弦
  2. select cos(0) from dual;

image.png

向下取整 floor

  1. -- 向下取整
  2. select floor(100.2) from dual;

image.png

取余数 mod

  1. -- 取余数
  2. select mod(10,3) from dual;

image.png

四舍五入 round

  1. -- 四舍五入
  2. select round(1000.333,1) from dual;

image.png

数值截取 trunc

  1. -- 数值截取,不看后面位数的数字
  2. select trunc(100.256,2) from dual;

image.png

日期函数

当前时间 sysdate

  1. select sysdate from dual;

image.png

返回两个日期间的月份 months_between

  1. -- 返回两个日期间的月份
  2. -- 查询出emp表中所有员工入职距离现在几月
  3. select months_between (sysdate,e.hiredate) from emp e;
  4. -- 查询出emp表中所有员工入职距离现在几年
  5. select months_between (sysdate,e.hiredate)/12 from emp e;

image.png
image.png

转换函数

日期转字符串 to_char

  1. -- 日期转字符串
  2. select to_char(sysdate,'fm yyyy-mm-dd hh24:mi:ss') from dual;

image.png

字符串转日期 to_date

  1. -- 字符串转日期
  2. select to_date(' 2021-4-29 1:50:57','fm yyyy-mm-dd hh24:mi:ss') from dual;

image.png

通用函数 nvl

  1. -- 计算 null 使用nvl函数,返回0进行运算
  2. select e.sal +nvl(e.comm,0) from emp e;

image.png

通用函数 nvl2

  1. -- 判断nvl2函数里,如果第一参数为null,则返回第二个值,相反返回第三个值
  2. select e.sal +nvl2(e.comm,null,1) from emp e;

image.png

条件表达式

等值判断 mysql和oracle通用

  1. -- 等值判断
  2. select e.ename,
  3. case e.ename
  4. when 'SMITH' then '大笨蛋'
  5. when 'ALLEN' then '大聪明'
  6. else '无名'
  7. end
  8. from emp e;

image.png

范围判断 mysql和oracle通用

  1. -- 范围判断
  2. select e.sal,
  3. case
  4. when e.sal > 3000 then '高收入'
  5. when e.sal > 1500 then '中等收入'
  6. else '低收入'
  7. end
  8. from emp e;

image.png

oracle专用条件表达式

  1. -- oracle专用条件表达式
  2. select e.ename,
  3. decode( e.ename,
  4. 'SMITH' , '大笨蛋',
  5. 'ALLEN' , '大聪明',
  6. '无名'"绰号"
  7. from emp e;

image.png

14.多行函数

作用于多行,返回一个值

统计函数

总数 count

  1. -- 总数
  2. select count(1) from EMP e where e.empno > 7500;

image.png

最大 max

  1. -- 最大
  2. select max(COMM) FROM EMP;

image.png

最小 min

  1. -- 最小
  2. select min(COMM) FROM EMP;

image.png

平均 avg

  1. -- 平均
  2. select avg(COMM) FROM EMP;

image.png

总和 sum

  1. -- 总和
  2. select sum(COMM) FROM EMP;

image.png

15.别名

  1. -- 别名
  2. select e.sal as 工资 from emp e;
  3. select e.sal 工资 from emp e;
  4. select e.sal "工资" from emp e;

image.png

16.字符串连接 ||

  1. -- 字符串连接 ||
  2. select e.ename || ',' || e.empno "雇主姓名和编号" from emp e;

image.png

17.消除重复行 distinct

  1. -- 消除重复行
  2. select distinct e.deptno from emp e;

image.png

18.条件限定

区间查询 between … and …

  1. -- 区间查询
  2. -- 类似于查询工资1000元到2000元,没有符合条件时,默认返回1000
  3. select e.sal 工资 from emp e where e.sal between 1000 and 2000;

image.png

多条件查询 in ()

  1. -- 多条件查询
  2. -- 类似于 where sal = 800 or sal = 2000 or sal = 500
  3. select e.sal 工资 from emp e where e.sal in( 800 , 2000 , 500 );

image.png

模糊查询 like

  1. -- 模糊查询
  2. select * from emp e where e.ename like '%A%';

image.png

不为空查询 is not null

  1. -- 不为空查询
  2. select * from emp e where e.comm is null;

image.png

19.分组查询

  1. -- 查询每个部门平均工资
  2. select e.deptno , avg(e.sal) asal
  3. from emp e
  4. group by e.deptno;
  5. -- 分组查询 过滤查询
  6. select e.deptno , avg(e.sal)
  7. from emp e
  8. group by e.deptno
  9. having avg(e.sal) < 2500;
  10. -- 查询每个部门平均工资高于500员工
  11. select e.deptno , avg(e.sal)
  12. from emp e
  13. where e.sal > 500
  14. group by e.deptno;
  15. -- 查询每个部门平均工资高于500员工
  16. -- 查询平均工资低于2500的部门
  17. select e.deptno , avg(e.sal)
  18. from emp e
  19. where e.sal > 500
  20. group by e.deptno
  21. having avg(e.sal) < 2500;
  22. -- where having 区别
  23. -- wheregroup by 之前过滤, having group by 之后过滤

20.笛卡尔积

  1. -- 笛卡尔积
  2. select * from emp e, dept d;

image.png

21.等值连接

  1. -- 等值连接 (推荐)
  2. select * from emp e,dept d
  3. where e.deptno = d.deptno;

22.内连接

  1. select * from emp e inner join dept d
  2. on e.deptno = d.deptno;

23.简化等值连接 using

  1. -- 简化连接,必须是等值连接,且两表的列字段名称和类型相同
  2. select * from emp e inner join dept d
  3. using(deptno);

24.外连接

右连接

  1. -- 右连接
  2. select * from emp e right join dept d
  3. on e.deptno = d.deptno;

左连接

  1. -- 左连接
  2. select * from emp e left join dept d
  3. on e.deptno = d.deptno;

左连接和右连接区别
以那张表为主表查询并集,主表全部查询出来,次表必须等值后才能查询出

Oracle 专用外连接

右连接

  1. -- 右连接
  2. select * from emp e,dept d
  3. where e.deptno = d.deptno(+);

左连接

  1. -- 左连接
  2. select * from emp e,dept d
  3. where e.deptno(+) = d.deptno;

子连接

  1. -- 子连接
  2. -- 查询出雇员姓名,上级领导姓名
  3. select e1.ename , e2.ename
  4. from emp e1,emp e2
  5. where e1.empno = e2.mgr;
  6. -- 查询出雇员姓名,上级领导姓名,雇员的部门名称,领导的部门名称
  7. select e1.ename , e2.ename , d1.dname ,d2.dname
  8. from emp e1,emp e2, dept d1,dept d2
  9. where e1.empno = e2.mgr
  10. and d1.deptno = e1.deptno
  11. and d2.deptno = e2.deptno;
  12. -- 查询出雇员编号,雇员姓名,上级领导姓名,雇员的部门名称,领导的部门名称,工资等级
  13. select
  14. e1.empno, e1.ename, d1.dname,
  15. decode(s1.grade,
  16. 1,'一级',
  17. 2,'二级',
  18. 3,'三级',
  19. 4,'四级',
  20. 5,'五级') grade ,
  21. e2.empno,e2.ename,d2.dname,
  22. decode(s2.grade,
  23. 1,'一级',
  24. 2,'二级',
  25. 3,'三级',
  26. 4,'四级',
  27. 5,'五级') grade
  28. from emp e1,emp e2, dept d1 , dept d2, salgrade s1 ,salgrade s2
  29. where e1.mgr = e2.empno
  30. and d1.deptno = e1.deptno
  31. and d2.deptno = e2.deptno
  32. and e1.sal between s1.losal and s1.hisal
  33. and e2.sal between s2.losal and s2.hisal;

单行子查询

  1. -- 单行子查询,返回一条记录
  2. select * from emp where sal =
  3. (select sal from emp where ename = 'CLARK');

多行子查询

  1. -- 多行子查询,返回一个集合
  2. select * from emp where sal in
  3. (select sal from emp where deptno = 10);

例子:

  1. -- 查询每个部门最低工资,最低工资的员工姓名,以及该员工所在的部门名
  2. select t.deptno , t.msal,e.ename,d.dname
  3. from
  4. ( select deptno , min(sal) msal from emp group by deptno ) t, emp e, dept d
  5. where t.deptno = e.deptno
  6. and t.msal = e.sal
  7. and e.deptno = d.deptno;
  8. select e2.ename,e2.job,
  9. round(
  10. (select avg(e.sal)
  11. from emp e
  12. where e.empno = e2.empno),
  13. 2
  14. ) asal
  15. from emp e2
  16. order by e2.ename;

25.分页查询

  1. -- mysql中的limit一样的功能,Oracle里面没有limit关键字
  2. select * from emp e inner join dept d
  3. using(deptno) order by empno desc fetch next 5 rows only;
  4. -- 返回结果集前5
  5. select * from emp where rownum <= 5;
  6. -- 返回结果集第10行到100
  7. -- 排序操作会造成顺序乱掉
  8. select * from (select rownum rn,t.* from emp t) where rn<=100 and rn >=10;
  9. -- 多层嵌套rownum
  10. select rownum,t.* from (select rownum rn,e.* from emp e order by e.sal desc) t where rn<=100 and rn >=10;
  11. -- rownum 不能跳行
  12. -- 推荐使用
  13. select * from (
  14. select rownum rn, e.* from (
  15. select * from emp order by sal desc
  16. ) e where rownum < 11
  17. ) where rn > 5;