本笔记用vnote书写,格式有点飘,不过在vnote上浏览还是很清晰的,不打算整理,故放于此处

oracle入门

一、介绍oracle比mysql的复杂之处

1、MySQL 数据库

  • 概念
    mysql单个用户可创建的多个数据库。database是一个变量(url中标红处)。
  • 图片解析
    )

2、oracle 数据库

  • 概念
    oracle数据库是数据的物理存储。包括(数据文件ORA或者DBF、控制文件、联机日志文件、参数文件)。其实Oracle数据库的概念和其他数据库不一样,这里的数据库是一个操作系统只有一个库。可以看作是Oracle就只有一个大的数据库。用户是一个变量。
  • 图片解析
  • 实例:
    在oracle的数据库中,可以有多个实例,通常只用一个实例
  • 用户:
    一个实例下可以有多个用户,和多个表空间,每个用户需要有一个默认表空间(可以多个用户公用一个默认表空间,天然隔离不需要加锁访问)
  • 表空间:
    一个实例下可以有多个表空间,表空间是逻辑概念,一个表空间对应着一个或多个物理存储文件(.dbf或.ora)。
  • 用户和表空间的关系:
    一个用户有一个默认表空间。而且一个表空间是可以为多个用户作为默认表空间的,即便这样操作,用户和用户之间的数据也不会混,因为天然隔离。
  • oracle数据库源:
    driver:oracle.jdbc.OracleDriver
    url : jdbc:oracle:thin:@localhost:1521:orcl
    username: zhangsan
    passworle: zhangsan

本章总结

oracle中用户的概念,相当于,mysql中数据库(datebase)的概念。

二、oracle 命令行常用操作

1、登录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
###----------------------------------------
# # 代表注释 /
# $ 代表命令窗口 /
# SQL> 代表进入数据库后的命令 /
# > 代表执行结果(上一句是命令) /
###----------------------------------------
# sqlplus 用户名/密码 as sysdba;
$ sqlplus sys/sys as sysdba;
###
# 如果不是dba,我们普通用户直接使用(一般作为普通用户即可)
# sqlplus 用户名/密码
$ sqlplus name/passw
# 查看当前用户
SQL> show user
> USER 为 "NAME"
# 切换为管理员用户
SQL> conn sys/sys as sysdba;
> 已连接
# 切换为普通用户
SQL> conn name/passw
> 已连接
# 查看用户下的所有表
SQL> select * from tab;
# 查看某张表中的所有数据(如dept这张表)
SQL> select * from dept;
# 查看表的结构(如dept这张表)
SQL> desc dept;
# 系统管理员dba用户可以跨表查询(如name用户下的dept这张表)
SQL> select * from name.dept;

本章总结

我们不是数据库管理员,没必要把这些命令给整的很熟练。开发人员基本了解这些,会用图形界面验证–>准备封装到代码中的语句就可以了。

三、常用数据类型及SQL语句

1、常用数据类型

  • Number 数值类型 相当于mysql中的int, 例:
    Number(4) 最大长度为4的数值类型
    Number(4,2) 最大长度为4,整数位为(4-2),小数位为2
  • Varchar2
    最大长度为10的字符串,varchar2用于存储可变长度的字符串,varchar2把所有字符都占两个字节处理(一般情况下)。
    而varchar只对汉字和全角等字符占两字节,数字,英文字符等都是一个字节。
    varchar2把空串等同于null处理,而varchar仍按照空串处理。
    建议在oracle中使用varchar2。
  • Date
    时间类型

2、SQL语句

  • 1、SQL简介
    结构化查询语言,简称SQL。是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理数据库系统;同时也是数据库与脚本文件的扩展名。结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这是它具有极大的灵活性和强大的功能。
  • DML(数据库操作语言)
    其语句包括动词 INSERT,UPDATE 和 DELETE。他们分别用于添加,修改和删除表中的行。也称为动作查询语言。我们开发人员对DML使用的频率最高。
  • DDL(数据库定义语言)
    其语句包括动词 CREATE 和 DROP。在数据库中创建信标或删除表(CREAT TABLE 或 DROP TABLE)为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。
  • DCL(数据库控制语言)
    他的语句通过GRANT 或 REVOKE 获得许可, 确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT 或 REVOKE 控制对表单个列的访问。

