您的位置:首页 > 数据库 > Oracle

笔记:ORACLE数据库基础学习 第三天

2017-08-17 19:38 615 查看
--列别名
--当SELECT子句中一个字段是函数或者表达式
--那么在结果中该字段的名字就是这个函数或
--表达式,可读性差,为此可以为列提供一个列名,
--这样在结果集中会使用该列名作为该字段的名字。
--应当养成一个好习惯,即:凡是表达式或者函数都指定一个别名。
SELECT ename,sal+NVL(comm,0) total
FROM emp_gl;

--别名本身不区分大小写,若希望别名区分大小写或者
--别名中包含空格,那么需要使用双引号将其括起来。
SELECT ename,sal+NVL(comm,0) "Total"
FROM emp_gl;

--使用>,<,>=,<=,<>,!=,=
SELECT ename,sal FROM emp_gl
WHERE sal<2000;

SELECT ename,sal ,job FROM emp_gl
WHERE deptno<>10;

SELECT ename ,sal,hiredate FROM emp_gl
WHERE hiredate>TO_DATE('1982-1-1','YYYY-MM-DD');

--使用AND,OR关键字
SELECT ename,sal,job FROM emp_gl
WHERE sal>1000 AND job ='CLERK';

SELECT ename,sal,job FROM emp_gl
WHERE sal<1000 OR job='CLERK';

--OR的优先级低于AND,所以若希望提高OR的优先级,可以使用括号。

--工资大于1000的 职位是'SALESMAN'或者'CLERK'的员工
SELECT ename,sal,job FROM emp_gl
WHERE sal>1000 AND (job='SALESMAN' OR job='CLERK');

--LIKE用于模糊匹配字符串
--支持两个通配符:
--%:0-多个字符(任意个字符)
--_:单一的一个字符

--查看名字第二个字母是A的员工?
SELECT ename,sal,deptno
FROM emp_gl
WHERE ename LIKE '_A%';

--名字中含有K的员工?
SELECT ename,sal,deptno
FROM emp_gl
WHERE ename LIKE '%K%';

--IN(list) 和NOT IN(list)
--判断在列表中和不在列表中
--IN,NOT IN常被用在子查询上使用。

--查看职位是CLERK和SALESMAN的员工?
SELECT ename,job ,sal
FROM EMP_GL
WHERE job  IN('CLERK','SALESMAN');

SELECT ename
FROM emp_gl
WHERE sal BETWEEN 1500 AND 3000

--查看工资在1000-300之间,20-30号部门名字中含有A的员工
SELECT ename, sal, deptno ,job
FROM emp_gl
WHERE (sal BETWEEN 1000 AND 3000) AND (deptno IN(20,30)) AND ename LIKE '%A%';

--空值NULL是一个特殊的值,比较的时候不能日内该用“=”号,
--必须使用IS NULL,否则不能得到正确的结果。

--查询哪些职员的奖金数据为NULL
SELECT ename,sal,comm FROM emp
WHERE comm IS NULL

--ANY(list) ALL(list)
--ANY,ALL是配合>,>=,<,<=使用的
-->ANY(list):大于列表之一,大于最小
--ALL(list):大于列表所有,大于最大
--2000
GROUP BY deptno

--上面的SQL语句会抛出异常,WHERE子句中是不能使用聚合函数
--做为过滤条件的,原因在于过滤的时机不对。
--WHERE是伴随查询表中数据逐行进行过滤使用的,用来确定结果
--集中可以查询出的条目数。而聚合函数是建立在查询出来的数据
--基础上进行统计才能得到结果,所以使用聚合函数过滤应当是在
--WHERE之后进行的。
--HAVING子句可以根据聚合函数进行过滤,并且是用来根据条件过
--滤GROUP BY的分组。
--HAVING不能单独出现,不定义GROUP BY子句不能单独出现HAVING子句

SELECT AVG(sal),deptno
FROM emp_gl
GROUP BY deptno HAVING AVG(sal)>2000

--查看平均工资高于2000的那些部门的最高工资?
SELECT MAX(sal),deptno
FROM emp_gl
GROUP BY deptno HAVING AVG(sal)>2000

--关联查询
--关联查询的结果集中的字段来自多张表,这就需要在查询的时候
--联合多张表进行查询,根据给定的连接条件将表与表的数据建立
--对应关系,再分别从这些记录中提取要查询的字段来形成结果集
--中的每条记录。

--查看每个员工的名字以及其所在部门的名字?
SELECT ename,dname
FROM emp_gl,dept_gl
WHERE emp_gl.deptno=dept_gl.deptno

SELECT e.ename,e.deptno,d.dname
FROM emp_gl e,dept_gl d
WHERE e.deptno=d.deptno

--在进行关联查询时若有过滤条件,那么过滤条件必须与连接条件
--同时成立。

--查看在NEW YORK工作的员工都有谁?
SELECT e.ename,e.deptno,d.dname,d.loc
FROM emp_gl e,dept_gl d
WHERE e.deptno=d.deptno AND d.loc='NEW YORK'

--关联查询中不指定连接条件或者连接条件无效时,
--会产生笛卡尔积,这通常是一个无意义的结果!
SELECT e.ename,d.dname
FROM emp_gl e,dept_gl d;

--N表查询至少要有N-1个连接条件。

