oracle新接触的sql语句
下面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