本章总结

开发人员在代码中用的最多的是DML(数据库操作语言),做增删改查

四、查询语句

1、查询某张表中的 所有列 或 某一列

select *|列名 from 表名

查询某张表中的 所有列 或 某一列

  • select a,b,c from name
    从name这张表里查询a列,b列,c列这三列

2、给查询出来的列,取一个别名

select 列名1 as 列别名1,列名2 as 列别名2 from 表名 (推荐: 因mysql也这样用)
select 列名1 列别名1, 列名2 列别名2 from 表名

给查询出来的列,取一个别名(注:以上两种写法,oracle中第二种更常用, 如果你工作中还涉及mysql则推荐你使用第一种)

  • select a as 哈哈,b as 嘿嘿 ,c as 哇哇 from name
  • select a 哈哈,b 嘿嘿 ,c 哇哇 from name – 两种写法结果一样

3、注释

--
/* */

注释(注:以上两种写法皆可)

  • –这里是注释
  • /* 这里是注释 */

4、查询并消除列中的重复数据

select distinct 列名 from 表名

查询并消除列中的重复数据

  • select distinct a from name
    a列中如果有重复的字段,将会取集合
  • select distinct a,b from name
    a列 和 b列中同时有重复的字段,将会合并查询结果(即并不是想单个那样返回消除重复字段的集合结果,而是需要照顾差异,因此合并) -> [注意是合并,并不是消除失败]
  • select distinct a,b,c from name
    a列 和 b列 和 c列 中同时有重复的字段,将会合并查询结果(即并不是想单个那样返回消除重复字段的集合结果,而是需要照顾差异,因此合并) -> [注意是合并,并不是消除失败]

5、字符串连接查询

select '字符串1' || a || '字符串n' || b from 表名

字符串链接查询

  • select ‘哈哈’ || a || ‘嘿嘿’ || b || ‘哇哇’ || c from name
    哈哈a嘿嘿b哇哇c –假设的表头
    哈哈1嘿嘿2哇哇3 –假设的内容
    哈哈3嘿嘿5哇哇5 –假设的内容

6、查询时的四则运算(加减乘除)

select 列名1,列名2*11 from 表名 (列名2必须是数值类型)

查询时的四则运算(注:不推荐使用,会影响性能)

  • select a,b*55,c from name
    b必须是数值类型

7、限定查询 (带条件的查询)

select 列名 from 表名 where 条件

限定查询

  • select a,b from name where b>1500;
    一些常用条件
  • select a,b from name where b is not null;
    非空 IS NOT NULL (为空 IS NULL)
  • select a,b from name where b is not null and a>1000;
    多个条件 用 AND 做连接
  • select a,b from name where b is not null or a>1000;
    多个条件 用 OR 做连接
  • select a,b from name where not(b is not null or a>1000);
    非运算 NOT
  • select * from name where b between to_date(‘1981-3-4’, ‘yyyy-MM-dd’) and to_date(‘1982-5-17’, ‘yyyy-MM-dd’);

    between and 不仅可以使用在数值之间,也可以用在日期的区间
    列名 between 1500 and 3000 等价于 列名 >= 1500 and 列名 <=3000

  • IN 关键字 相当于连续的 OR

    列名 IN (50 , 100 ,14) 等价于 列名=50 or 列名=100 or 列名=14

  • NOT IN 关键字 相当于 连续的 OR 结果 加了个 非运算 NOT
  • 不等号有两种: <> 和 !=
  • oracle中’没有’ limit 关键字。 mysql中’有’limit关键字, 对于mysql, limit关键字主要用于指定查询结果从哪条记录开始显示,一共显示多少条记录;它有3种使用语法LIMIT 初始位置,记录数LIMIT 记录数LIMIT 记录数 OFFSET 初始位置

    用法中的’初始位置’从0开始算起。 如从第4行开始返回就指定为3。
    比如: ‘LIMIT 3 5’ 和 ‘LIMIT 5 OFFSET 3’ 的执行结果相同, 都是返回从第4条记录开始之后的5条记录。

08、模糊查询

