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);