Oracle数据库基础!

一、数据库:

  • 即一种数据的组织形式,用于存储数据;
  • SQL: 结构化查询语言,不区分大小写;
    • SQL语言种类:
      • DCL、数据库控制语言
        • 是数据库控制语言。是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句
      • DDL、数据库定义语言
        • DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。
      • DML、数据库操纵语言
        • 负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心
      • DQL、数据库查询语言
        • 数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHERE
  • Oracle: 甲骨文公司的产品

二、常用数据类型:

  • 数值型number
    • number(10,2) 整体长度为10位,小数位2位,整数位8位
  • 字符型:char
    • 不可变长度字符型
    • varchar2可变长度字符型
  • 日期类型Date
    • 日期格式为日月年: 10-10月-1999
      • 最大两个G长文本类型:long
      • 可直接存放字符
  • 大字段:
    • 字符为单位CLOB、
    • 字节为单位:BLOB

三、用户、数据库基本常识

  • 高级用户:
    • system
    • sys
  • 样本数据库
    • scott用户默认密码tiger
    • 解锁语句:alter user 用户名 account unlock;
    • SID唯一标识数据库的一个id,默认orcl
  • 约束:限制表中的列可以存放什么样的数据;
    • 例如:是否可以为空,是否可以重复,或者数据范围;
    • primary key 主键约束
      • 添加主键约束的列,该列数据不允许重复且不允许为空;唯一标示行记录;
    • not null不允许为空;
    • check一种检查约束,开发不用;

四、表操作

  • 1、表的创建:
    • create table 表名(列名 类型(长度 ) 约束,…)
  • 2、查看表结构: desc 表名;
  • 3、 数据插入语句:
    • insert into 表名 values(值,值,..)
    • 或者 insert into 表名(列,列..) values(值,值,…)
  • 4、查询所有行记录select语句
    • select 列名,… from 表名 [where 过滤条件]
  • 5、删除表数据(注意:删除行记录一般我们都根据主键列删除)
    • delete from 表名 [where 过滤条件]
  • 6、修改表数据(注意:修改行一般也是根据主键列进行修改,注意主键列永远不允许修改):
    • update 表名 set 列明=新数据,…. [where 过滤条件]
  • 7、表结构的操作:(了解)
    • (1)修改列名
      • alter table customer rename to cus; 将customer表重命名为cus
    • (2)修改列的类型
      • 如果该列不为空则,需要清空数据,再修改
      • update cus set cusdesc = null (清空数据)
      • alter table cus modify cusdesc varchar2(20)
    • (3)添加列
      • alter table cus add stuno number(15)
    • (4)删除列
      • alter table cus drop column stuno
    • (5)修改表名
      • alter table cus rename column cuaname to cusname;
      • 将表中cuaname改为cusname
  • 8、删除表
    • drop table 表名
  • 9、清空表数据
    • truncate table 表名
    • delete table 表名