select 列名 from 表名 where 列名 like '_M%'

模糊查询 like (其实也是限定查询中的一个常用条件)

  • select * from name where b like ‘_M%’
    查询b列中 第二个字母为M的

    模糊查询中的 ‘_’和’%’
    代表一个字符 _
    代表多个字符 %
    %% 作为全匹配使用

本章总结

本章节涉及到查询语句属于DML中开发人员的常用基础,需要刻意去记忆,多复习笔记

五、排序

1、在sql中,可以使用ORDER BY 对查询结果进行排序

SELECT *|列名 FROM 表名 {WHERE 查询条件} ORDER BY 列名1 ASC|DESC, 列名2 ASC|DESC

注意:

  • 1、ORDER BY 列名
    默认升序排列(也就是说可以省略ASC);如果降序排列(DESC必须写上)
  • 2、当排序列如示例语法有两个, 那就是在第一个列的排序遇到相同行时,在此基础上按后面第二列的条件继续排。依次类推。

本章总结

不管查询语句有多长,排序语句都要写在最后

六、Oracle中的函数

1、伪表概念(凭空获得数据)

当我们需要凭空获得一些值或数据的时候,只用 select 值|数据 这个语句时行不通的,一定要加 from 表名 才行。 这里的表名就可以用 伪表 dual

  • SELECT 1 FROM dual
    这个语句可以凭空获得一个数值 1

2、单行函数

01.字符函数

  • 1.把小写的字符转换成大写的字符
    upper(‘smith’)
    SELECT upper('smith') FROM dual –结果是 SMITH
  • 2.把大写的字符转换成小写的字符
    lower(‘SMITH’)
    SELECT lower('SMITH') FROM dual –结果是 smith
  • 3.把首字母大写
    initcap(‘smith’)
    SELECT initcap('smith') FROM dual –结果是 Smith
  • 4.字符串的连接可以使用concat 也可以使用“ || ”。建议使用后者
    concat(‘hello’,’world’)
    ‘hello’ || ‘world’ –建议使用
    SELECT concat('hello','world') FROM dual –结果是 helloworld
    SELECT 'hello' || 'world' FROM dual –结果是 helloworld –建议使用
  • 5.字符串的截取,使用 substr , 第一个参数是源字符串,第二个参数是开始索引,第三个参数结束的索引,开始的索引使用1和0效果相同
    substr(‘hello’,1,3) –索引是从1开始的,而1和0效果一样
    SELECT substr('hello',1,3) FROM dual –结果是 hel
  • 6.获取字符串的长度
    length(‘hello’)
    SELECT length('hello') FROM dual –结果是 5
  • 7.字符串替换,第一个参数是源字符串,第二个参数是被替换的字符串,第三个是替换字符串
    replace(‘hello’,’l’,’x’)
    SELECT replace('hello','l','x') FROM dual –结果是 hexxo

02.数值函数

  • 1.四舍五入函数
    round()
    SELECT round(12.534) from dual –结果是 13
    SELECT round(12.534,2) from dual –结果是 12.53
  • 2.去掉小数
    trunc()
    SELECT trunc(12.834) from dual –结果是 12
    SELECT trunc(12.838,2) from dual –结果是 12.83
  • 3.取余
    mod(10, 3)
    SELECT mod(10,3) from dual –结果是 1

03.日期函数

Oracle中提供了很多和日期相关的函数,包括日期的加减,在日期加减时有一些规律

  • 日期 - 数字 = 日期
  • 日期 + 数字 = 日期
  • 日期 - 日期 = 数字(天)
  • 范例:查询雇员进入公司的周数。
  • 分析:查询雇员进入公司的天数(sysdate - 入职日期)/7 就是周数
  • 1.查询当前日期
    sysdate
    SELECT sysdate from dual –结果是 当前的系统日期
  • 2.查询两个日期之间的月数
    months_between(日期1, 日期2)
    SELECT months_between(sysdate, 入职日期) from dual –结果是 月数
  • 3.获取几个月后的日期
    add_months(日期1, 月数)
    SELECT add_months(sysdate, 5) from dual –结果是 几个月后的 日期
  • 4.指定给出下次某日期数
    next_day(sysdate, ‘星期一’) –下一个星期一是什么日期
    SELECT next_day(sysdate, '星期一') from dual –结果是 下个星期一的 日期
  • 5.某日期月份的最后一天是什么日期
    last_day(sysdate) –当前日期月份最后一天的日期
    SELECT last_day(sysdate) from dual –结果是 当前日期月份最后一天的 日期

