没有合适的资源?快使用搜索试试~ 我知道了~
oracle 11g 开发指南 sql语句 ddl tcl dml
资源详情
资源评论
资源推荐
第三章 SQL 查询
1 去掉重复值 DISTINCT
SELECT DISTINCT job FROM emp;
DISTINCT 限制的是它后面的列的组合不出出现重复值
SELECT DISTINCT deptno,job FROM emp;
2 查询语句中使用算数表达式
算术表达式:+、-、*、/
针对数字类型和日期类型进行操作
如果某列为空,则运算结果还是为空。可以利用 NVL()函数。
SELECT ename,sal,sal*12 year_salary FROM emp;
ENAME SAL YEAR_SALARY
-------------- ----------- ----------------------
SCOTT 2000 240000
ZULE
SELECT ename,NVL(sal,0), NVL(sal,0)*12 year_salary FROM emp;
ENAME SAL YEAR_SALARY
-------------- ----------- ----------------------
SCOTT 2000 240000
ZULE 0 0
3 查询语句中使用列的别名
如果希望别名区分大小字符,或者别命中字符或空格,需要用“”括起来。
4 查询日期需要注意的地方
4.1 查询日期列时,指定显示格式
SELECT ename,TO_CHAR(birthday,’YYYY-MM-DD’) birthday FROM emp;
4.2 查询条件为日期列时,设定日期格式
Date csrq=gyXjStudentHistory.getCsrq();//页面得到出生日期为日期类型
if(csrq!=null){
SimpleDateFormat formatter=new SimpleDateFormat("yyyy/MM/dd");
String dateString=formatter.format(csrq);
con=con+" AND g.csrq = TO_DATE('"+dateString+"','yyyy/mm/dd')
";
}
5.分组查询
5.1 单列分组
----查看每个部门的平均工资
SELECT deptno,AVG(sal) avg_sal FROM emp GROUP BY deptno;
5.2 多列分组
----按部门和职位两列分组
SELECT deptno,job,AVG(sal) avg_sal FROM emp GROUP BY deptno,job;
5.3 GROUP BY 语句中的 ROLLUP 操作符
使用 ROLLUP 操作符可以先按照预定的字段分组,在计算分组计算结果后
的每行小计,相当于对于每行数据又执行了一次组函数操作,之后还会对小计
之后的分组在进行一次小计。
5.4 GROUP BY 语句中的 CUBE 操作符
横向小计和纵向小计
5.5 使用 HAVING 子句限定分组结果
HAVING 子句用来对分组后的结果进一步限定。
----得到每个部门的最高薪水后,只输出薪水大于 4000 记录。
SELECT deptno,MAX(sal) max_sal FFOM emp GROUP BY deptno HAVING
MAX(sal)>4000;
5.6 使用分组函数的注意事项
(1)分组函数只能出现在 SELECT 列表,HAVING 子句和 ORDER BY 子句
中,尤其注意不能出现在 WHERE 子句中。
(2)使用分组函数时,出现在 SELECT 列表中的字段,如果只有组函数字段,
可以没有 GROUP BY 子句,如果还有其他列和表达式,则这些列和表达式必须
出现在 GROUP BY 子句中。
----错误用法
SELECT deptno,MAX(sal) max_sal FROM emp ;
6.内连接和外连接概念
6.1 内连接:等值连接、非等值连接、自连接
内连接是返回满足连接条件的记录。
SELECT table1.column,table2.column FROM table1 [inner] JOIN table2 ON
table1.column=table2.column;
SELECT table1.column,table2.column FROM table1 , table2 WHERE
table1.column=table2.column;
6.1.1 等值连接
等值连接:select e.ename, e.job, d.dname, d.loc FROM emp e,dept d
Where e.deptno=e.deptno;
连接 N 个表,最少需要 N-1 个连接条件
6.1.2 非等值连接
非等值连接:>、>=、 <>、 BERWEEN…AND 、LIKE 、IN 等
SELECT e.name,e.sal,s.grade FROM emp e, salgrade s WHERE e.sal
BETWEEN s.losal AND s.hisal;
6.1.3 自连接
自连接:数据来源于同一个表
SELECT worker.empno w_empno, worker.ename w_ename,manager.empno
m_empno, manager.ename m_name
FROM emp worker,emp manager WHERE work.mgr=work.empno;
6.2 外连接
外连接:返回满足连接条件和不满足连接条件的记录。
SELECT table1.column,table2.column FROM table1 [LEFT、RIGHT、FULL]
JOIN table2 ON table1.column=table2.column;
6.2.1 左外连接:
6.2.2 右外连接:
6.2.3 全连接:
7.子查询
在 select 查询中,where 查询条件中的限定条件不是一个确定的值,而是来
自另外一个查询结果。主查询可以是 select 语句,也可以是其他 DML 和 DDL
语句等。
主查询
CLERK
子查询
返回一行数据
单行单列子查询
7.1 单行子查询
单行子查询指在子查询中只返回单行值,这种子查询要使用单行比较运算
符,包括=、>、>=、<>、<、<=。
SELECT deptno, ename, sal FROM emp e WHERE sal>(SELECT AVG(sal)
FROM emp WHERE deptno=e.deptno) ORDER BY deptno;
----单行子查询除了可以出现在 where 子句中,也可以出现在 having 子句中。
SELECT deptno,MIN(sal) min_sal FROM emp GROUP BY deptno HAVING
MIN(sal)>(SELECT MIN(sal) FROM emp WHERE deptno=30);
7.2 多行子查询
多行子查询是子查询返回了多行,则主查询中的比较操作符应该使用多行
比较操作符。包括:IN、ALL、ANY。 其中 ALL、ANY 不能单独使用,需要
配合单行比较运算符>、>=、<、<=一起使用。
7.2.1 多行子查询中使用 IN
----查询出和 SALESMAN 同部门但是不是 SALESMAN 的员工信息。
SELECT empno,ename,job,sal,deptno FROM emp WHERE deptno IN
(SELECT deptno FROM emp WHERE job=’SALESMAN’) AND job
<>’SALESMAN’;
7.2.2 多行子查询中使用 ANY
----查出比任何一个 SALESMAN 的薪水高但不是 SALESMAN 的员工信息
SELECT empno,ename,job,sal,deptno FROM emp WHERE sal>ANY (SELECT
sal FROM emp WHERE job=’SALESMAN’)AND job<>’SALESMAN’;
7.2.3 多行子查询中使用 ALL 操作符
ALL 也不能单独使用,必须和<、<等比较操作符一起使用。
----查出比所有 SALESMAN 的薪水高但不是 SALESMAN 的员工信息
主查询
CLERK
SALESMAN
子查询
返回多行数据
多行单列子查询
主查询
CLERK
子查询
返回多行多列数据
多行多列子查询
SELECT empno,ename,job,sal,deptno FROM emp WHERE sal>ALL(SELECT
sal FROM emp WHERE job=’SALESMAN’) AND job <>’SALESMAN’;
7.3 多列子查询
多列子查询,分为单行多列子查询和多行多列子查询。单行多列子查询比较操
作 符 ( < 、 <= 、 > 、 >= 、 <> ) , 多 行 多 列 子 查 询 操 作 符 ( IN 、 ALL 、
ANY)。
----查询和 SCOTT 相同部门相同职位的员工
SELECT empno,ename,job,sal,deptno FROM emp
WHERE(deptno,job)=(SELECT deptno,job FROM emp WHERE ename=’SCOTT’))
----查询机构下每个部门最低薪水的员工
SELECT empno,ename,job,sal,deptno FROM emp WHERE (deptno,MIN(sal))
IN (SELECT deptno,MIN(sal) FROM emp GROUP BY deptno)
7.4 其他子查询
7.4.1 行内视图
行内视图简单地说就是出现在 FROM 短语中的子查询。这种语句把子查询
当做视图对待,但这个视图没有名字,只在 sql 语句中有效。
----查询出薪水比本部门平均薪水高的员工信息
SELECT e.deptno,e.ename,e.sal FROM emp e,(SELECT deptno,AVG(sal)
avg_sal FROM emp GROUP BY deptno) x WHERE e.deptno=x.deptno AND
e.sal>avg_sal ORDER BY e.deptno;
这种行内视图也经常用来做 TOP-N 分析
7.4.2EXIST 条件
使用 EXIST 条件的查询也称作相关子查询,就是在子查询中需要引用到主
查询的字段数据。如果 EXIST 后边的子查询至少返回一行数据,则整个条件返
回 TRUE。
----查询只有那些有员工的部门信息
SELECT deptno,dname FROM dept d WHERE EXISTS (SELECT * FROM emp
e WHERE d.deptno=e.deptno) ORDER BY deptno;
总结,子查询需要注意的基本原则:
(1) 子查询要用括号括起来
(2) 子查询包含 ORDER BY 短语,一般在执行 TOP-N 分析时,才有必要使
用。
(3) 单行子查询使用单行操作符,多行子查询使用多行比较运算符。
(4) 子查询不仅仅可以出现在 SELECT 中,也可以出现在 DML 和 DDL 语句
中。
8.集合操作
为了合并多个 SELECT 语句的结果,可以使用集合操作符,实现集合的并、
交、差。集合操作符:UNION、UNION ALL、INTERSECT、MINUS。
剩余26页未读,继续阅读
leledodo
- 粉丝: 2
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0