表的查询:(是做了一些比较有用的笔记,一些简单的语句就没有做了)
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';