Oracle 学习:PL/SQL循序渐进全面学习教程
课程五 子查询
本课重点:
1、在条件未知的情况下采用嵌套子查询
2、用子查询做数据处理
3、子查询排序
注意:以下实例中标点均为英文半角
一、概述:
子查询是一种SELECT句式中的高级特性,就是一个SELECT语句作为另一个语句的一个段。我们可以利用子查询来
在WHERE字段中引用另一个查询来攻取值以补充其无法事先预知的子结果。
子查询可以用在WHERE子句,HAING子句,SELECT或DELETE语句中的from 子句。
注意:1、子查询必须在一对圆括号里。
2、比较符号:>, =, 或者 IN.
3、子查询必须出现在操作符的右边
4、子查询不能出现在ORDER BY里 (试题中有时出现找哪行出错)
二、子查询的执行过程:
NESTED QUERY MAIN QUERY
SQL> SELECT dept_id SQL> SELECT last_name, title
2 from s_emp 2 from s_emp
3 WHERE UPPER(last_name)=’BIRI’; 3 WHERE dept_id =
这里 ,每个查询只运行一次。当然,子查询要首先被执行,大家设想一下,如果子查询中有一个以上的人的
LASTNAME为BIRI,会如何?-----会出错,因为不能用=来连接。
ORA-1427: single-row subquery returns more than
one row
以上的查询也被称之为 单行子查询。
DELECT子查询实例:
delete from new_table where cata_time > to_date('19990901','yyyymmdd') and pro_name=(
select pro_name from new_product where pro_addr in ('bj','sh'))
三、子查询中的GROUP 函数的应用
实例 1:
SQL> SELECT last_name, title, salary
2 from s_emp
3 WHERE salary <
4 (SELECT AVG(salary)
5 from s_emp);
实例2:
选择出工资最高的员工的家庭住址:
select emp_addr from employees where salary =
(select max(salary) from employees);
这是一个简单实用的例子,可以衍生出很多情况,在实际应用经常出现,请大家多多思考。
实例3:
SQL> SELECT dept_id, AVG(salary)
2 from s_emp
3 GROUP BY dept_id
4 HAVING AVG(salary) >
5 (SELECT AVG(salary)
6 from s_emp
7 WHERE dept_id = 32);
子查询被多次执行,因为它出现在HAV
相关文档:
5.2 Clustered Indexes(聚集索引) (page 122)
聚集索引決定了一個表數據的物理排列順序,所以,一個表隻能有一個聚集索引。圖5.1表示了一個聚集索引的結構。
Figure 5.1
The structure of a clustered index
一個聚集索引的最底& ......
Vista出了名的兼容性问题多,很多人也苦于SQL SERVER不能安装在Vista下。现在我将自己的安装过程说下:
操作系统:Windows Vista Home Basic
处理单元:Inter P8600 2.40GHz
主存储器:2G
外存储器:250G
软件准备:(都可以在微软官方网站找到,均免费)
1.SQL SERVER 2005 EXPRESS(40.6M ......
这sql 语句写的真的很不错!
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([col1] bigint,[col2] varchar(6),[col3] varchar(6))
insert [tb]
select 130126200201000275,'王文霞','靳川川' union all
select 130126200201000275,'王文霞','靳澤' union all
select 13012620 ......
【SQL SERVER 数据库实用SQL语句】
1.按姓氏笔画排序:
Select * from TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as
2.分页SQL语句
select * from(select (row_number() OVER (ORDER BY tab.ID Desc)) as rownum,tab.* from 表名 As tab) As t where rownum between 起始位置 And 结束位置
......
1: 加大回滚段(可以给500M甚至1G)
2:分段commit
iCount :=1;
for rec in cur_name loop
insert into table_name (.....);//DML Lanaguage
if iCount =2000 then
commit;
iCount:=0;
else
iCount:= iCount +1;
......