--内连接
--内连接也是用来完成关联查询的。
--采用JOIN...ON...的形式关联多表。

--查看每个员工的名字以及其所在部门
SELECT e.ename,e.deptno,d.dname
FROM emp_gl e JOIN dept_gl d
ON(e.deptno = d.deptno)

--将SCOTT的部门号改为50
UPDATE emp_gl
SET deptno=50
WHERE ename='SCOTT'

--不满足关联条件的记录不会被查询出来.

--外连接
--外连接在关联查询中除了可以将满足连接条件的记录
--查询出来之外,还可以将不满足连接条件的记录也列出来
--外连接分为:
--左外连接,右外连接,全外连接
--左外连接:以JOIN左侧表作为驱动表,该表记录都要
--查询出来,当某条记录不满足连接条件时,那么在结果
--集中该条记录来自JOIN右侧表的字段的值全部为NULL。
SELECT e.ename,e.deptno,d.dname,d.loc
FROM emp_gl e LEFT OUTER JOIN dept_gl d
ON(e.deptno=d.deptno)

SELECT e.ename,e.deptno,d.dname,d.loc
FROM emp_gl e,dept_gl d
WHERE e.deptno=d.deptno(+)

--右外连接
SELECT e.ename,e.deptno,d.dname,d.loc
FROM emp_gl e RIGHT OUTER JOIN dept_gl d
ON(e.deptno=d.deptno)

SELECT e.ename,e.deptno,d.dname,d.loc
FROM emp_gl e,dept_gl d
WHERE e.deptno(+)=d.deptno

--全外连接
SELECT e.ename,e.deptno,d.dname,d.loc
FROM emp_gl e FULL OUTER JOIN dept_gl d
ON(e.deptno=d.deptno)

--自连接
--自连接指的是当前表的一条数据可以对应当前表自己的多余数据
--自连接是为了解决数据的属性相同,但是本身又存在上下级关系
--的树状数据结构。

SELECT e.ename,m.ename
FROM emp_gl e,emp_gl m
WHERE e.mgr=m.empno(+)

SELECT e.ename,m.ename
FROM emp_gl e LEFT OUTER JOIN emp_gl m
ON e.mgr=m.empno
--1:查看工资高于2000的员工
SELECT ename,sal
FROM emp_gl
WHERE sal>2000;
--2:查看不是"CLERK"职位的员工
SELECT ename,job
FROM emp_gl
WHERE job<>'CLERK';
--3:查看工资在1000-2500之间的员工
SELECT ename,sal
FROM emp_gl
WHERE sal BETWEEN 1000 AND 2500;
--4:查看名字是以K结尾的员工
SELECT ename
FROM emp_gl
WHERE ename LIKE '%K';
--5:查看20,30号部门的员工
SELECT ename,deptno
FROM emp_gl
WHERE deptno IN(20,30);
--6:查看奖金为NULL的员工
SELECT ename,comm
FROM emp_gl
WHERE comm IS NULL;
--7:查看年薪高于20000的员工
SELECT ename,sal,sal*12
FROM emp_gl
WHERE sal*12>20000;
--8:查看公司共有多少种职位
SELECT DISTINCT job FROM emp_gl;
--9:按部门号从小到大排列查看员工
SELECT ename,deptno
FROM emp_gl
ORDER BY deptno ASC;
--10:查看每个部门的最高,最低,平均工资,和工资总和
SELECT MAX(sal),MIN(sal),AVG(sal),SUM(sal),deptno
FROM emp_gl
GROUP BY deptno;
--11:查看平均工资高于2000的部门的最低薪水
SELECT MIN(sal),deptno
FROM emp_gl
GROUP BY deptno HAVING AVG(sal)>2000;
--12:查看在NEWYORK工作的员工
SELECT e.ename,e.deptno,d.loc
FROM emp_gl e,dept_gl d
WHERE e.deptno=d.deptno;
--13:查看所有员工及所在部门信息,若该员工没有部门,则
--   部门信息以NULL显示
SELECT e.ename,e.deptno,d.dname
FROM emp_gl e,dept_gl d
WHERE e.deptno=d.deptno(+);
--14:查看ALLEN的上司是谁
SELECT e.ename,m.ename
FROM emp_gl e JOIN emp_gl m ON e.mgr=m.empno
WHERE e.ename='ALLEN';
--15:查看SMITH上司在哪个城市工作?
SELECT  e.ename,m.ename,m.deptno,d.loc
FROM emp_gl e JOIN emp_gl m ON e.mgr=m.empno
JOIN dept_gl d ON m.deptno =d.deptno
WHERE e.ename='SMITH';
--16:查看平均工资高于2000的那些部门名字以及所在城市?
SELECT e.deptno,d.loc
FROM emp_gl e JOIN dept_gl d
ON e.deptno=d.deptno
GROUP BY e.deptno,d.loc HAVING AVG(sal)>2000;
--17:在NEW YORK工作的员工有多少人?
SELECT COUNT(*)
FROM emp_gl e JOIN dept_gl d
ON e.deptno=d.deptno
WHERE d.loc='NEW YORK';
--18:在DALLAS工作的员工的平均工资是多少?
SELECT AVG(e.sal)
FROM emp_gl e JOIN dept_gl d
ON e.deptno=d.deptno
WHERE d.loc='DALLAS';
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle 数据库