oracle sql语句笔记(一)

2014-11-24 09:49:26 · 作者: · 浏览: 0

左外连接例子:

select employee_id,last_name,salary,department_id,department_name

from employees left join departments using(department_id)

(两个表使用department_id进行等值连接)

右外连接例子:

select employee_id,last_name,salary,department_id,department_name

from employees right join departments using(department_id)

(两个表使用department_id进行等值连接)

全外连接例子:

select employee_id,last_name,salary,department_id,department_name

from employees full outer join departments using(department_id)

(两个表使用department_id进行等值连接)

子查询(Sub Query)

问题引入:如何查得所有比“张三”工资高的员工信息

子查询

子查询在主查询前执行一次

主查询使用子查询的结果

语法格式:

select 字段列表

from table

where 表达式operator (select 字段列表from table);

使用子查询注意事项:

在查询是基于未知值时应考虑使用子查询;

子查询必须包含在括号内;

建议将子查询放在比较运算符的右侧,以增强可读性。

除非进行Top-N(即前几名)分析,否则不要在子查询中使用order by 子句;

对单行子查询使用单行运算符;

对多行子查询使用多行运算符;

单行子查询

单行子查询只返回一行记录;

对单行子查询可使用单行记录比较运算符;(=,>,>=,<,<=,<>不等于)

举例:select * from emp where sal>(select sal from emp where empno=7566);

子查询空值/多值的问题

如果子查询未返回任何行,则主查询也不会返回任何结果;

Select * from emp where sal>(select sal from emp where empno=8888);//8888是不存在的

如果子查询返回单行结果,则为单行子查询,可以在主查询中对其使用相应的单行记录比运算符;select * from emp where sal>(select sal from emp where empno=7566);

如果子查询返回多选择结果,则为多行子查询,此时不允许对其使用单行记录比较运算符。

select * from emp where sal>(select avg(sal) from emp group by deptno);//非法的,不可以这样做

Desc emploree//查询emploree表的结构

多行子查询

多行子查询返回多行记录,对多行子查询只能使用多行记录比较运算符(in,any,all)

in等于列表中的任何一个

Any和子查询返回的任意一个值比较;

All和子查询返回的所有值比较;

举例:

Select * from emp where sal>any(select avg(sal) from emp group by deptno);

Select * from emp where sal>all(select avg(sal) from emp group by deptno);

Select * from emp where job in(select job from emp ename='MARTIN' or ename='SMITH');

TopN查询

在ORACLE中通常采用子查询的方式来实现Top N查询

举例:select * from (select * from emp order by sal desc) where rownum<=5;

Rownum是伪列,必须在已经查询中的结果中才可以使用rownum,直接使用无效。例如:

Select * from employee where rownum<=5//非法,rownum不存在

Select rownum,a.* from(select * from emp order by sal desc) a;//正确使用rownum的例子

Select * from

(select rownum myno,a.* from(select * emp order by sal desc) a)

Where myno >=5 and myno <=10;

第章DML与事务控制

1 数据操作语言DML insert语句,update语句,delete语句,merge语句

2数据库事务控制

事务的概念,事务提交和回滚,自动提交,保存点和部分回滚。

Insert语句

1每次只能插入一条记录,缺省字段名列表时,应为新插入记录中的每个字段设定新值

也可以在insert语句中指定赋值字段列表,只为部分字段显示地设定值。其余字段为Null.

可以在insert语句中使用子查询,实现表间数据拷贝:

Insert into dept1(id,name) select deptno,dname from dept;

说明:此时不必再给出values子句。子查询中的值列表应与insert子句字段相对应。

Update语句

每次可更新多条记录,可使用where子句限定要更新的记录,如缺省的where子句,则更新表中的所有记录。

Update emp set sal=sal+99;

Update emp set sal=sal+99 where empno=7599;

Update student2

Set age=nvl(age,o)+1;

Delete语句

Delete语句每次可删除多条记录

可使用where子句,限定要删除的记录

Delete from table

Delete from table where empno=8888;

Merge语句

Merge语句用于进行数据合并,根据条件在表中执行数据的修改或插入操作,如果要插入的记录在目标表中已经存在,则执行更新操作,否则执行插入操作。

用法举例:

Create table test1 (eid number(10),name varchar);

Insert into test1 values(1001,'张三''20-5月-70',2300);

Insert into test1 values(1002,'李四''16-5月-70',2600);

Select * from test1;

Create table test2(eid number(10),name varchar2(20),birth date,salary number(8,2));

Select * from test2;

Merge into test2

Using test1

On (test1.eid=test2.eid)

When matched then

Update set na