别名:可以为查询的字段指定一个名字 这样在查询的结果集中,对应该字段 的名字就是别名。 使用别名是为了增加结果集的可读性, 因为当查询的字段含有函数或表达式的 时候,该字段在结果集就是这个函数或 表达式,可读性差。 别名不区分大小写,若希望区分大小写, 或者含有空格,需要使用双引号括起来 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
猜你喜欢
转载自blog.csdn.net/coder_boy_/article/details/80549126
今日推荐
周排行