oracle4

内连接

and where都允许,先过滤后连接

 

外连接分两种情况

and 在外连接之前,先对匹配表进行过滤,用关键字and

where 在外连接之后,需要通过匹配表的列对外连接结果集过滤时,用关键字where

对驱动表的过滤必须用关键字where

 

连接

从结果集的产生分类

cross join

inner join

       等值连接(两张不同表,描述共同属性的列)

       非等值连接 (between and)

           自连接(同一张表的不同列有关系)

outer jion

       等值连接(两张不同表,描述共同属性的列)

       非等值连接 (between and)

           自连接(同一张表的不同列有关系)

DML

insert into values 只能插入一条记录

insert into tabname values ('a','b',null,1)顺序(desctabname)

insert into tabname(c1,c2) values ('a','b')

insert into tabname select 插入多条记录

 

ORA-00947: not enough values

插入的值比表里的列少

ORA-00913: too many values

插入的值比表里的列多

 

rownum 伪列记录号,行号

rownum必须从1开始才能选出记录.

分页问题

第一页 whererownum <= 10

第二页

列出第3条至第6条记录

select rn,ename,salary

from ( select rownum rn,ename,salary

      from emp_hiloo

      where rownum <= 6)

where rn >= 3

排名问题

工资最高的前3名员工?

select rownum,ename,salary

from (select ename,salary

     from emp_hiloo

     order by salary desc)

where rownum <= 3

 

update

where 同select,确定哪些记录应该修改

set colname = value

set bonus = null  =表示赋值

where bonus = null   =表示相等 false

 

delete删除一条记录

delete from tabname

where 同 select 确定哪些记录应该删除

 

DDL

数据类型,约束

date

char 有缺省宽度为1,按定义长度存,取值若固定,用char,对空格不敏感

varchar2 必须定义宽度,按实际长度存,取值不固定,用varchar2,对空格敏感

 

DCL

grant

revoke

usera userb

如果用户userb想select用户usera下的某张表

connect usera/usera

grant select on tab1 to userb

connect userb/userb

select count(*) from usera.tab1;

如果用户usera不想userb select他下的某张表

connect usera/usera

revoke select on tab1 from userb;

 

TCl

transaction 事务

事务结束 commit(提交,入库)  rollback(回滚,取消操作)

DML 把旧数据放入rollback segment(回滚段 公共资源),

当你commit或者rollback,即事务结束回滚段里的数据释放.

 

commit/rollback

DMLS

commit/rollback

DDL是自动提交的

 

事务的并发操作,操作同一张表,定义事务的隔离级别,缺省事务的隔离级别read committed.读已经提交了的数据和本session正在处理的数据.

 

DML加锁方式

加锁粒度(级别) 表行

锁性质  共享排他

表级共享锁

行级排他锁

              表级共享锁    行级排他锁

s1           ok           ok

s2           ok           wait

s3           ok           ok

 

DDL加锁方式 DDL排他锁

ORA-00054: resource busy(资源忙,表忙,DML操作表) andacquire获得 with NOWAIT不等待 specified 指定

 

为什么要commit,rollback

1 你操作的数据其他session看不见

2 你加在表上的锁不释放,会阻塞其他人的操作

3 你占用的回滚段资源不释放

 

create table

课堂练习

1 哪些部门没有员工zhangwuji

select d.dname

from emp_hiloo e rightjoin dept_hiloo d

on e.deptno = d.deptno

and e.ename ='zhangwuji'

where e.empno is null

 

select d.dname

from (selectdeptno,ename from emp_hiloo

       where ename = 'zhangwuji')  e right join dept_hiloo d

on e.deptno = d.deptno

where e.empno is null

 

2 列出哪些员工的工资是3,5级

select e.ename,e.salary,s.grade

from emp_hiloo e join salgrade_hiloo s

on e.salary between s.lowsal and s.hisal

and s.grade in (3,5)

3 列出各个级别的人数(不包含0级)

select s.grade,count(s.grade)

from emp_hiloo e join salgrade_hiloo s

on e.salary between s.lowsal and s.hisal

group by s.grade

4 列出各个级别的人数(包含0级)

select s.grade,count(e.empno)

from emp_hiloo e right join salgrade_hiloos

on e.salary between s.lowsal and s.hisal

group by s.grade

 

5 用sql脚本,实现转账功能,创建一张账户表,两列(账号,余额),插入两条记录'a' 4000,'b' 100,完成转账,从账户'a'转1500元钱到账户'b'.

 

编写和运行sql脚步

1 在linux写完脚步文件,全选,拷贝,在26上用vi test.sql,按i,粘贴,按ESC,按:wq!,脚步文件里是sql语句,每条语句后有;

2 必须在test.sql的目录下执行,

%sqlplus openlab/open123 @test.sql,

或者在文件名前加上所在路径

sqlplus openlab/open123 @../test.sql

 

63月份入职的员工

SQL> select ename,hiredate

 2  from emp_hiloo

 3  whereto_char(hiredate,'fmMONTH') = 'MARCH';

 

 

 

课外练习

1 zhangwuji的领导是谁? (用 in)

select ename from emp_hiloo

where empno in (select mgr from emp_hiloo

                   where ename = 'zhangwuji')

2 zhangwuji领导谁?(用 in)

select ename from emp_hiloo

where mgr in (select empno from emp_hiloo

                where ename = 'zhangwuji')

3 哪些员工的工资比同职位的平均工资高?

select e.ename,e.salary

from emp_hiloo o

where salary > ( selectround(avg(salary)) from emp_hiloo i

                    where o.job = i.job)

 

select e.ename,e.job,e.salary,a.savg

from emp_hiloo e  join

         (select job,round(avg(salary)) savg

          from emp_hiloo

          group by job) a

on e.job = a.job

and e.salary > a.savg

4 zhangwuji的领导是谁? (用 inner join)

select e.ename,m.ename

from emp_hiloo e join emp_hiloo m

on e.mgr = m.empno

and e.ename = 'zhangwuji'

5 zhangwuji领导谁?(用 inner join)

select e.ename,m.ename

from emp_hiloo e join emp_hiloo m

on e.mgr = m.empno

and m.ename = 'zhangwuji'

6 各个部门的平均工资,列出部门名称,平均工资

select d.dname,round(avg(e.salary))

from emp_hiloo e join dept_hiloo d

on e.deptno = d.deptno

group by d.dname ---

select max(d.dname),round(avg(e.salary))

from emp_hiloo e join dept_hiloo d

on e.deptno = d.deptno

group by d.deptno

 

select d.dname,a.savg

from dept_hiloo d join

           (selectdeptno,round(avg(salary)) savg

            from emp_hiloo

            group by deptno) a

on a.deptno = d.deptno

 

7 哪些部门没有员工(用 outer join 用 not in)

select dname from dept_hiloo

where deptno not in (select deptno fromemp_hiloo)

 

select d.dname

from emp_hiloo e right join dept_hiloo d

on e.deptno = d.deptno

where e.empno is null

 

课后练习

1 列出按工资排名的第3名至第6名员工?

 

posted @ 2014-04-01 16:29  JAVA之迷  阅读(96)  评论(0编辑  收藏  举报