ORACLE Unit03 SQL(基础查询) 、 SQL(关联查询)

列别名

当SELECT子句中查询的列是一个函数或者表达式时,那么查询出来的结果集中对应的该字段的名字就是这个函数或者表达式的名字。为此可以为这一列添加别名,这样结果集中该字段就使用别名作为该列的名字。
若希望别名区分大小写或者含有空格,那么该别名可以使用双引号括起来。

SELECT ename,sal*12 "s al"
FROM emp
AND,OR

AND优先级高于OR,可以通过括号提高优先级。

SELECT ename,job,sal
FROM emp
WHERE sal>1000
AND job='SALESMAN'
OR job='CLERK'
LIKE可以模糊匹配字符串

支持两个通配符:
%:任意个字符(0-多个)
_:单一的一个字符

查看名字第二个字母是A的员工:

SELECT ename,sal,deptno
FROM emp
WHERE ename LIKE '_A%'
IN(list)与NOT IN(list)

判断在列表中或者不在列表中。
常用在判断子查询的结果。

BETWEEN…AND…

判断在一个区间范围内

查看工资在1500到3000之间的员工信息

SELECT ename,sal,deptno
FROM emp
WHERE sal BETWEEN 1500 AND 3000
ANY,ALL

配合>,>=,<,<=判断使用,判断一个列表中的内容是否满足要求
ANY(list):大于列表之一即可(大于最小)
ALL(list):大于列表所有(大于最大)
ANY,ALL通常用在子查询结果的判断上。

DISTINCT关键字

对结果集指定字段值重复的记录行去除。

SELECT DISTINCT job FROM emp

对多列去重是指:这这些列的值的组合没有重复

SELECT DISTINCT job,deptno FROM emp
ORDER BY子句,用于结果集排序

ORDER BY只能写在DQL的最后一个子句中
ORDER BY可以对结果集按照给定字段的值
进行升序(ASC)或降序(DESC)进行排序

查看公司的工资排名?

SELECT ename,sal
FROM emp
ORDER BY sal DESC

多字段排序是有优先级的,首先按照第一个字段的排序规则对结果集排序,当第一个字段有重复值时再按照第二个字段的值排序,以此类推。

SELECT ename,deptno,sal
FROM emp
ORDER BY deptno,sal DESC

排序的字段若含有NULL值,NULL被认作最大值。

SELECT ename,comm
FROM emp
ORDER BY comm 
聚合函数

聚合函数也称为:多行函数,分组函数
聚合函数是用来统计结果集中的数据的
四个对值进行统计的函数:MAX,MIN,AVG,SUM
一个对记录数统计的函数:COUNT

统计公司工资的最大值与最小值

SELECT MAX(sal),MIN(sal)
FROM emp

公司的工资总和和平均值?

SELECT SUM(sal),AVG(sal)
FROM emp

查看公司总共多少人?

SELECT COUNT(ename)
FROM emp

聚合函数忽略NULL值。

SELECT SUM(comm),AVG(NVL(comm,0))
FROM emp

SELECT NVL(comm,0) FROM emp

统计一张表记录总数常用:

SELECT COUNT(*)
FROM emp


SELECT AVG(sal) FROM emp
WHERE deptno=20

分组

GROUP BY子句

GROUP BY子句可以将结果集按照指定字段进行分组,分组原则为该字段值一样的记录看作一组,配合聚合函数可以进行细致的统计。

查看每个部门的平均工资?

SELECT AVG(sal),deptno
FROM emp
GROUP BY deptno

查看每个职位的平均工资与工资总和?

SELECT AVG(sal),SUM(sal),job
FROM emp
GROUP BY job

GROUP BY可以按照多字段分组,分组原则为这几个字段值的组合相同的记录看作一组

查看同部门同职位的员工各多少人?

SELECT COUNT(*),deptno,job
FROM emp
GROUP BY deptno,job

查看部门的平均工资,前提是该部门
平均工资要高于2000

SELECT AVG(sal),deptno
FROM emp
WHERE AVG(sal)>2000
GROUP BY deptno

WHERE中不能使用聚合函数作为过滤条件,原因在于过滤时机不对。WHERE是在第一次查询表中数据进行过滤的,逐行过滤,将满足条件的记录查询出来。
聚合函数是建立在结果集基础上进行统计的。这已经是在WHERE之后进行了。

HAVING子句

HAVING子句必须跟在GROUP BY子句之后,用来对GROUP BY分组后对每一个分组进行过滤。
HAVING可以使用聚合函数并根据结果来取舍分组。

查看部门的平均工资,前提是该部门平均工资要高于2000

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

查看平均工资高于2000的部门的最高工资与最低工资分别是多少?

SELECT MAX(sal),MIN(sal),deptno
FROM emp
GROUP BY deptno
HAVING AVG(sal)>2000

查看平均工资高于2000的职位各多少人?

SELECT COUNT(*),job
FROM emp
GROUP BY job
HAVING AVG(sal)>2000

关联查询

关联查询的结果集中字段来自多张表联合查询的结果。
关联查询的关键在于连接条件,即:表之间数据的对应关系。

查看每个员工以及其所在部门的名称?

SELECT e.ename,e.deptno,d.dname
FROM emp e,dept d
WHERE e.deptno=d.deptno

关联查询中连接条件要与过滤条件同时成立!
查看在NEW YORK工作的员工?

SELECT e.ename,d.dname,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno
AND d.loc='NEW YORK'

关联查询中不添加链接条件或链接条件无效则会出现笛卡儿积,这通常是一个无意义的结果集。
笛卡儿积的记录数是由参与查询的表的记录数乘积得到。

SELECT d.deptno,d.dname
FROM dept d

不满足连接条件的记录是不会被查询出来的。

SELECT e.ename,d.dname
FROM emp e,dept d
WHERE e.deptno=d.deptno

查看KING在哪个城市工作?

SELECT e.ename,d.loc
FROM emp e,dept d
WHERE e.deptno=d.deptno
AND e.ename='KING'

关联查询中N张表关联查询,至少要有N-1个连接条件。

内连接

内连接也是用来完成关联查询的。

SELECT e.ename,d.loc
FROM emp e JOIN dept d
ON e.deptno=d.deptno
WHERE e.ename='KING'
外连接

外连接在进行关联查询时除了可以将满足连接条件的记录查询出来之外,也可以将不满足连接条件的记录列出来。
外连接分为:左外连接,右外连接,全外连接
左外连接:以JOIN左侧表作为驱动表(所有记录都会列出来),那么当驱动表中不满足连接条件的记录来自右侧表中的字段值为NULL。

SELECT e.ename,d.dname
FROM emp e 
 LEFT|RIGHT|FULL OUTER JOIN 
dept d
ON e.deptno=d.deptno


SELECT e.ename,d.dname
FROM emp e,dept d
WHERE e.deptno=d.deptno(+)
自连接

当前表的一条记录可以对应当前表自己的多条记录这样的设定就是自连接。
自连接保存属性相同的数据但是之间有存在上下级关系的树状结构数据使用。

SELECT empno,ename,mgr
FROM emp

查看每个员工的名字以及其上司的名字?

SELECT e.ename,m.ename
FROM emp e,emp m
WHERE e.mgr=m.empno
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值