sql/92标准可以使用using关键字来简化连接查询,但是只是在查询满足下面两个条件时,才能使
用using关键字进行简化。
1.查询必须是等值连接。
2.等值连接中的列必须具有相同的名称和数据类型。
例如:使用using关键字,如下:
|
select emptno,ename,sal,deptno,dname from emp e inner join dept d using(deptno);
SQL> select e.empno,e.ename,e.sal,deptno,d.dname from
2
emp e inner join dept d using(deptno);
EMPNO ENAME SAL DEPTNO DNAME
---------- ---------- ---------- ---------- --------------
7369
SMITH
800
20
RESEARCH
7499
ALLEN
1600
30
SALES
7521
WARD
1250
30
SALES
7566
JONES
2975
20
RESEARCH
7654
MARTIN
1250
30
SALES
7698
BLAKE
2850
30
SALES
7782
CLARK
2450
10
ACCOUNTING
7788
SCOTT
3000
20
RESEARCH
7839
KING
5000
10
ACCOUNTING
7844
TURNER
1500
30
SALES
7876
ADAMS
1100
20
RESEARCH
7900
JAMES
1800
30
SALES
7902
FORD
3000
20
RESEARCH
7934
MILLER
1300
10
ACCOUNTING
7935
XIAOXUE
5000
20
RESEARCH
|
已选择 15 行。
如上述的结果与自然连接的结果相同。
使用using关键字简化连接时,需要注意以下几点:
1.使用emp表和dept表中的deptno列进行连接时,在using子句和select子句中,都不能为deptno列指定表名或表别 名。
2.如果在连接查询时使用了两个表中相同的多个列,那么久可以在using子句中指定多个列名,形式如下:
|
select... from table1 inner join table2
using(column1,column2)
|
上述的语句相当于下面的语句:
|
select... from table1 inner join table2
on table1.column1=table2.column2
and table1.column2=table2.column2;
|
如果对多个表进行检索,就必须多次使用using关键字进行指定,形式如下:
select... from table1
inner join table2 using(column1)
inner join table3 using(column2);
|
上述的语句相当于下面的语句:
|
select... from table1,table2,table3
where table1.column1=table2.column1
and table2.column2=table3.table2;
|
http://blog.csdn.net/robertkun/article/details/10562807
1.静态SQLSQL与动态SQL
Oracle编译PL/SQL程序块分为两个种:
其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型;
另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,
那么Oracle的SQL引擎就无法在编译期对该程序语句进行确定,只能在用户输入一定的查询条件后才能提交给SQL引擎进行处理。
通常,静态SQL采用前一种编译方式,而动态SQL采用后一种编译方式。
本文主要就动态SQL的开发进行讨论,并在最后给出一些实际开发的技巧。
2.动态SQL程序开发
理解了动态SQL编译的原理,也就掌握了其基本的开发思想。
动态SQL既然是一种”不确定”的SQL,那其执行就有其相应的特点。Oracle中提供了Execute immediate语句来执行动态SQL,语法如下:
Excute immediate 动态SQL语句 using 绑定参数列表 returning into 输出参数列表;
对这一语句作如下说明:
1) 动态SQL是指DDL和不确定的DML(即带参数的DML)
2) 绑定参数列表为输入参数列表,即其类型为in类型,在运行时刻与动态SQL语句中的参数(实际上占位符,可以理解为函数里面的形式参数)进行绑定。
3) 输出参数列表为动态SQL语句执行后返回的参数列表。
4) 由于动态SQL是在运行时刻进行确定的,所以相对于静态而言,其更多的会损失一些系统性能来换取其灵活性。
为了更好的说明其开发的过程,下面列举一个实例:
设数据库的emp表,其数据为如下:
ID NAME SALARY
100 Jacky 5600
101 Rose 3000
102 John 4500
要求:
1.创建该表并输入相应的数据。
2.根据特定ID可以查询到其姓名和薪水的信息。
3.根据大于特定的薪水的查询相应的员工信息。
根据前面的要求,可以分别创建三个过程(均使用动态SQL)来实现:
过程一:
create or replace procedure create_table as
begin
execute immediate '
create table emp(id number,
name varchar2(10)
salary number; )'; --动态SQL为DDL语句
insert into emp
values (100,'jacky',5600);
insert into emp
values (101,'rose',3000);
insert into emp
values (102,'john',4500);
end create_table;
过程二:
create or replace procedure find_info(p_id number) as
v_name varchar2(10);
v_salary number;
begin
execute immediate '
select name,salary from emp
where id=:1'
using p_id
returning into v_name,v_salary;--动态SQL为查询语句
dbms_output.put_line(v_name ||'的收入为:'||to_char(v_salary));
exception
when others then
dbms_output.put_line('找不到相应数据');
end find_info;