OCP SQL 学习笔记

看执行计划:set autot traceonly,退出看set autot off

第6章 表连接

自然表连接:

1.nature join: 可省去where条件,会自动匹配列名相同的列,如有多列相同,不建议用此法

                语法:select employee_name, department_id

              from  employees nature join departments

2.using: 只能匹配1列,与nature join互斥,不能连用.可用where,用连接字段再判断时不能加前缀

                语法:select employee_name, department_id

              from  employees join departments

              using (department_id)

3.on: 条件判断时如有别名,需加前缀

                通用语法:select last_name, department_id

              from employees e join departments d

                on (e.department_id = d.department_id)

     oracle语法:select last_name, department_id

                  from employees e, departments d

                 where (e.department_id = d.department_id)

自连接:

实例:SELECT worker.last_name emp, manager.last_name mgr

      FROM   employees worker JOIN employees manager

        ON    (worker.manager_id = manager.employee_id)

 

非等价连接:

实例-给员工工资分级  select e.last_name, e.salary, j.grade_level

                      from   employees e join job_grades j

                        on     e.salary

                     between j.lowest_sal and j.highest_sal

 

外连接:

1.inner join

2.left join

3.left outer join

    通用语法:SELECT e.last_name, e.department_id, d.department_name

              FROM   employees e left outer join departments d

                ON   (e.department_id = d.department_id)

   oracle语法:SELECT e.last_name, e.department_id, d.department_name

              FROM   employees e ,departments d

                ON   (e.department_id = d.department_id(+))

 

3.right join

4.right outer join

  通用语法:SELECT e.last_name, d.department_id, d.department_name

              FROM   employees e right outer join departments d

                ON    (e.department_id = d.department_id)

oracle语法:SELECT e.last_name, d.department_id, d.department_name

              FROM   employees e, departments d

                ON    (e.department_id(+) = d.department_id)

5.full join

6.full outer join

       通用语法:SELECT e.last_name, d.department_id, d.department_name

                  FROM   employees e full outer join departments d

                    ON   (e.department_id = d.department_id)

    oracle语法:SELECT e.last_name, d.department_id, d.department_name

                  FROM   employees e,departments d

                  WEHRE (e.department_id(+) = d.department_id)

                    AND (e.department is null)

:能用UNION ALL的时候尽量不用UNION,UNION需要排序,消耗CPU,UNION ALL的效率比UNION高

 

嵌套子查询:

1.in

      通用实例:select e.empno, e.deptno

                     from emp e

                     where e.deptno in (select d.deptno

                                            from dept d

                                           where d.loc = ‘CHICAGO’)

    更高效率的写法:select e.empno, e.deptno

                     from emp e, dept d

                     where (e.deptno = d.deptno) and  (d.loc = ‘CHICAGO’)   

总结:外连接比子查询效率高

 

 

笛卡尔集

多表连接,没有连接条件,或者连接条件少了,都会产生笛卡尔集

1.cross join

       通用语法:SELECT last_name, department_name

                  FROM   employees

                 cross join departments

 

第七章 子查询

注:单行子查询要用单行操作符,多行子查询要用多行操作符

用命令查看详细错误:

a.host

b.oerr 错误编号

 

1.实例:查出department_id为null的员工信息

                select * from employees

        where sys_op_map_nonnull (department_id)=(select sys_op_map_nonnull(department_id)

                                                    from emplyees

                                                   where department_id = 178)

注:sys_op_map_nonnull 是内部函数,帮助文档里找不到,会把NULL值自动转换为‘FF’,即可找到department_id为null的employee

 

2.实例: 各个部门有多少个员工

                select dname, (select count(*)

                       from emp

                     where emp.deptno = dept.deptno) cnt

       from dept

 

3.标量查询实例

                select XX

        from dept

        where XX = f()   --查询某个函数的返回值,有多少条就计算多少次,效率较低

效率高的方法:

                select XX

        from dept

        where XX = (select f() from dual) --函数只查询一次,计入缓存,效率较高

4.any

       > any(子查询) --大于任何一个值

                < any(子查询) --小于任何一个值

                = any(子查询) --相当于in

5.all

       >all(子查询)

       <all(子查询)

       =all(子查询) --无意义,没有等于all,就是查询全部

6.exist / not exist:是效率最高的去重方法

 

7. in / not in:如果子查询里有任何一条为NULL,主query里查出来的也全都是null,下面的方法可以解决这个问题

                实例:select emp.last_name

              from employee emp

             where emp.employee_id in (select emp.employee_id

                                         from employees emp

                                        where emp.employee is not null

                                                                                                and emp.department_id = 123)

总结:相关子查询比外连接的效率高,相关子查询指外部查询的列在子查询的where条件中用到

 

第八章 集合

1.UNION / UNION ALL:查出全部,UNION会去掉重复记录,但先要排序再工作,效率较低。UNION ALL会把重复记录也查出来,不排序,但效率较高

2.INTERSECT:把重复记录查出来,尽量少用,效率较低。先排序A,再排序B,在结合起来找相同的记录,可以用UNION ALL/exist代替,后者效率较高

3.MINUS:二者之间不同的地方查出来,相当于A表减B表

4.order by:默认用查出的第一列升序ASC排序

 

总结:union/intersect/miuns对NULL值的处理

实例:   select 1,2,null from dual

        union

       select 1,2,null form dual

union/intersect/miuns:会合并成同一行,把NULL值作为相同的值进行处理

 

第九章熟练操作数据

1.insert/update/delete

2.merge 适用于批处理,有效防止

                语法 merge int tb_name

            using (table|view|sub_query)

            on (join condition)

            when matched then

              update set ---无需加列名

                       col1 = col1_value

              col2 = col2_value

             when not matched then  ---10g以后这段,如果无需insert可以不加

                                insert (column_list) values(column_values)

3.delete和trancate,前者是DML语句后者是DLL语句,delete可以rollback,trancate删完以后释放空间

4.save point: 断点保存,可以部分回滚

5.commit/rollback:set autocommite off的情况下,用于事务,保证数据的一致性

:DDL/DCL会自动提交,或者退出sqlplus没有提交的情况下,也会自动提交。如果系统意外中断,会自动回滚

6.for update:先锁定查出来的记录,用来update/delete,但是其他用户不可以对这些数据进行任何其他update/delete操作,必须rollback/commit才能释放

                语法:SELECT employee_id, salary, commission_pct, job_id

              FROM employees 

              WHERE job_id = 'SA_REP'

              FOR UPDATE

                                ORDER BY employee_id;

  另一种情况:SELECT employee_id, salary, commission_pct, job_id

              FROM employees 

              WHERE job_id = 'SA_REP'

              FOR UPDATE nowait

                                ORDER BY employee_id;

注:加上nowait,当别的用户也使用这些记录时,报错通知用户此数据正在被占用,节省等待时间

 

 

第九章 表管理

1.约束

       语法 alter table t add constraint t_pri primary key(id)[on delete cascade]

on delete cascade:当删除子表的某列时,主表里这个字段也相应删除,但会产生级联情况,用起来危险

2.create table XXX as (sub_query)

所有sub_query里的not null约束,会自动继承到新表里,主键/唯一/外键约束都不会继承

3.11g新功能,可以使整个table ready only/ready write

4. 表drop掉以后,如何找回

flashback table "垃圾箱里对应的名字" to before drop

不想以后找回,永久drop:drop table table_name perge;

2.索引

最多24层,层层消耗一样,称为balance

 

posted on 2013-01-15 15:20  Alice Sun  阅读(193)  评论(0编辑  收藏  举报

导航