五 、 查 询

  • 1、where子句(单表查询):where 关键词表示过滤,添加过滤条件;
    • (1) 常用的运算符:
      • where后面的 =号表示比较
      • > >= < <= !=
      • 空即null,表示什么都没有不等同于”
      • null不可以通过=比较
      • 不为空 is not null,为空 is null
      • null不允许使用=比较
    • (2)表示关系的运算符(and 、or、not、in、not in、between and、not between and)
      • ①and表示并且,要求两边条件同时满足
      • ②or表示或者,要求满足两边任意一个条件即可
      • ③in 表示在xx中存在,只能表示等值条件判断 not in 与in相反
      • ④between and 表示在xx和xx数值之间,包含这两个数,进行比较; not between and 不在xx和xx之间范围
    • (3)模糊查询like子句
      • 符号:_ 和% 两者用法:
        • _表示匹配一个字符
        • %匹配多个字符;
        • not like;
        • 注意:escape 表示指定谁是转义字符
  • 2、常用函数:注意:oracle中字符默认从1下标开始不是0下标

    • (1)字符操作函数
      • (1.1)concat(列,列) 连接两个字符
        • 例如:将Ename和JOb查询结果连接一起,起别名为ename_job
          • select concat(emp.ename,emp.job ) ename_job from emp
      • (1.2)substr(列,下标1开始,几个长度)截取字符
        • 例如:将ename 从2位置开始截取,3个字符
          • select substr(ename,2,3) from emp
      • (1.3)length(列)求字符长度
      • (1.4)instr(列,字符) 找字符所在位置 instr(列,找谁,从哪个位置找,找第几次出现的)
      • (1.5)lower(列) ,upper(列) 小写,大写转换
      • (1.6)initcap(列)将列数据开头字母大写,其他字符小写
      • (1.7) trim 去掉两边空 其他:ltrim(列) rtrim(列)
        • trim(‘字符1’ from ‘字符串2’)
          • 例如:select trim(‘b’ from ‘bab’ ) from dual
          • select trim(’ ’ from ’ ab’ ) from dual
          • select trim( ’ ba ’ ) from dual
          • select trim(leading ‘a’ from ‘aabbaa’) from dual; – 返回结果为:bbaa
          • select trim(trailing ‘a’ from ‘aabbaa’) froam dual;–返回结果为:aabb
          • select trim(both ‘a’ from ‘aabbaa’) from dual;–返回为:bb
      • (1.8)replace(列,字符,字符) 替换字符
        • 例如:select replace(ename,’MI’,’i’) from emp
      • (1.9)|| 连接符
        • 例如:查询empno,ename,job 显示为一列,逗号隔开 列别名为:res
          • select empno||’,’||ename||’,’||job res from emp
    • (2)数值函数:
      • (2.1)四舍五入操作 round函数 : round(列) 默认取整,四舍五入, round(0), round(列,值)
        • 例如:select round(sal,1) ,sal from emp
      • (2.2)截断数据 trunc(列)截断小数,即舍去小数位
      • (2.3)取余数运算MOD(列,列) 注意:oracle中不是%
        • 除法运算/符号
        • 注意:分母不可以为0
      • nullnull n u l l 参 与 运 算 结 果 是 什 么 ? n u l l
    • (3)其他函数

      • (3.1)查看系统当前时间 :sysdate
        • 例如:select sysdate from dual
      • (3.2)NVL(参数一,参数二) 第一个参数如果为null,则取第二个参数值否则还取参数一

        • 例如:select sal+nvl(comm,0) from emp 因为comm有为空的情况,如果为空,空参与运算,永远为空
        • NVL2(参数一,参数二,参数三) 参数一如果为空,取第三个参数,否则取第二个参数值
        • 例如:
          • select nvl2(comm,0,1) from emp
        • 例如:
          • 显示comm,sal,如果comm为空,则显示’无提成’
          • select sal, nvl(comm,’无提成’) from emp(错误,因为comm是number类型,则整体返回number,此时number中存放了这个字符)
          • 如何修改上面语句?
            • to_char可以将number->char
            • select sal, nvl(to_char(comm),’无提成’) from emp(正确)
      • (3.3) to_char 将number->字符型 或者将date->字符型

        • to_char可以对数值型数据、日期类型进行格式化
        • 格式化数字:to_char

          • 例如:查询Comm列,如果为空则显示no-comm
          • select nvl(to_char(comm),’no-comm’) from emp
          • 例如:将1234567.123456金额格式化为$1,234,567.12
            • select to_char(1234567.123456,’$999,999,999.00’) from dual
          • 例如1234567.123456格式为 ¥1234567.12
            • select to_char(1234567.123456,’L999999999.99’) from dual
        • 格式化日期:yyyy MM DD HH mi ss dy to_char

          • 例如:系统时间格式化为:2018-06-14 04:02:50 星期四
            • select to_char(sysdate,’yyyy-MM-dd HH:mi:ss dy’) from dual
          • 例如:系统时间格式化为:2018年6月14日 16:4:40
            • select to_char(sysdate,’Fmyyyy”年”Monthdd”日” HH24:mi:ss’) from dual
            • 注意:to_char方法格式化日期时,第一个参数必须是日期类型,否则错误
            • FM表示去掉数字前的0
            • 24表示24小时制
            • Month表示月份全称,含有汉字月
        • 字符转为数值型:to_number

          • 例如:将¥1234567.12 字符转为number类型
            • select to_number(‘¥1234567.12’,’L99999999999.99’) from dual
          • 例如:123.00是字符,如何转number
            • select to_number(‘123.00’) from dual
        • 字符转为日期:to_date

          • 例如:
            • select to_date(‘1999-10月-10日 23:12:13’,’yyyy-Month-dd”日” HH24:mi:ss’) from dual
            • select to_date(‘10-10月-1999’) from dual;
      • (3.4)日期操作函数:

        • ①add_months 向日其中添加多少个月份
          • select add_months(‘10-10月-1999’,3) from dual
        • ②next_day 求某一个日期下一个星期几,十几号?
          • 例如:求员工入职后,第一个星期五是几号
            • select next_day(hiredate,’星期五’),hiredate from emp
        • ③last_day 求某一个日期,所在月最后一天十几号?
          • 例如:求2018-6-14该日期,上个月第一天日期
            • select last_day(add_months(sysdate,-2))+1 from dual
        • ④months_between 求两个日期之间的月份数
          • 例如:查询哪些已经转正的人员信息(试用期三个月)
            • select *from emp where months_between(sysdate,emp.hiredate)>=3
  • 4、排序
    • 排序 order by 永远写在语句末尾; 升序 asc 降序 desc
      • 例如:查询员工信息,按照部门编号和工作种类排序, 按照部门编号降序,按照工作种类升序
        • select *from emp order by deptno desc,job asc
  • 5、去重 distinct
    • select distinct job ,deptno from emp
  • 6、别名
    • 目的是简化表名和列名
    • select emp.empno emp_num,emp.ename as “name” from emp order by deptno desc,job asc
  • 7、分组查询 group by
    • 组函数(聚合函数):注意:组函数忽略空,解决方法:nvl函数
    • avg 平均值
    • sum 求和
    • count求行记录数
    • max 最大值
    • min最小值
    • 注意:分组查询时,组函数列和非组函数列,同时出现在select或者having 后面,此时必须将非组函数列,在group by后声明
    • where 跟group by同出现,不能直接跟在group by后,只能放在表名后出现,表示先过滤后,再分组
    • where后面不允许跟组函数,使用having,having后面可以跟组函数,但是后面非组函数列也需要group by后面声明
    • having表示分组统计后的结果,进行过滤
  • 8、多表关联查询:避免出现笛卡尔积
    • 等值关联查询
      • select * from emp,dept where emp.deptno=dept.deptno
    • 不等值关联查询
      • select * from emp,salgrade where emp.sal between salgrade.losal and salgrade.hisal
    • 自然联接查询
      • 等值条件查询的一种,要求表盒表之间有同名的列,且类型一致;则自动关联
      • select * from emp natural join dept
        • emp表和dept表自然联接查询,他们有相同列名
    • 左外联接、右外联接、全联接
      • left outer join on 左表都显示,右表显示匹配数据,不匹配显示null
        • select * from emp right outer join dept on emp.deptno=dept.deptno
      • right outer join on 右侧表都显示,左侧显示匹配关联条件的,不匹配则显示null
        • 本质上和左外联接一样,只要交换表的位置即可
      • full join on 匹配不匹配的都显示
    • 内联接
      • inner join 等同于等值关联查询
      • select * from emp inner join dept on emp.deptno=dept.deptno
        and dept.deptno=20
    • 自联接
      • select e.*,d.empno,d.ename from emp e,emp d
        where e.mgr=d.empno
  • 9、序列:
    • 在数据库中一组自增的数据;sequence,可视化工具创建sequence即可; 查看序列值select cus_seq.nextval from dual;
  • 10、子查询

