C/C++教程

Oracle学习笔记22(续)

本文主要是介绍Oracle学习笔记22(续),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.连表查询(99语法)

(1)笛卡尔积也叫交叉连接

注:非* 必须区分 使用表名 或别名.区分

查询所有的员工信息和部门信息

select * from emp cross join dept;

(2)内连接分为两种:等值连接和非等值连接。

(2.1)等值连接

等值连接又分为:自然连接、using连接

(2.1.1)自然连接(自动根据同名字段,主外键关联关系 字段做等值连接)

注意: 在自然连接中同名字段不能指明出处

查询所有员工的部门编号

select deptno from emp e natural join dept d;

(2.1.2)using连接

查询所有员工的部门编号

select deptno from emp e inner join dept d using(deptno);

注意: 在join using中同名字段不能指明出处

(2.2)非等值连接

   (2.2.1)on 连接(可以做等值连接,也可以做非等值连接)

                语法:数据源1 join 数据源2 on 表连接条件

        查询所有员工的部门编号

        select e.deptno from emp e join dept d on e.deptno = d.deptno;(做等值连接)

        查询员工信息以及员工工资等级信息

        select * from emp e inner join salgrade s on e.sal between s.losal and s.hisal;(做非等值连接)

 (3)外连接:有的表中的数据不满足连接条件也能显示

             外连接分为:左外连接(left join)、右外连接(right  join)、全连接(full join)

             全连接是两张表都作为主表

  查询所有的员工的上级领导

  select * from emp e1 left join emp e2 on e1.mgr=e2.empno;(左外连接)

2.其他函数

(1)decode (condition,case1,express1,case2 , express2,….casen , expressn, expressionm)

(判定字段,值1,结果1,值2,结果2...,默认值)

查找所有员工的姓名,并将部门为10、20的改为十、二十

select ename,decode(deptno, 10,'十',20,'二十') from emp;

行转列

select name,
       max(decode(course, '语文', score)) 语文,
       min(decode(course, '数学', score)) 数学,
       min(decode(course, '英语', score)) 英语
  from tb_student group by name;

 (2)case when then else end

查询部门编号,部门名称、工作地点 并增加一列将部门编号10、20改为十、二十其他的编号改为其他字符

select deptno,dname,loc, (case deptno when 10 then '十' when 20 then '二十' else '其他' end)中文名称 from dept;

3.rowid 与 rownum(作为伪列存在)

(1)rowid : 行记录的地址,行的唯一标识,数据插入到表中的是决定

可以实现去重: 对没有主键|唯一字段的表中多条完全重复的数据,根据rowid实现去重
去重: 如果表中存在主键或者唯一字段,直接 根据主键或者唯一字段去重

(2)rownum :结果集的序号
        规律: 从1开始,每次+1

一个select查询语句就有一个结果集,每一个结果集中数据都有自己的序号-->rownum
注意: 当需要使用rownum进行一些判定,需要对一个已经确定的结果集的rownum进行判定

rownum与排序: 
      一般规律为:
              根据非主键字段排序,先确定rownum再排序
              根据主键字段排序,先排序,后确定rownum  

实现在有排序存在的情况下,保证rownum是规律的,从小到大的
select empno,ename,sal,rownum num from (select empno,ename,sal from emp order by sal);

4.视图与索引

(1)视图:建立在表|结果集|视图上的虚拟表,有以下作用

        1. 简化:select 查询语句,提高复用性

        2. 重用:封装select语句 命名

        3. 隐藏:内部细节

        4. 区分:相同数据不同查询

不是所有的用户都有创建视图的权限

        1. 前提: create view -->组 connect resource dba

        2. 授权: -->sqlplus /nolog

                a)、sys登录 conn sys/123456@orcl as sysdba

                b)、授权: grant dba to scott;

                        回收: revoke dba from scott;

                c)、重新登录

视图分为:

  •         逻辑视图: 不会存储数据,数据来资源原始表结构,起到封装,简化,提高复用性的作用
  •         物理视图: 真实存储数据

语法:create or replace view 视图名 as select语句 [with read only];

注:不加语句末尾不加with read only时,删除或者改变视图中的数据时原有表机构中的数据也会更改。

(2)索引

索引: 提高查询速度的一种手段 -->目录

        1、唯一性较好字段适合建立索引

        2、大数据量才有效果

        3、主键|唯一: 唯一索引

  •         帮助提高查询效率
  •         索引为表中的字段添加索引
  •         大量数据的前提下,通过索引对某个字段的数据做查询,效率会大大提高
  •         索引也是对象,需要通过是数据库维护
  •         索引类似与目录
  •         如果大量做根据字段做查询,少量做增删适合使用索引
  •         如果大量根据字段做增删,少量查询,每次增删数据需要根据维护索引,会降低效率
  •         oracle自动为主键添加索引

语法:create index 索引名 on表名 (字段列表...)

为emp表的sal字段添加索引

create index index_emp_sal on emp(sal);

删除索引

drop index index_emp_sal;

5.表的设计

要想设计一张表皮前提是满足三范式要求
三范式:  

                1)列不可再分,字段的原子性  

                2)定义主键(唯一+非空),确定唯一  

                3)拆分表,通过主外键约束定义两张表的关系 ,消除传递依赖,避免数据的过渡冗余

1. 确定表名

2. 确定字段名 类型 +约束(主键 外键 非空 默 检查认 唯一)

        主键: 唯一标识一条记录(唯一并且非空)

         唯一: 唯一

        非空:不能为空

        默认: 当没给值时使用给定一个默认值 外键:参考其他表(自己)的某个(某些)字段

        检查:自定义的规则

添加约束
          主键约束 : 唯一+非空   primary key
          唯一约束 : unique
          非空约束 : not null
          默认约束 : default(默认值)
          外键约束 : references 
          检查约束 : check(检查条件)

语法格式:create table 表名( 字段名 类型(长度) 约束, ...其他字段.... ..约束........ );

这篇关于Oracle学习笔记22(续)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!