下面sql語句 是依據 oracle下用戶scott/tiger下的emp表
新接觸的知識
1.出現在select列表中的字段或者出現在order by後面的字段,如果不是包含在分組函數中,那麼該字段必須同時在group by子句中出現.
出現在group by子句中的字段則不必須出現在select列表中.
2.如果沒有group by子句,select列表中不允許出現字段(單行函數)與分組函數混合使用的情況
例如
SELECT empno ,sal FROM emp; 合法
SELECT avg(sal)FROM emp;合法
SELECT empno,INITCAP(ename),AVG(sal) FROM emp;不合法
3.case 表達式
SELECT empno,ename,sal,
CASE deptno
WHEN 10 THEN '財務部'
WHEN 20 THEN '研發部'
ELSE '未知部門'
END 部門
FROM emp;
4.decode表達式
SELECT empno,ename,sal,
decode(deptno,10,'財務部門',
20,'研發部門',
'未知部門')部門
FROM emp;
5.在pl/sql developer中 使用select * from emp for update 然後點擊查詢結果集左上角的鎖 就能進行修改 也可以對一個列進行插入等操作
6. v_ename=&NAME; &表示可以接受鍵盤輸入 如果接受的是數字的話 直接輸入即可 例如: 2
如果接受的是字符型數據的話 需要在數據上加 單引號 例如 '張雲成'
-------------------------------------------------
1.獲取受僱日期的天數
SELECT ename,trunc(SYSDATE-hiredate)FROM emp;
SELECT ename,trunc(SYSDATE)-TRUNC(hiredate) FROM emp;
2.算出每個部門,每個職位的平均工資和平均獎金(平均值包括沒有獎金),如果平均獎金大於300,顯示"獎金不錯",如果平局獎金100到300,顯示
"獎金一般",如果平均獎金小於100,顯示"基本沒有獎金",按部門編號降序,平均工資降序排列.
SELECT AVG(sal),AVG(NVL(comm,0)),
CASE
WHEN AVG(NVL(comm,0))>300 THEN '獎金不錯'
WHEN AVG(NVL(comm,0))<=300 AND AVG(NVL(comm,0))>100 THEN '獎金一般'
ELSE '基本沒獎金'END 獎金狀況
FROM emp GROUP BY deptno,job
ORDER BY deptno DESC,AVG(sal) DESC;
3.得到工資大於自己部門平均工資的員工信息
SELECT e.*,m.avgsal
FROM emp e, (SELECT deptno, AVG(sal) AS avgsal FROM emp GROUP BY deptno)m
WHERE e.deptno=m.deptno AND e.sal>m.avgsal ;
4.兩表聯查
a: 1 b: 2
2 4
3 6
4
5
1):內連接
2 2
4 4
2)滿外連接
1
2 2
3
4 4
5
6
3)左連接
1
2 2
3
4 4
5
4)右連接
2 2
4 4
6
5.集合操作
建立一張只包含20部門員工信息的表
CREATE TABLE emp20 AS SELECT * FROM emp WHERE deptno=20;
參考資料:超詳細Oracle教程.pdf