六、事务,索引,视图,权限,PLSQL

  • 1、事务:
    • 即数据库端的一组执行单元(多个insert、dlete),要么都执行,要么都不执行,恢复原始状态;
    • 事务提交:commit;
    • 事务回滚:rollback
    • 好处,目的,特性:
      • 为了保证数据的: 一致性、隔离性、原子性、持久性
    • 场景:批处理(连续新增、修改、删除)
      • 例如:对删除数据进行数据备份到xx表中,然后对xx进行修改
    • 扩展阅读!什么是ACID??
  • 2、索引:index
    • 目的:加快数据的检索速度
    • 保存于数据库服务器端,注意:添加唯一约束和主键、外键约束默认已经加了索引;因此根据id和外键约束或者唯一约束的列,查询速度要快;
    • 索引如何创建:例如:对ename,job添加索引
      • create index emp_name_index on emp(ename,job)
    • 表删除,索引自动删除
    • 什么时候使用索引?
      • 查询数据作为where子句,且数据量大(存在计算),过滤的数据存在大量空(查询数据占据比例低)
    • 索引会根据列前后顺序依次效果削弱
    • 注意:不是所有列都要加索引
    • 索引的实现方式
      • 散列表,B+树红黑数,位图索引;
    • 分类
      • 唯一索引
      • 主键索引
      • 聚集索引
  • 3、视图:
    • view 是数据库服务器端的一个虚拟的表,这个表是一个查询结果集;简化SQL
    • 解决:SQL过长,复杂的SQL存储在服务器端实现执行,完成数据的过滤(虚拟的表,查询结果);
    • 修改删除新增不允许去操作视图;
    • 开发时是否建立视图,要看项目具体要求;
  • 4、权限:

    • 对象权限和系统权限;

      • 1、创建一个用户
        • create user my_user identified by admin;
      • 2、给用户创建表权限、登录、创建视图、创建序列、索引、存储过程、只能访问scott中emp表数据
        • grant create table,unlimited tablespace,
          create session,create view,create any index ,create procedure ,
          create sequence to my_user
      • 访问scott用户中emp表:

        • grant select on scott.emp to my_user

        • 可修改scott中emp表ename和sal列权限

          • Grant update(ename,sal) on scott.emp to my_user;
        • 注意如果加with grant option 表示,当前用户具有的权限,可以再次传递给(赋予)子用户;
          • grant select on scott.emp to my_user with grant option
      • 3、撤销创建存储过程、访问scottemp表数据权限

        • revoke select on scott.emp from my_user

        • revoke create table,unlimited tablespace,create procedure from my_user

  • 5、PLSQL
    • 过程化sql语言;即对SQL语句的拓展;
    • 数据类型:int、number、char、varchar2、boolean、date、exception、
    • 游标、%rowType %表名.列明 %type 记录record
      • 静态游标:隐式和显示游标;
      • 动态游标:弱类型游标和强类型游标
    • :=表示赋值, =表示比较
    • 存储过程和自定义函数区别: 前者重在处理复杂数据库端业务逻辑;没有返回值;后者有返回值,可以在sql中执行使用;
点赞