设为首页 加入收藏

TOP

Oracle学习笔记之高级查询(一)
2015-11-10 12:17:21 来源: 作者: 【 】 浏览:5
Tags:Oracle 学习 笔记 高级 查询

为列起别名


目的 我们进行查询时 经常查询某一列时使用的是表达式 SELECT enamme,sal*12 FROM emp


这样不好的地方是第二列在查询后列用使用的就是sal*12.这样的可读性比较差为此我们会为列起别名,来增加可读性


别名本身不区分大小写,若希望区分,则别名需要使用双引号,当别名中含有空格,也应使用双引号


SELECT ename,sal*12 "Annual Salary" FROM emp;


WHERE子句


用于在查询数据的过程中过滤记录的,只有满足WHERE子句中的条件的记录才会被查询出来, 数据库在查询表的时候,每一条记录都要经过一次WHERE的过滤


查看工资小于2000的


SELECT ename,sal FROM emp WHERE sal<2000;


查看部门不属于10的员工信息


SELECT ename,sal,job FROM emp WHERE deptno !=10;


查询1980年出生的


SELECT ename,sal,hiredate FROM emp WHERE hiredate>TO_DATE('1980','YYYY');


查询sal大于1000 且工作为clerk


SELECT ename,sal,job FROM emp WHERE sal>1000 AND job='CLERK';


查询工资大于1500的CLERK 或者是不限制工资的所有SALESMAN


SELECT * FROM emp WHERE sal>1500 AND job='CLERK' OR job ='SALESMAN';


提高优先级的意思是 查看工资大于1500的CLERK 和SALESMAN


SELECT * FROM emp WHERE sal>1500 AND (job='CLERK' OR job ='SALESMAN');


查看emp表中ename 第二个字母的是A的名字


SELECT * FROM emp WHERE ename LIKE '_A%';


IN 比较符 可以比较等于列别中的其中之一


SELECT * FROM emp WHERE job IN('MANAGER','CLERK'); ==SELECT * FROM emp WHERE job='MANAGER' OR job='CLERK';


查询不等于MANAGER 和CKERK的所有工作


SELECT * FROM emp WHERE job NOT IN('MANAGER','CLERK');


SELECT * FROM emp WHERE sal BETWEEN 1500 AND 3000;


SELECT * FROM emp WHERE sal>ANY(3000,2000,4000);


SELECT * FROM emp WHERE sal*12>50000;


SELECT ename,sal FROM emp WHERE UPPER(ename) = upper('rose');


DISTINCT关键字用于去除给定列的重复数据 查看公司都有哪些职位,重复的去除


SELECT DISTINCT job FROM emp;


当我们对多个列进行去重复时,表示这几个列的值的组合没有重复的


SELECT DISTINCT deptno,job FROM emp;


ORDER BY子句,用于对结果集进行排序


ORDER BY子句只能出现在SELECT语句的最后。


ORDER BY 后面可以指定若干字段,排序优先级为从左到右,


ASC 表示升序,默认就是升序,所以可以不写


DESC表示降序


按照部门编号从小刀大进行排序结果集


SELECT * FROM emp ORDER BY deptno


查询emp表里部门为10的工资和姓名 并降序排列


SELECT ename,sal FROM emp WHERE deptno =10 ORDER BY? sal DESC;


在排序一个含有NULL值的字段时,NULL值被认为是无限大,所以在降序排序时,NULL值会出现在最前面


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


聚合函数


MAX和MIN


SELECT MAX(sal) FROM emp;


***聚合函数都是忽略NULL值


SELECT MAX(sal) as "最大",MIN(sal) as "最小" FROM emp;


SELECT AVG(NVL(comm,0) ) as "平均值" FROM emp;


SELECT AVG(sal),SUM(sal) FROM emp;


SELECT COUNT(comm) FROM emp;--统计条数,不统计值


SELECT COUNT(*) FROM emp;--统计整张表有多少条记录


GROUP BY子句 用于将表里的数据进行 分组,分组原则为GROUP BY 后面给定的字段的值相同的记录看做一组


查看每个部门的最大工资 最小工资等:


SELECT MAX(sal),MIN(sal),AVG(sal),SUM(sal),deptno FROM emp GROUP BY deptno;


聚合函数又称组函数


SQL有一个要求


在SELECT子句红若出现了组函数,那么不在组函数中的其他字段,必须出现GROUP BY 子句中,但是反过来则不是必须的


若字段中每条疾苦的值都不重复,那么该字段通常不应该在GROUP BY子句中作为分组的参照。


若指定了GROUP BY子句,那么SELECT子句中不在组函数中的其他字段且不在GROUP BY子句中则不能出现


WHERE 与HAVING的区别


相同点,都是用作过滤,只不过HAVING是用在第二次过滤的,WHERE是用在第一次查询表的时候过滤条件的。


HAVING是在第一次查询后,得到结果的基础上再次进行过滤使用的。


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


查询优先级


from子句,执行顺序,从后往前,从右到左 数据量少的放后面


where子句 执行顺序为自上而下,从右到左,将能过滤掉最大数量记录的条件卸载where子句的最右


group by 执行顺序从左往右分组


select子句,少用*号 尽量取字段名


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


关联查询


N张表联合查询,至少要有N-1个连接条件,否则会产生笛卡尔积:A表的记录总数*B表的记录总数,无意义的结果集


两张表联合查询,要添加至少一个连接条件。因为查询时很难避免两张表出现相同名字的字段,为了解决这个问题,可以


使用 表名.字段 来确认


若别名比较长,柯表名叫上别名来简化


SELECT e.ename,e.sal,d.dname,e.deptno FROM emp e,dept d WHERE e.deptno = d.pdeptno;


SELECT e.ename,e.sal,d.dname,e.deptno FROM emp e JOIN dept d ON(d.deptno=e.deptno);


SQL89标准时,弊端在于,连接条件与过滤条件都要写在where子句中,可读性相对较差,尤其多表查询加上过滤条件多的时候。


SELECT e.ename,d.DNAME? FROM emp e,dept d WHERE d.DEPTNO=e.DEPTNO AND d.DNAME='SALES';


SQL92建议多表连接用 用SELECT ... FROM JOIN...ON ...WHERE(只写条件)


SELECT e.ename,d.dname FROM emp e JOIN dept d ON e

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Oracle学习笔记之子查询 下一篇Oracle学习笔记之视图

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: