Oracle查询学习心得(一)
数据控制语言(DCL):系统权限授权、回收。Grant,revoke
数据定义语言(DDL):创建、删除、修改。Create Table、Alter Index..
数据操作语言(DML):操作内容、查询。Select、insert、update、delete、lock table等语句。
数据事务处理():commit、rollback、save point、set transaction
Ⅰ、查询:
①:SELECT字段名列表FROM表名WHERE条件;
SELECT为查询语句的关键字,后跟要查询的字段名列表,字段名列表用来指定检索特定的字段,该关键字不能省略。
EG:SELECT * FROM emp WHERE deptno=10;
②:基本查询和排序
Student模式下查询Scott用户的表
EG:SELECT * FROM SCOTT.EMP;
③:虚列Rownum(显示的是结果的行号,数据库中并没有,必须是详细的列明或emp.*,就是*会出错)
SELECT rownum,ename FROM emp;
④:别名(在列名和别名之间要用AS分隔,AS可以省略。歧义别名用双引号将它们引起来。只能是双引号,不能是单引号)
SELECT ename“Name “, sal *12+5000 AS "工资"FROM emp;
⑤:连接运算符||或者连接函数Concat
SELECTename||’的职务是’||job AS "雇员职务表" FROM emp;
⑥:消除重复行(DISTINCT)
Select distinct job from emp;
⑦:查询结果排序(order by)
SELECT字段列表FROM表名WHERE条件
ORDER BY字段名1 [ASC|DESC][,字段名2 [ASC|DESC]...];
ASC、DESC默认升序
EG:SELECT ename, sal FROM emp ORDER BY sal ,ename;
Ⅱ、条件查询
①:简单条件查询
比较运算符
SELECT ename,job,sal FROM emp WHEREjob='SALESMAN';
②:日期格式(缺省中文日期格式为DD-MM月-YY)
如2003年1月10日应该表示为“10-1月-03”。
SELECT hiredate FROM emp WHERE
hiredate>='1-1月-82';
③:复合条件查询
运算的优先顺序是NOT,AND,OR
SELECT ename, job,sal FROM emp WHEREsal>1000 AND sal<2000;
④:特殊运算符
⑤:LIKE的用法
%:代表0个或多个任意字符。
_:代表一个任意字符。
SELECT * FROM emp WHERE ename LIKE '_A%';
⑥:判断空值(IS[NOT]NULL)
EG:SELECTename, mgr FROM emp WHERE mgr IS NOT NULL;
Ⅲ、函数
①、数值型函数
②、字符型函数
③、日期函数(sysdate--系统日期和时间的虚拟函数)
如:假定当前的系统日期是2003年2月6日,求再过1000天的日期
SELECT sysdate+1000 AS "NEW DATE"
FROM dual;----04-11月-05
④、转换函数
TO_CHAR、TO_DATE、TO_NUMBER.
⑤、日期类型转换
SELECT TO_CHAR(sysdate,'YYYY-MM-DDHH24:MI:SS AM DY') FROM dual;
2017-10-10 15:44:48下午星期二
SELECT TO_CHAR(sysdate,'YYYY"年"MM"月"DD"日"')FROM dual;
2003年11月18日
⑥、数字类型转换
SELECT TO_CHAR(123.45,'0000.00'),TO_CHAR(12345,'L9.9EEEE') FROM dual;
0123.45RMB1.2E+04
⑦、其它函数
Decode函数:
SELECTename,decode(job,'MANAGER', '经理', 'CLERK','职员', 'SALESMAN','推销员', 'ANALYST','系统分析员','未知') FROM emp;
Ⅳ、高级查询
①、多表联合查询
两个表的连接方式:相等连接、不等连接、外连接、自连接
②、相等连接(通过两个表具有相同意义的列,可以建立相等连接条件)
SELECT emp.ename,emp.deptno,dept.dname FROMemp,dept
WHERE emp.deptno=dept.deptno;
③、外连接(相等连接有一个问题:如果某个雇员的部门还没有填写,即保留为空,那么该雇员在查询中就不会出现)
不满足连接条件的行将显示在最后。外连操作符为(+)
右外连接:
SELECT ename,sal,dname FROM emp,dept WHEREemp.deptno(+)=dept.deptno;
或:
SELECT ename,sal,dname FROM emp
right outer join dept on emp.deptno =dept.deptno;
左外连接:
SELECT ename,sal,dname FROM emp,dept
WHERE emp.deptno=dept.deptno(+);
或:
SELECT ename,sal,dname FROM emp
leftouter join dept on emp.deptno = dept.deptno;
④、不等连接
SELECT e.ename, e.sal, s.grade FROM empe,salgrade s
WHEREe.salBETWEEN s.losal AND s.hisal;
⑤、自连接
对于自连接可以想像存在两个相同的表(表和表的副本),可以通过不同的别名区别两个相同的表
SELECT worker.ename||'的经理是'||manager.ename AS雇员经理FROM emp worker, emp manager WHEREworker.mgr = manager.empno;
Ⅴ、统计查询
①、组函数
Oracle提供了一些函数来完成统计工作,这些函数称为组函数,组函数不同于前面介绍和使用的函数(单行函数)。组函数可以对分组的数据进行求和、求平均值等运算。组函数只能应用于SELECT子句、HAVING子句或ORDER BY子句中。组函数也可以称为统计函数。
常用组函数
②、统计函数
EG1:求部门10的雇员的平均工资
SELECT AVG(sal) FROM emp WHERE deptno=10;
EG2:求最晚和最早雇佣的雇员的雇佣日期
SELECT MAX(hiredate),MIN(hiredate) FROMemp;
EG3:求雇员表中不同职务的个数
SELECT COUNT( DISTINCT job) FROM emp;
③、分组统计
EG1:按职务统计工资总和
SELECT job,SUM(sal) FROM emp GROUP BY job;
注意1:在查询列中,不能使用分组列以外的其他列,否则会产生错误信息。
注意2:对分组查询的结果进行过滤,要使用HAVING从句。HAVING从句过滤分组后的结果,它只能出现在GROUP BY从句之后,而WHERE从句要出现在GROUP BY从句之前。
EG2:统计各部门的最高工资,排除最高工资小于3000的部门
SELECTdeptno, max(sal) FROM emp GROUP BY deptno HAVINGmax(sal)>=3000;
注意3:HAVING从句的限定条件中要出现组函数。如果同时使用WHERE条件,则WHERE条件在分组之前执行,HAVING条件在分组后执行
EG3:统计人数小于4的部门的平均工资
select avg(sal) from emp group by deptnohaving count(*) <4;
④、组函数的嵌套使用
EG1:求各部门平均工资的最高值
SELECT max(avg(sal)) FROM emp GROUP BYdeptno;
说明:该查询先统计各部门的平均工资,然后求得其中的最大值。
注意:虽然在查询中有分组列,但在查询字段中不能出现分组列。如下的查询是错误的:
SELECT deptno,max(avg(sal)) FROM emp GROUPBY deptno;
因为各部门平均工资的最高值不应该属于某个部门
⑤、子查询
子查询一般出现在SELECT语句的WHERE子句中,Oracle也支持在FROM或HAVING子句中出现子查询。子查询比主查询先执行,结果作为主查询的条件,在书写上要用圆括号扩起来,并放在比较运算符的右侧。
一:单行子查询
EG1:查询比SCOTT工资高的雇员名字和工资
SELECT ename,sal FROM emp WHEREsal>(SELECT sal FROM emp WHERE empno=7788);
二:多行子查询
EG2:查询工资低于任何一个“CLERK”的工资的雇员信息
SELECTempno, ename, job,sal FROM emp
WHEREsal < ANY (SELECT sal FROM emp WHERE job = 'CLERK')AND job <> 'CLERK';
三:多列子查询
EG3:查询职务和部门与SCOTT相同的雇员的信息。
SELECTempno, ename, sal FROM emp
WHERE (job,deptno) =(SELECT job,deptnoFROM emp WHERE empno=7788);
四:在FROM从句中使用子查询
EG4:查询雇员表中排在第6~9位置上的雇员
SELECT ename,sal FROM (SELECT rownum asnum,ename,sal FROM emp WHERE rownum<=9 )
WHERE num>=6;
Ⅵ、集合运算
①、多个查询语句的结果可以做集合运算
EG1:查询部门10和部门20的所有职务
SELECTjob FROM emp WHERE deptno=10
UNION
SELECTjob FROM emp WHERE deptno=20;
Ⅶ、阶段训练
EG1:显示人数最多的部门名称
SELECT DECODE(dname,'SALES','销售部',
'ACCOUNTING','财务部',
'RESEARCH','研发部',
'未知')部门名
FROM emp,dept WHEREemp.deptno=dept.deptno
GROUP BY dname HAVING COUNT(*)=
(SELECT MAX(COUNT(*)) FROM emp GROUP BYdeptno);
EG2:显示各部门的平均工资、最高工资、最低工资和总工资列表,并按平均工资高低顺序排序
SELECT dname部门,AVG(sal)平均工资,MAX(sal)最高工资,MIN(sal)最低工资,SUM(sal)总工资
FROMemp,dept
WHERE emp.deptno=dept.deptno
GROUP BY dname
ORDER BY AVG(sal) DESC;