04.转换函数

  • 1.字符串转换函数
    to_char(sysdate, ‘yyyy’) –年
    to_char(sysdate, ‘mm’) –月
    to_char(sysdate, ‘dd’) –日
    to_char(sysdate, ‘HH’) –时 12进制
    to_char(sysdate, ‘HH24’) –时 24进制 (一般使用24进制)
    to_char(sysdate, ‘mi’) –分
    to_char(sysdate, ‘ss’) –秒
    to_char(sysdate, ‘fmyyyy-mm-dd’) –fm 会去掉前导0 (1997-08-24 -> 1997-8-24)
    总之 第二个参数 是一个通配格式 如还有一些不常用的 $美元 L人民币
    SELECT a, to_char(某日期列,'yyyy') 年, to_char(某日期列,'mm') 月, to_char(某日期列,'dd') 日 from name –结果是 把某 日期列 拆分成了别名分别为 年 月 日 的三列
  • 2.数值转换函数
    to_number(‘13’) –参数必须是数字的字符串
    SELECT to_number('10')+to_number('10') from dual –结果是 20
  • 3.日期转换函数
    to_date(‘1985-04-22 21:34:22’,’yyyy-mm-dd HH24-mi-ss)
    SELECT to_date('1985-04-22 21:34:22','yyyy-mm-dd HH24-mi-ss) from dual –结果是 日期

05.通用函数

  • 1.空值处理函数
    nvl(某列,0) –这里第二个参数0,代表遇到null就用0替换
    SELECT nvl(b,0) from name –结果是 b列是空值的行显示的是0
  • 2.Decode函数
    该函数类似 switch
    SELECT decode(参数,1,'我是1',2,'我是2','其他') from dual –结果是 参数匹配的字段后的字符串
    注意:这个函数很常用 参数可以是 数值。 也可以是 某一列的名字->这一列的变量一个一个的switch匹配后替换
  • 3.case when … then … when … then … else … end
    该函数类似case if … else if … else … end
    也就像:when -> if , then -> elif , else -> else 。 case end是代码块边界

本章总结

这些函数中,有些重要的可以记一下,并且其他的也最好能有个印象,知道在哪里查笔记

七、多表查询(重点)

1、多表连接基本查询

顾名思义,使用一张以上的表做查询就是多表查询

SELECT {DISTINCT} *|列名.. FROM 表明1 别名1, 表明2 别名2 {WHERE 限制条件 ORDER BY 排序字段 ASC|DESC...}

  • 解释:在多表联合查询时,查出的时多张表的笛卡尔乘积。所以需要在限制条件里做一些匹配,使其各章表中按指定的对应关系连接出查询结果。而某些时候表名会很长,我们一般给表起别名后,然后就可以更方便地使用表中的任意列了。
  • 技巧:可以通过别名多次使用同一张表,做列显示,和限定条件判断(避免一些逻辑冲突).

2、外连接(左右连接)

在做多表连接查询时,我们发现,当某些做为限制条件的数据只有单张表中存在的时候,由于限定条件的限制,这些数据就会被丢弃,查不出来。
所以我们引入外连接的概念: 外连接可以至少保证我们一张表的数据是全量的。

  • 语法: (+) –在限制条件中,要求谁是全量表,就放到其对面非全量表的后面
  • 解释: (+) 放到谁后面,谁就是非全量表,谁的对面就是全量表。 (全量表就是不会因为另一张表的数据关联而被筛选掉)
  • 技巧:做外连接查询的时候。全量表在左端就是左连接,在右端就是右连接。

3、sql1999 对 SQL 的支持

01.交叉连接 CROSS JOIN(了解)

  • 交叉连接会产生笛卡尔积 (相当于直接做多表连接查询)

02.自然连接 NATURAL JOIN (了解)

  • 自然连接会自动的分析管理条件进行连接,去掉笛卡尔积。 (基本外连接加上限制条件轻松做到)

03.USING 子句, 直接管理操作 (了解)

  • 这些能做到的,用普通多表外连接可以更容易的做到。 (了解有这个东西就行)

本章总结

SELECT 列名 FROM 表名 LEFT/RIGHT JOIN 全量列/非全量列 ON 条件 –左右连接通用方法

八、分组查询(重点)

1、分组函数

  • 1、 count() 计数
  • 2、 max() 最大
  • 3、 min() 最小
  • 4、 avg() 平均数
  • 5、 round() 用于把数值字段四舍五入为指定的小数位数。

2、分组统计

  • 1、SELEST 分组函数, 列名 FROM 表名 GROUP BY 列名 ORDER BY 列名

3、分组函数加条件

  • 1、 需要给分组函数加条件,不能用where,可以使用 HAVING 。之前表连接需要使用WHERE就正常用。

本章总结

在分组统计的时候,除了分组函数以外的结果列,必须是group by 后面分组中有的列(后面有的列前面才能有,后面没有前面绝对不能有)

九、子查询(重点)

1、子查询

所有的子查询必须在()中编写
子查询的操作中有三类

单列子查询: 返回的结果是一列的一个内容
单行子查询: 返回多个列,有可能是一个完整的记录
多行子查询: 返回多条记录

  • 1、exists(子语句有返回) 整体结果为真
  • 2、not exists(子语句无返回) 整体结果为真

2、并集

  • 3、union 对两个结果集进行合并操作(相当于两个都是子集),结果去重(不包括重复行)
  • 4、union all 对两个结果集进行合并操作,结果不去重(包括重复行)

本章总结

并集时要合并的列类型必须一致,列名可以不一致,结果列的数量必须一致

十、数据库的变更(增删改)(事务)(重点)

1、增删改

  • 1、增
    INSERT INTO 表名 values ( )
    – 表名后若不跟具体列名,则 values 后()中要按顺序填入每一列的新增值
    INSERT INTO 表名 (列名) values (列名对应新增值) 注意列名 和 新增值 相对位置一致

  • 2、改
    UPDATE 表名 SET 需要改的列名=值 where 条件
    – 这里的条件一般为限制修改哪一行的值等

  • 3、删
    DELETE FROM 表名 where 条件
    – 这里的条件如果没有就是删除整张表的数据
    Oracle中可以不写from,但是mysql不行, 而且mysql删除不能有表别名

2、事务

  • 增删改等引起数据库变更的操作,必须开启事务
  • 1、commit 提交
  • 2、rollback 回滚
  • 执行update修改数据时,没有提交之前事务是挂起状态,这时这条数据被锁住,如果其他并发者操作此数据,将会阻塞等待被锁住数据解锁后才能操作。
  • 3、SELECT * FROM 列名 FOR UPDATE;

本章总结

查询语句后面加上 for update 可使其加上事务锁,在处理并发业务时用得到。

十一、表的管理(重点了解)

  • 1、常用的数据类型

    No 数据类型 描述
    1 Varchar,varchar2 表示一个字符串
    2 NUMBER NUMBER(n)表示一个整数,长度是n
    NUMBER(m,n)表示一个小数,总长度是m,小数是n,整数是m-n
    3 DATA 表示日期类型
    4 CLOB 大对象,表示大文本数据类型,可存4G
    5 BLOB 大对象,表示二进制数据,可存4G
  • 2、建表

    语法:

    1
    2
    3
    4
    5
    6
    Create table 表名 (
    字段1 数据类型 [default 默认值],
    字段2 数据类型 [default 默认值],
    ...
    字段n 数据类型 [default 默认值]
    );

    例如:

    1
    2
    3
    4
    5
    6
    create table person(
    person_id number(4),
    pname varchar2(10),
    age number(3),
    birthday date
    );
  • 3、删表

    语法:

    1
    drop   table   表名;
  • 4、截断表

    –虽然效果也是删除一张表,不过这个不支持事务,无法回滚,需谨慎使用

    1
    TRUNCATE    TABLE     表名;
  • 5、表的修改

    在sql中,使用 alter 可以修改表

    • 添加语法:

      1
      ALTER TABLE 表名  ADD(列名1  类型  【DEFAULT 默认值】,列名2  类型  【DEFAULT 默认值】...)
    • 修改语法:

      1
      ALTER  TABLE 表名  MODIFY(列名1   类型   【DEFAULT  默认值】,  列名2   类型   【DEFAULT  默认值】。。。)
    • 注意:修改时,如果原有某列的数据长度为200, 则不可以吧该列修改成小于200的列.

本章总结

本章内容比较简单,但一定要会用,能看懂,而日常使用中,一般使用建表工具来做这些事情,可视化强。

十二、约束(重点)

在数据库开发中,约束是必不可少,使用约束可以更好的保证数据的完整性。

1、单表约束

01.主键约束(不能为空,且有唯一性)

主键约束都是在id上使用,而且本身已经默认了内容不能为空,可以在建表的时候指定。

  • 创建一张表,把pid作为主键

    1
    2
    3
    4
    create table person(
    pid namber(10) primary key,
    name varchar2(10)
    )
  • 还可以自定义主键名称(比如给主键pid起个叫ppppp的名字

    1
    2
    3
    4
    5
    create table person(
    pid namber(10) ,
    name varchar2(10),
    constraint ppppp primary key(pid)
    )

02.非空约束(不能为空)

语法:

1
2
3
4
create table person(
pid namber(10) not null,
name varchar2(10)
)

03.唯一约束(唯一性)

语法:

1
2
3
4
create table person(
pid namber(10) unique,
name varchar2(10)
)
  • 也可以自定义名称 (参考主键约束自定义名称)
    constraint 自定义名 unique(真实列名)

04.检查约束

使用检查约束可以来约束字段值的合法范围。

  • 范例:创建一张表性别只能是1或2

    1
    2
    3
    4
    5
    6
    create table person(
    pid number(10),
    name varchar2(10),
    gender number(1) check(gender in(1,2)),
    birthday date
    );
  • 也可以自定义名称 (参考主键约束自定义名称)

外键约束(不建议使用物理外键)

外键是两张表的约束。可以保证关联数据的完整性。

  • 范例:创建两张表,一张订单表,一张是订单明细表,订单和明细是一对多的关系。

    create table orders(
    order_id number(4),
    totalPrice number(7,2),
    order_time date,
    constraint orders_order_id_pk primary key(oredr_id)

    create table order_detail(
    detail_id number(4),
    item_name varchar2(10),
    price number(7,2),
    quantity number(4),
    order_id number(4), –另一个表的主键,因此插入时,另一个表中没有的数据不能插入
    constraint order_detail_id_pk primary key(detail_id)
    constraint order_deteil_order_id_fk foreign key(order_id) references orders(order_id)
    )
    –最后一句中使用 foreign key( ) references orders( ) 给两张表做了外键约束

    • 有外键约束关系的表,子表插入时有外键约束;主表删除数据和删除表是有外键约束,需要先子表删除数据和删除表。 如果在外键约束后 跟上on delete cascade 级联删除设置,就可以任意的删除主表内容了。

十三、rownum 和 分页 (重点)(注意: mysql使用limit即可)

oracle数据库不支持mysql、postgresql的limit功能,但是可以通过rownum来限制返回结果集的行数,达到同样的效果。

使用时需要注意, 如下例:

select rownum,t.* form emp t where rownum < 6;
rownum 大于号>, 所以下面的分页方式是错误的

select rownum,t.* form emp t where rownum > 5 and rownum < 11;

  • 正确的分页步骤:(通过子查询实现)
    • 第一步,查询全量的数据
      • select * from emp;
    • 第二步,以第一步的结果集作为一张表,限定条件是rownum小于结束行号, 结果列把rownum作为结果集
      • select rownum rw, a.* from (select * from emp) a where rownum < 11;
    • 第三步,以第二步的结果集作为一张表,限定条件是第二步的rownum列大于开始行号,结果列是*
      • select * from (select rownum rw, a.* from (select * from emp) a where rownum < 11) b where b.rw > 5;

####### 最终分页模板 #######
select
from (select rownum rw, a.
from (
select * from emp –这里就是需要分页的表
) a where rownum < 11) b –页码范围,结束行号
where b.rw > 5; –页码范围,开始行号

/* 像这种简单繁琐的东西,都是可以用写小脚本解决的

已知条件:
pageNo: 当前的页码
pageSize:每页记录数

未知条件:
startNum:开始行号
endNum: 结束行号

pageNo pageSize startNum endNum
1 5 0 6
2 5 5 11
3 5 10 16

公式:
startNum = (pageNo - 1)pageSize;
endNum = pageNo
pageSize + 1;
*/

十四、视图(一般不做增删改)

视图就是封装了一条复杂的查询语句

语法1: CREATE VIEW 视图名称 AS 子查询
范例: 建立一个视图,此视图包括了20部门的全部员工信息

create view empvd20 as select * from emp t where t.deptno = 20
视图创建完毕就可以通过视图来查询了
select * from empvd20

  • 创建视图的时候,后面查询的sql语句中不能有重复的列名

语法2: CREATE OR REPLACE VIEW 视图名称 AS 子查询
如果视图已经存在我们可以使用语法2来创建视图,这样已有的视图会被覆盖。

  • 对视图做修改,其实是修改视图对应的表的数据,视图不建议修改(跟mysql不一样)
  • 建议创建只读视图,在视图创建语句的末尾加上 with read only 使视图无法修改。

十五、序列(重点)

在很多数据库中都存在一个自动增长的列,如果目前想在 oracle 中完成自动增长的功能,则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理。

语法:
CREATE SEQUENCE 序列名

  • 下面写了一些语法内的可选项:
    • INCREMENT BY n
      –设置步长 (不设置时默认为1)
    • START WITH n
      –设置序列从几开始
    • {MAXVALUE/MINVALUE n|NOMAXVALUE}
      –设置 最大/最小值 数值|没有限制
    • {CYCLE|NOCYCLE}
      –设置 循环序列|不循环序列 循环序列就是到头了再走一圈
    • {CACHE n|NOCACHE}
      –关于序列缓存的设置

序列虽然是给某张表使用,但是序列和这张表并没有绑定关系,任何一张表使用这个序列都可以。

  • 操作序列的语法:
    –创建一个序列,给seqpersonid这张表来用
    create sequence seqpersonid;

    –查询序列的下一个值 (重点)
    select seqpersonid.nextval from dual; –每查一次,序列都会做一次自增

    –查询序列的当前值
    select seqpersonid.currval from dual;

十六、索引

索引是用于加速数据存取的数据对象,合理的使用索引可以大大降低 i/o 次数,从而提高数据访问性能。索引有很多种我们主要介绍常用的几种:
先问一个问题:为什么添加了索引之后,会加快查询速度呢?
回答:图书馆里,如果杂乱的放书,检索起来就非常困难,所以将书分类,然后再建一个箱子,箱子里放卡片,卡片里面可以按类查询,这样的话查询速度会快很多很多,这个就有点像索引。索引的好处就是提高你找到书的速度,但是正是因为你建了索引,就应该有人专门来维护索引,维护索引是要有时间精力等开销的,也就是说索引是不能乱建的。

因此我们建索引有个原则:如果有一个字段,不经常查询,就不要给他建索引。现在把书变成我们的表,把卡片变成我们的索引,就知道为什么索引会快,又是为什么会有开销。

主键 默认 自带索引
我们创建索引后,不需要主动使用,根据索引列查询时就自动使用了索引

  • 创建索引:

      1. 单例索引
        单例索引是基于单个列建立的索引,比如:
        CREATE INDEX 索引名 on 表明(列名)
      1. 复合索引
        复合索引是基于两个列或多个列的索引
        在同一张表上可以有多个索引,但是要求列的组合必须不重复
        CREATE INDEX 索引名1 on 表明(列名1,列名2)
        查询数据使用的时候,是由顺序的
        比如: CREATE INDEX 索引名2 on 表明(列名2,列名1)
        索引名2 和 之前的 索引名1 是两个索引
  • 索引使用的原则:

    • 在大表上建立索引才有意义
    • 在where子句后面或者是连接条件上建立索引 (一定程度上保证索引的使用率,避免创建出不使用的索引)
    • 索引的层次不要超过4层