-
自连接:通过别名,将同一张表视为多张表
实例:查询员工姓名和员工的老板姓名【使用员工表】
查看全部 -
外连接:把对于连接条条件不成立的记录,仍然包含在最后的结果中;
左外连接:当连接条件不成立的时候,等号左表的表仍然被包含; where e.deptno=d.deptno(+) [写法与叫法相反]
右外连接:当连接条件不成立的时候,等号右边的表仍然被包含; where e.deptno(+)=d.deptno
查看全部 -
笛卡尔集:行数:表行数相乘;列:列数相加;【笛卡尔集:数据不一定都是正确的】
在实际运行环境下,应避免使用笛卡尔全集
查看全部 -
需要在,from 后面 是员工表和部门表在where等值连接=
SQL
查看全部 -
层次查询:自连接的优化查询。
level:树的深度,层次。类似序列号。
connect by pripro 上一层的员工号等于这层的老板号。
from emp connect by pripro empno=mgr
start with mgr is null;
自连接存在的问题:
(1)自连接不适合操作大表,也就是记录多的表,原因是自连接至少有两张表参与,并进行笛卡尔全集,连接之后的记录数就是单张表记录数的平方(笛卡尔积行数是两张表行数的乘积),如果有三张表记录数就是原来的三次方,如果原来的表包含的记录数过多,连接之后的结果就会很大,所以自连接不适合操作大表。解决办法:层次查询。注意层次查询是单表查询,不存在第二张表!因为只有在一张表的情况下才不会产生笛卡尔积,才能解决这个问题。
层次查询在某些情况下可以替代自连接,本质上是单表查询。
例:
select empno,ename,sal,mgr
from emp //层次查询只涉及一张表
connect by prior empno=mgr //层次查询的条件不用where表示,而用connect by表示,上一层的员工号=当前曾的老板号
start with mgr is null或者start with empno=7839; //stsrt with表示从何处开始遍历查询,只有从根节点开始时才可以使用 * is null 的格式,其余节点都只能使用第二种格式。
此外层次查询的树的深度用level表示,可以在select语句中加入level就可以得到深度的查询结果,还可以对查询结果进行排序如order by 1;
比较自连接和层次查询的优劣:
自连接得到的查询结果比较直观但是不适合操作大表;
层次查询只涉及一张表,不产生笛卡尔积,但是得到的结果不够直观。
所以不同的查询语句有不同的特点,不是万能的!查看全部 -
Group by
·在SELECT 列表中所有未包含在组函数中的列都应该包含在GROUP BY 子句中
·包含在GROUP BY 子句中的列不必包含在SELECT 列表中
select a,b,c,组函数(x) from table group by a,b,c;
select avg(sal) from emp group by deptno;
select deptno,job,sum(sal) from emp group by deptno,job;查看全部 -
一、分组函数
AVG:平均值。
SUM:求和。
MIN:最小数。
MAX:最大值。
COUNT:计算个数。
WM_CONCAT:行转列。
查看全部 -
null会导致计算错误,需要使用nvl函数转为非空值
select count(nvl(comm,0)) from emp;
注意:sum(comm)/count(*):统计的是所有人的平均值(含该项为null的人员)
sum(comm)/count(comm)&avg(comm)是统计comm非空的人员平均数
查看全部 -
select deptno 部门号,wm_concat(ename) 部门中员工的名字--wm_concat行列转置 from emp group by deptno;
查看全部 -
group by rollup(a,b)
相当于
group by a,b
+
group by a
+
group by null
例:
select deptno,job,sum(sal) from emp group by rollup(deptno,job);
先按照不同部门不同职位查出薪资总和显示(deptno,job,sum(sal))
再按照不同部门查出薪资总和显示(deptno,sum(sal))
再查出薪资总和显示(sum(sal))
修改报表格式(只在sqlplus中有效):
break on deptno skip 2
相同的部门号(deptno)只显示一次,不同的部门号跳过两行。
set pagsize 30
让每页显示30条记录。查看全部 -
order by子句
示例:求每个部门的平均工资,要求显示:部门号,部门的平均工资,并按照工资升序排列
可以按照:列、别名、表达式、序号进行排序
select deptno,avg(sal) from emp group by deptno order by avg(sal);
select deptno,avg(sal) 平均工资 from emp group by deptno order by 平均工资;
select deptno,avg(sal) 平均工资 from emp group by deptno order by 2;
sqlplus的另一个小技能: a命令:-append;a命令表示在上一条命令后面追加语句,a命令后必须跟两个或两个以上的空格,若只打一个空格则追加语句紧跟上一条语句最后一个单词拼接
/表示执行
查看全部 -
Group by
·在SELECT 列表中所有未包含在组函数中的列都应该包含在GROUP BY 子句中
·包含在GROUP BY 子句中的列不必包含在SELECT 列表中
select a,b,c,组函数(x) from table group by a,b,c;
select avg(sal) from emp group by deptno;
select deptno,job,sum(sal) from emp group by deptno,job;查看全部 -
分组函数会自动过滤空值
例子:平均工资
select sum(sal)/count(*) , sum(sal)/count(sal) , avg(sal) from emp ;- count(*) 会包含空值的个数
- 分组函数会自动过滤掉空值
- nvl函数 使得分组函数不忽略空值
- nvl(comm,0) 这个函数的意思是 当该字段为空的时候返回第二个参数,当字段不为空 返回他本身
- 这个函数可用于自增的输入nvl(max(sno),0))+1 最大值加一 可用于插入数据的编号
查看全部 -
Having
查看全部 -
testtetetete
查看全部
举报