oracle的表查询

表的查询:(是做了一些比较有用的笔记,一些简单的语句就没有做了)

1====取消重复的字段 --- distinct

 SQL>select distinct mgr, dept from emp ;

//注意,上的sql语句,取消重复的是(mgr,dept)这两个组合起来的

2====使用算术表达式:

?显示每个雇员的年工资

SQL> select ename , sal * 12  "年工资" from emp; --- 注意,字段的是双引号

3====如何处理null------ nvl(  )函数

?查询每个雇员的年工资(包括奖金)

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

//如果是上面的sql语句的语句的话,由于有些员工没有奖金,数据库中是null,oracle中与null进行运算,最后得到仍然是null, 所以要使用nvl()函数来对null值进行转换

nvl(可能为null的字段,如果为null,用值代替)

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

4,====如何连接字符串--- || 

SQL> select ename || ' is a ' || job from emp ; 

5, ====使用like 匹配

%: 表示0个或者多个字符    _ : 表示单个字符

?显示名字以S开头的员工

SQL> select ename from emp where ename like 'S%';

6,==== where中使用in 

?查询员工号为 (。。。。。。)的员工

7,查询数据为null的记录

?查询没有上级的员工

SQL>select * from emp where mgr is null; //不能使用mgr = null ; 切记

8=====排序 order by

SQL> select ename "名字",sal*12 "年薪" from emp  order by "年薪" asc;//注意,列名要使用双引号

9=====group by .....having 分组

?显示每个部门的平均工资

//group by后面的字段必须出现在选择列中

SQL> select deptno,avg(sal) "平均工资" from emp group by deptno;

?显示每个部门,每个职位的平均工资

SQL> select deptno,job,avg(sal) "平均工资" from emp group by deptno,job; 

//先按照deptno分组,然后按照job分组

注意:

·group by 后面的字段必须出现在选择列中,否则会报错

·分组函数(max,min,avg....)只能出现在 选择列 , having order by 子句中

SQL>select deptno,job,avg(sal) "平均工资" from emp group by deptno,job having avg(sal) >  2000 order by avg(sal);

·group by .... having .....order by.........他们的顺序不能乱

·在选择列里面使用了分组函数,那么如果使用其他的列的话,必须要在group by

也出现,以实现分组

10,===== 自连接 

是指在同一张表的连接查询:

?显示某个员工上级的名字:如ford的上级

SQL> select e.ename "员工" ,b.ename "上司" from emp e , emp b where e.mgr = b.empno and e.ename = 'FORD';

//可以把自己当做两张表来操作

11===== 单行单列子查询

当行子查询是指查询出返回一行数据

?查询出和smith同一个部门的所有员工的信息

SQL> select * from emp where deptno = (select deptno from emp where ename = 'SMITH'); // 只返回一个列

12=====多列子查询

//返回的是多个列的数据,而且对于括号里面的字段,不能顺序不同,前面的括号的顺序要和后面选择字段的顺序相同,否则查出的结果不对

?查询出和smith同一个部门且同一个岗位的所有员工

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

13====== 多行子查询 

//返回的结果是多行记录

==== all 的使用

?查询出比30号部门所有的员工的工作都要高的员工信息

SQL> select * from emp where sal > all (select sal from emp where deptno = 30); 

SQL> select * from emp where sal > (select max(sal) from emp where deptno =30);来代替 ,此效率更高、

=====any 的使用

?查询出比30号部门任一员工的工作都高的员工信息

SQL> select * from emp where sal > any (select sal from emp where deptno = 30);

14=====from子查询

?显示每个部门中高于自己部门平均工资的所有员工信息

SQL>select e.* from emp e,(select deptno,avg(sal) "平均工资" from emp group by deptno) a where e.sal > "平均工资" and e.deptno = a.deptno;

//这里需要说明的是当在from自己中使用字查询时,该子查询会被作为一个视图来对待,因此也叫作嵌视图,当在from子句中使用子查询时,必须给子查询指定别名

15=====分页查询

要使用分页,那么可以使用rownum , rowId , row_number()分析函数

rowId > rownum > row_number();

?显示第5条到第10条记录

SQL> select * from (select rownum rn,e.* from (select * from emp) e where rownum <= 10) a where rn >= 5 ;

注意:

·对于rownum伪列,总是从第一条开始的,并且rownum是对结果集进行编号

/***************************************************/

SQL> select rownum,ename from emp where rownum < 5 order by ename;

结果是:

    ROWNUM ENAME

      ---------- ----------

         2 ALLEN

         4 JONES

         1 SMITH

         3 WARD

SQL> select rownum,e.ename from (select ename from emp) e where rownum < 5;

    ROWNUM ENAME

      ---------- ----------

         1 SMITH

         2 ALLEN

         3 WARD

         4 JONES

/***************************************************/

SQL> select rownum,ename from emp where rownum > 10;

按理来说,应该是得到的是大于10的记录,但是结果是一条也得不到,因为rownum是从1开始的,当rownum 10下,就会从下一个rownum,但是下个rownum又是从1开始,所以得不到结果

要想得到上面的结果,需要这样写:

SQL> select * from (select rownum rn,ename from emp) e where rn > 10;

SQL> select rownum,e.* from emp e where rownum <10;

但是这样却能得到结果

详情查看此文件夹下面的那个ORACLE_ROWNUM的用法解析.doc

16,===== 快速建表

SQL> create table test(id,name,job) as select empno,ename,job from emp;

17==== 合并查询

需要注意的是前面的select的选择列需要和后面的select的选择列相同

 · union 相当于并集

?查询职位为"MANAGER" 或者 工资在2500 以上的所有员工名字

SQL> select ename from emp where sal > 2500 union select ename from emp where job = 'MANAGER';

 · minus 

前面查询的集合减去后面查询出来的集合

?查询工资在2500以上,但是职位为"MANAGER"除外

SQL> select * from emp where sal > 2500 minus select * from emp where job = 'MANAGER';

 · intersect 交集

?查询工资在2500以上,并且职位为“MANAGER

SQL> select * from emp where sal > 2500 intersect select * from emp where job = 'MANAGER';

你可能感兴趣的:(oracle的表查询)