Oracle表查询

1.  处理null值

     处理 null 值,可以使用 nvl 函数,nvl(comm, 0) 如果 comm 为空,用 0 代替,否则就是 comm。

     例:显示每个雇员的年工资

     select sal*12 + nvl(comm, 0)*12 "年工资", ename, comm from emp;

 

2.  连接字符串||

     例:select ename || 'is a' || job from emp;

 

3.  使用like操作符

     %:表示 0 到多个字符。  _:表示任意单个字符。

     例:显示首字符为 S 的员工姓名和工资。

  select ename, sal from emp where ename like 'S%';

     例:显示第三个字符为大写 O 的所有员工姓名和工资。

     select ename, sal from emp where ename like '__O';

 

4.  在where字句中使用in

     例:如何显示 empno 为 7844,7839,7788 的雇员。

     select * from emp where empno in (7844, 7839, 7788);

 

5.  使用order by排序

     例:按照工资从低到高的顺序显示雇员的信息。

     select * from emp order by sal;

     例:按照部门号升序而雇员工资降序输出雇员。

     select * from emp order by deptno, sal desc;

 

6.  数据分组:max、min、avg、sum、count

    例:显示所有员工中的最高工资和最低工资。

    select max(sal), min(sal) from emp;

    例:显示最高工资的雇员。

    错误写法:select ename, sal from emp where sal=max(sal);

    正确写法:select ename, sal from emp where sal=(select max(sal) from emp);

    易错:select ename, max(sal) from emp;  这个语句执行时会报错,说非单组分组函数。因为 max 是分组函数,而 ename 不是分组函数,但是 select min(sal), max(sal) from emp; 该语句是对的,因为 min 和 max 都是分组函数。

    所以,如果列里面有一个分组函数,那么每列都必须是分组函数,否则会出错。

 

7.  group by和having子句

(1). group by:用于对查询的结果分组统计。

(2). having 子句:用于限制分组显示结果。

例:如何显示每个部门的平均工资和最高工资?

      select avg(sal), max(sal), deptno from emp group by deptno;

例:显示每个部门的每种岗位的平均工资和最低工资。

      select avg(sal), max(sal), deptno from emp group by deptno, job;

例:显示平均工资低于 2000 的部门号和它的平均工资。

      select deptno, avg(sal) from emp group by deptno having avg(sal)<2000;

(3). 对数据分组的总结:

      a. 分组函数只能出现在选择列、having、order by 子句中。

      b. 如果在 select 语句中同时包含有 group by、having、order by 子句,那么它们的顺序是 group by、having、order by。

      c. 在选择列中如果有列、表达式和分组函数,那么这些列和表达式必须有一个出现在 group by 子句中,否则会出错。

 

8.  多表查询

(1). 多行子查询:指返回多行数据的子查询。

      在多行子查询中使用all操作符

      例:如何显示工资比部门 30 的所有员工的工资高的员工姓名、工资和部门号?

      select ename, sal, deptno from emp where sal > all (select sal from emp where deptno=30);

      在多行子查询中使用any操作符

      例:如何显示工资比部门 30 的任意一个员工的工资高的员工姓名、工资和部门号?

      select ename, sal, deptno from emp where sal > any (select sal from emp where deptno=30);
(2). 多列子查询:指返回多个列数的子查询语句。

      例:如何查询smith的部门和岗位完全相同的所有雇员。

      select * from emp where (job, deptno)=(select job, deptno from emp where ename='SMITH');

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值