别名:可以为查询的字段指定一个名字
这样在查询的结果集中,对应该字段
的名字就是别名。
使用别名是为了增加结果集的可读性,
因为当查询的字段含有函数或表达式的
时候,该字段在结果集就是这个函数或
表达式,可读性差。
别名不区分大小写,若希望区分大小写,
或者含有空格,需要使用双引号括起来
select ename name ,sal*12 "annual sal" from emp;
还可以使用 as 定义别名
select ename as name ,sal*12 as "annual sal" from emp;
select ename, sal from emp where sal < 2000;
select ename, sal, job from emp where deptno <> 10;
select ename, sal, job
from emp
where hiredate > to_date('1982-1-1', 'YYYY-MM-DD');
select ename, sal, hiredate
from emp
where sal > 1000
and job = 'CLERK';
select *
from emp
where sal > 1000
or job = 'CLERK';
--and 的优先级高于 or ,可以通过括号来
--提高 or 的优先级
查看工资高于1000并且职位是SALESMAN
或CLERK员工?
select ename, job, sal
from emp
where sal > 1000
and (job = 'SALESMAN' or job = 'CLERK');
--like 用于模糊查询字符串
--支持两个通配符:
_:表示匹配任意一个字符
%:表示任意多个字符(0-多个)
select ename,job from emp where ename like '_A%';
--in 与 not in
in 用于判断等于列表中之一
not in 用于判断不在列表中
in 常用于子查询
select ename, job from emp where job in ('MANAGER', 'CLERK');
--and 与 all 是用于判断诸如:>,>=,<,<=
进行判断的,判断与一个列表中的内容的比较
> all:大于列表中的所有(大于最大)
>any:大于列表中其一(大于最小)
<all:小于列表中所有(小于最小)
<any:小于列表中其一(小于最大)
列表中的内容通常是一个查询的结果集(子查询:后面会讲),而
不是给定的具体值,否则实际就没意义了。
select ename, job, sal from emp where sal > any('3500', '4000', '4500');
--在 where 中使用函数或表达式的结果
--作为过滤条件:
select ename,sal,job from emp where ename = upper('allen');
select ename,sal,job from emp where sal*12>50000;
--distinct 关键字,去除其后指定
--的字段的重复行。
--distinct 可以对多个字段去除重复行,
--去重原则是这些字段值得组合没有重复。
查看公司共有多少种职位?
select distinct job,deptno from emp;
--排序
order by 字句
order by 字句会根据其后指定的
字段的进行升序或降序将结果集
进行排列后显示。
升序(asc):asc 可以不写,默认升序,
降序(desc):从小到大排列
desc 要注意与 查看表结构的sql命令desc区分
查看工资排名:
select ename,sal from emp order by sal desc;
order by 亦可以对多列进行排序,
排序优先级从左到右。
select ename,deptno,sal from emp order by deptno desc,sal;
排序的字段中若有 null 值, null被认作最大值。
select ename,comm from emp order by comm desc;
order by 子句必须写在 select 语句的最后一个子句上。
--聚合函数
聚合函数会将指定字段查询出的每一条记录
对应的值全部进行统计,然后得出一个结果。
max,min
求指定字段在查询出的所有记录中的最大值与最小值。
select max(sal),min(sal) from emp;
avg ,sum
求平均值与总和
select avg(sal),sum(sal) from emp;
select avg(comm),sum(comm) from emp;
--上面只考虑不为null的记录,会忽略为null记录的统计
聚合函数会忽略null值。
可使用nvl解决这个问题
select avg(nvl(comm,0)),sum(comm) from emp;
count()
统计给定字段值(不为null)的
的记录数。
查看公司共多少人?(emp表的记录数)
select count(ename) from emp;
通常查看表中记录总数使用count(*)
select count(*) from emp;
--分组
group by 子句
group by 是配合聚合函数进行分组统计结果使用的。
group by 会根据后面的给定的字段值相同的记录进行分组,
然后配合聚合函数根据每个组再统计结果。
查看每个部门的平均工资?
select avg(sal),deptno from emp group by deptno;
当select子句中有聚合函数时,凡不在聚合函数中的其他字段
都必须出现在 group by 子句中。反过来则不是必须的。
查看每个职位的最高工资是多少?
select max(sal),job from emp group by job;
group by 子句可以按照多个字段分组,
分组原则是这些记录的指定字段值的组合相同。
查看每个部门每个职位的平均工资?
select avg(sal), job, deptno from emp group by job, deptno;
--引入having
查看每个部门的平均工资,前提是该部门平均工资高于2000.
--错误写法
select avg(sal), deptno from emp where avg(sal) > 2000 group by deptno;
where 不能使用聚合函数作为过滤条件
原因在于:时机不对
having 子句
having 必须跟在 group by子句后,作用是在分组统计后,基于统计结果
再次进行过滤使用的。
having 中可以使用聚合函数的统计结果作为过滤条件来筛选分组。
select avg(sal), deptno
from emp
group by deptno
having avg(sal) > 2000;
查看平均工资高于2000的部门的最高薪水是多少?
select max(sal), deptno from emp group by deptno having avg(sal) > 2000;
where 的过滤时机是在第一次检索表中
数据时进行过滤的。where 决定着从表
中查询出多少数据。
having 是在分组统计后再进行过滤的,
二分组是在查询出的数据基础上进行的
所以 having 的过滤是在 where 之后进行的
having 决定着取舍那些分组。
部门最高工资大于2900的那些部门的平均工资?
select deptno,avg(sal) from emp group by deptno having max(sal)>2900;
查看30号部门的平均工资?
select avg(sal) from emp where deptno = 30;
select * from emp;
select * from dept;
--关联查询
将多张表数据联系起来,进行相关的查询工作。
查看每名员工的名字以及其所在部门的名字?
select ename, dname from emp, dept where emp.deptno = dept.deptno;
查看SALES部门的员工名字?
select ename,dname
from emp, dept
where emp.deptno = dept.deptno
and dname = 'SALES';
表可以使用别名,这样字段可以用表的别名
标注以避免sql语句过于繁琐。
select e.ename, d.deptno, d.dname
from emp e, dept d
where e.deptno = d.deptno
select e.ename, d.loc
from emp e, dept d
where e.deptno = d.deptno
and d.loc = 'CHICAGO';
关联查询必须定义连接条件,若不定义
则会出现“笛卡尔积”
笛卡尔积:一个无意义的结果集。会将
参与关联的两张表每条数据都连接一遍。
产生的数据量是两张表总数据量的乘积。
select * from emp,dept;
N张表联合查询,至少要定义N-1个连接条件
内连接:
另一种关联查询
select e.ename, d.dname
from emp e
join dept d
on e.deptno = d.deptno
where d.dname = 'SALES';
外连接:
关联查询中不会将不满足连接条件的
记录查询出来,当需要将不满足连接
条件的记录也查询出来时,要使用外连接。
外连接分为:左外连接,右外连接。和
全外连接
左外连接:以join左侧的表作为驱动表
该表中的数据全部要显示出来,那么不满足连接条件
的记录在结果集中来自右侧表中的字段全部以null作为值显示
select e.ename, d.dname
from emp e
left outer join dept d
on e.deptno = d.deptno;
select *
from emp e
right outer join dept d
on e.deptno = d.deptno;
select e.ename, d.dname
from emp e
full outer join dept d
on e.deptno = d.deptno;
select * from emp e, dept d where e.deptno(+) = d.deptno--右连接
自连接:
自己表中的一条数据对应自己表中的
多条数据,然后进行关联查询。
自连接用来解决相同数据但是有存在
父子级关系的树状结构时使用。
查看每个员工的名字以及上司的名字?
select e.ename, m.ename from emp e, emp m where e.mgr = m.empno(+)
数据库开发基础-Oracle-SQL基础-004
最新推荐文章于 2024-04-09 16:51:57 发布