主要针对以下问题进行讲解:
1.列别名和表别名
2.select…from where…group by….having….order by…
3.order by 排序 正序,逆序,单列排序,多列排序
4.rownum rowid Oracle的伪列
5.函数:单行函数(日期函数,字符函数,数学函数,转换函数,其他),多行函数
6.聚合函数(max ,min avg,sum,count)
7.group by 分组
8.having关键字
1.列别名和表别名
加类别名
语法: 字段名 as 字段别名
select ‘dear ‘||ename from emp;
针对表中字段的别名称为列别名
第一种写法: select ‘dear ‘||ename as 姓名 from emp;
as 是可以省略的
第二种写法:别名可以加双引号 select ‘dear ‘||ename “姓名” from emp;
双引号可以省略
有一种情况双引号不能省略:别名中有空格,双引号不能省略
表别名
语法 : 表名 表别名
–查询10部门的员工的姓名和工作
select ename,sal,job from emp where deptno=10;
–给emp表一个别名 语法 : 表名 表别名
select e.ename,e.sal,e.job from emp e where e.deptno=10;
select ename,sal,job from emp e where deptno=10; 一张表可以这样不会出问题,但是多张表后就不可以了。
--规则:一旦给了表别名后,所有字段的使用都要:表别名.字段名
-- 注意 :表别名是没有as的
2.select…from where…group by….having….order by…
注意事项:(1)select ...from...必不可少的
eg:select sysdate from dual;
(2)该语句的执行顺序,按照这样的顺序where...group by...having...order by...
(3)这些关键字不能掉换顺序,可以没有,但是如果有的话,是不能掉换顺序的
3.order by 排序 正序,逆序,单列排序,多列排序
单列排序
问题:查询emp表中员工的姓名,工资,按照工资降序排序
select ename,sal from emp order by sal desc;
问题:查询emp表中员工的姓名,工资,按照工资升序排序
select ename,sal from emp order by sal asc;
asc可以省略,默认情况下就是升序排列
--总结:语法结构:select....from...order by 字段名 asc/desc
--ASC是升序,desc是降序 如果不写默认是升序
1 | 问题:查询部门20的员工的姓名和工资,并且按照工资进行降序排序 |
多列排序总结:
(1)多列排序语法 order by 字段名1 asc|desc 字段名2 asc|desc
(2)多列排序的执行顺序,先按照字段1排序,然后在字段1排序的基础上,然后再按照字段2排序,,,,以此往下
4.rownum rowid Oracle的伪列
rownum
主要是用来做分页过程(web开发中)**
select *from emp;
select rownum,emp.*from emp; (emp.* 别名)
--rownum 相当于给查询结果的每一行编一个序列,并没有存储在emp表中
select rownum ,e.* from emp e where deptno=30;
--可以看出rownum是动态变化的
1 | 问题1:查询emp表的前五条记录 |
总结:(1)rownum<2 rownum<=2 rownum=1 这样是可以使用的
--不能是rownum>2或者是rownum>=2 rownum=2
–重点
1 | 问题3:查询emp表中工资最高的前五名的员工姓名,工作,工资 |
--分析 --(1)select ename ,job,sal from emp order by sal desc --记为x
--(2)取x得3-5行:select *from (select rownum ro,x.* from x) where ro>=3 and ro<=5;
--(3)替换 select *from (select rownum ro,x.* from (select ename ,job,sal from emp order by sal desc)x) where ro>=3 and ro<=5;
rowid
**:表示的记录的物理地址,不随记录的在查询结果中的顺序的改变而改变,唯一的且固定的
--并没有写在表结构中**
select rowid,e.*from emp e;
select rowid ,e.* from emp e where ename='CLARK';
聚合函数(max ,min avg,sum,count)
问题1:求emp表中员工的总数
select count(*) from emp; 求记录的总数
也可以是这种形式
select count(empno) from emp;
问题2:求emp表中工资最高的那个员工的工资
select max(SAL) FROM EMP;
问题3:求emp表中工资最低的员工的工资
select min(sal) from emp;
问题4:求该公司员工的平均工资
select avg(sal) from emp;
问题5:求该公司每个月一个总开支(工资和奖金)
select sum(sal+comm) from emp; //此处结果有问题 null和数值不能直接相加
select sum(sal+nvl(comm,0)) from emp;
—补充:nvl(comm,0) :判断comm是否为null 要是null 返回为0,要不是null 返回comm
sum
语法:sum(distinct|all)
参数:all表示对所有的值 (缺省),distinct只对不同的值
解释:求总和
示例:
select sum(distinct sal) from emp;
select sum(all sal) from emp;
avg
语法:avg(distinct|all)
参数:all表示对所有的值 (缺省),distinct只对不同的值
解释:求平均值
示例:
select avg(distinct sal) from emp;
select avg(all sal) from emp;
max
语法:max(distinct|all)
参数:all表示对所有的值 (缺省),distinct只对不同的值
解释:求最大值
示例:
select max(distinct sal) from emp;
min
语法:min(distinct|all)
参数:all表示对所有的值 (缺省),distinct只对不同的值
解释:求最小值
示例:
select min(all sal) from emp;
count
语法:count(distinct|all)
参数:all表示对所有的值 (缺省),distinct只对不同的值(相同值只取一次)
解释:求记录、数据个数。
示例:
select count(sal) from emp;
select count(distinct sal) from emp;
.group by 分组
1 | 问题1:求emp表中每个部门的员工的总人数,请列出部门的编号和总人数,和平均工资 |
--group by 使用规则:
--出现在select后面的字段,除了聚合函数之外,其他字段内容必须出现在group by之后
--如果不按照上述规则写,报错,不是单组分组函数,使用会出错。报错,不是单组函数或者不是group by表达式
问题3:查询部门10的员工人数和平均工资
select count(*),avg(sal) from emp where deptno=10;
–多字段分组的一个问题
问题4:查询emp表中每个部门,每个职位的员工人数;
select deptno,job,count(*) from emp group by deptno,job;
–注意:多字段分组,分组的顺序是按照字段的先后顺序来的
问题5:查询emp表中,每个部门的编号,并且按照部门人数进行降序排序
select deptno,count() from emp group by deptno order by count() desc;
8.having关键字,主要是和group连用,并且针对聚合函数条件进行二次条件限定的
问题6:查询emp表中每个部门的人数,找出人数大于3的部门,并按照总人数降序排列
select deptno,count() from emp group by deptno having count()>3 order by count(*) desc;
注意事项:
注意事项:(1)聚合函数的条件,不能出现在from ,where子句,不能出现在group by 后面,
聚合函数可以出现在select子句,having子句 order by 子句
(2)where子句中放的是普通条件,不涉及到聚合函数的条件
(3)having 子句中不能放普通条件,涉及聚合函数的条件
高级查询2
主要针对以下问题进行说明:
1.表连接(内连接,外连接(左外连接,右外连接,全外连接))
2.表连接:两表连接,三表连接,四表连接
3.子查询:单行子查询,多行子查询
4.子查询:any all
5.视图:什么是视图?视图的作用?怎么创建和删除视图?
6.索引:什么是索引?索引的作用?怎么创建合适的索引?创建删除和维护索引语法?
等值连接
--1.问题:查询每个员工的部门名称,列出员工姓名和部门名称
select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno
–表连接中别名的使用:
为了避免出现“未明确定义列”的错误,建议使用表别名.字段名的方式引用字段
总结:select…from 表1,表2,表3,… where 连接条件1 and 连接条件2 and …
连接条件:e.deptno=d.deptno等值连接的条件,所以这种连接成为等值连接
不等值连接
非等值连接是指在多个表之间使用非等号连接,查询在多个表中有非等值关联关系的数据。非等值连接操作符包括>、>=、<、<=、<>以及between…and、like、in等。
例:查找每个员工的薪水等级
2. 问题:查询员工表中,每个员工的工资等级,列出员工姓名,工资和工资等级
select e.ename,e.sal,s.grade from emp e,salgrade s
where e.sal between s.losal and s.hisal;
自连接:
自连接是一种特殊的连接,数据的来源是一个表,即关联关系来自于单表中的多个列。比如职员表中的经理列,就参照了本表中职员编码列,即经理也是机构下的职员之一。
自连接是通过将表别名虚拟成两个表的方式实现,可以是等值的或不等值的连接。
例:查询每个职员经理的名字以及经理的员工编号
--3. 查询所有比自己领导入职早的员工的姓名和上级领导的姓名
select w.ename as 员工姓名,m.ename as 上级领导姓名
from emp w,emp m where w.mgr=m.empno and w.hiredate<m.hiredate;
内连接:
--1.问题:查询每个员工的部门名称,列出员工姓名和部门名称
select e.ename,d.dname from emp e inner join dept d on e.deptno=d.deptno;
–总结:select…from 表1 inner join 表2 on 连接条件 where 查询条件
–问题:查询部门10中每个员工的工资等级
select e.ename,s.grade from emp e
inner join salgrade s
on e.sal between s.losal and s.hisal --连接条件
where e.deptno=10; --查询条件
--问题:查询emp表中部门名称为ACCOUNTING的员工的姓名,和部门位置
select e.ename,d.loc from emp e,dept d
where e.deptno=d.deptno and d.dname='ACCOUNTING';
select e.ename,d.loc from emp e inner join dept d
on e.deptno=d.deptno
where d.dname='ACCOUNTING';
–查询高于自己部门平均工资的员工的信息,列出部门平均工资
--(1)获得每个部门的平均工资
select deptno,avg(sal) avg_sal from emp group by deptno; --x
--(2) 将x表和emp表做表连接
select e.*,x.* from emp e,x where e.deptno=x.deptno and e.sal>x.avg_sal;
--(3)替换x
select e.*,x.* from
emp e,(select deptno,avg(sal) avg_sal from emp group by deptno)x
where e.deptno=x.deptno and e.sal>x.avg_sal;
内连接和外连接
针对内连接和外链接,我们通过图表进行详细说明
A表(父母表):