1、 当条件中使用聚合函数时,必须使用having而不能使用where。
Select avg(sal), max(sal),depno from emp group by depno having avg(sal)>2000;
同时出现group by、order by和having时的使用顺序为:group by…having…order by…
2、 多列子查询
Select * from emp where (depno,job)=
(Select depno,job from emp where ename=’SMITH’);
3、 视图
视图定义:
create [or replacement] view
[模式名.] <视图名> [(<列名>{,<列名>})] as <查询说明> [with check option];
当指明了[with check option]时,更新该视图数据时,必须满足查询说明中的条件;如果不带该选项,则以后更新数据时不做查询说明的检查。
create view factorycreator as
select * from factory where factory_name=’beijing’ with check option;
删除视图
Drop view [模式名.] <视图名> [RESTRICT|CASCADE];
CASCADE:强制删除视图,并在删除试图前删除相关的依赖视图。RESTRICT:存在依赖视图则不删除该视图。
查询视图:虽然是虚表,但操作和基本表的查询雷同有单独查询和联合查询(略)。
视图更新
对它的更新操作最终转换为基表更新,那些不能转化为基本表的更新操作的视图更新是非法的。
DM系统规定下列情形之一则不允许更新视图:
1. 视图由两个以上基表导出;2.视图列是集函数或者视图的定义的查询说明带有group by 或having子句;3.视图建立在不允许更新的视图上。
视图优势:多角度观察同一数据;简化用户操作;数据安全;利于数据库重构。
4、 嵌入式SQL
嵌入式sql相对于普通sql就是能使用变量,可以嵌入到宿主语言中执行。变量可以分宿主变量、输入输出变量和指示符变量。
嵌入式SQL语法:exec sql <SQL语句>
输入变量:
exec sql begin declare section;
{
<宿主变量定义语句>
}
exec sql end declare;
<宿主变量定义语句>::=<宿主变量名><宿主变量数据类型>
eg:
exec sql begin declare section;
INT number;
CHAR stringc[20];
exec sql end declare;
指示变量:为了能够处理NULL,在主语言中引入了指示符变量,是跟在宿主变量后的一个数字。
exec sql begin declare section;
short str_indicator;
exec sql begin declar section
str_indicator=-1;
exec sql insert into T1 values(:number,:string: str_indicator);