`
log_cd
  • 浏览: 1089111 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

oracle查询/子查询/复制表和数据

阅读更多
一、连接查询
1.内连接
    内连接用于返回满足连接条件的所有记录。默认情况下,在执行连接查询时如果没有指定任何连接操作符,那么这些连接查询都属于内连接。
SELECT a.dname,b.ename from dept a,emp b where a.deptno=b.deptno and a.deptno=10;

   在FROM子句中指定INNER JOIN选项,也可以指定内连接。
SELECT a.dname,b.ename from dept a INNER JOIN emp b where a.deptno=b.deptno and a.deptno=10;

   从Oracle9i开始,如果主表的主键列和从表的外部键列名称相同,那么可以使用NATURAL JOIN 关键字自动执行内连接操作。
SELECT dname,ename FROM dept NATURAL JOIN emp;

2.左外连接
    左外连接通过指定LEFT[OUTER] JOIN选项来实现。当使用左外连接时,不仅会返回满足连接条件的所有记录,而且还会返回不满足连接条件的连接操作符左边表的其他行。
SELECT a.dname,b.ename FROM dept a LEFT JOIN emp b ON a.deptno=b.deptno AND a.deptno=10;

3.右外连接
    右外连接通过指定RIGHT[OUTER] JOIN选项来实现的。当使用右外连接时,不仅会返回满足连接条件的所有行,而且还会返回不满足连接条件操作符右边表的其他行。
SELECT a.dname,b.ename FROM dept a RIGHT JOIN emp b ON a.deptno=b.deptno AND a.deptno=10;

4.完全外连接
    完全外连接是指定FULL[OUTER] JOIN 选项来实现的。当使用完全外连接时,不仅会返回满足连接条件的所有行,而且还会返回不满足连接条件的所有其他行。
SELECT a.dname,b.ename FROM dept a FULL JOIN emp b ON a.deptno=b.deptno AND a.deptno=10;

5.使用(+)操作符
    在Oracle9i之前,当执行外连接时,都是使用连接操作符(+)来完成的。尽管可以使用操作符(+)执行外连接操作。但Oralce9i开始Oracle建议使用OUTER JOIN执行外连接。语法如下:
    SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1(+) = table2.column2;
    当使用(+)操作符执行外连接时,应该将该操作符放在显示较少行(完全满足连接条件行)的一端。
     一句话,左外连接时,(+)要放在右边表的一端。右外连接时,(+)放在左边表的一端。
    左外连接:
SELECT a.dname,b.ename FROM dept a, emp b where a.deptno=b.deptno(+) AND b.deptno(+)=10;

   右外连接
SELECT a.dname,b.ename FROM dept a, emp b where a.deptno(+)=b.deptno AND a.deptno(+)=10;

二、递归查询
1.语法
Select * from …. Where [结果过滤条件语句]
Start with  [起始条件过滤语句]
Connect by prior [中间记录过滤条件语句] 

2.例子
Select * from company t Where t.flag=1
Start with  t.company_id=50500000
Connect by prior t.company_id=t.parent_id

说明:
select [level],column,expr from table [where condition]
[start with] //[起点]
[connect by prior + 主键=外键 或 外键=主键]

a.自顶向下: 左边放主键,右边放外键。
b.自底向上: 右边放主键,左边放外键。
c.level(伪列)层次的级别,不固定值。

三、更改数据库的时间格式

1、临时更改
alter  session  set  nls_date_format='YYYY-MM-DD HH24:MI:SS'

2.永久更改
    在注册表[HKEY_CODE_MACHINE\SOFTWARE\ORACLE]里面,加入NLS_DATE_FORMAT,值为YYYY-MM-DD HH24:MI:SS。

3、Unix下,在用户的.profile文件中增加以下内容: 
  NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS
  export  NLS_DATE_FORMAT

附:在SQLPLUS下,实现中-英字符集转换
alter session set nls_language='AMERICAN';
alter session set nls_language='SIMPLIFIED CHINESE'; 

四、复制表和数据
1)建表
create table test as select * from dept; --从已知表复制数据和结构
create table test as select * from dept where 1=2; --从已知表复制结构但不包括数据

   建立视图:
CREATE OR REPLACE VIEW dept_10 AS SELECT empno,ename,job,sal,deptno FROM emp WHERE deptno=10 ORDER BY empno;

   建立实体化视图:
CREATE MATERIALLIZED VIEW summary_emp AS SELECT deptno,job,avg(sal) avgsal, sum(sal) sumsal FROM emp GROUP BY cube(deptno,job);

   实体化视图管理是用于汇总,预计算,复制或分发数据的对象, 在大型的数据库中使用它可以提高涉及到的SUM,COUNT,AVG,MIN,MAX等的表的查询的速度,只要在实体化视图管理上创建了统计,查询优化器将自动的使用实体化视图管理,这特性被称为QUERY REWRITE(查询重写).与普通的视图不同的是实体化视图管理存储数据,占据数据库的物理空间的.
2)不使用列的列表插入数据:
insert into test select * from dept;

3)使用DEFAULT插入数据:如果列存在默认值,则会使用其默认值;如果列不存在默认值,则自动使用NULL.
insert into dept values(10,'市场部',default);

4)使用子查询插入数据
insert into employee(empno,ename,sql,deptno)
select empno,ename,sal,deptno from emp
where deptno = 10;

    当要装载大批量数据时,用直接装载方式:
insert /*+APPEND */ into employee(empno,ename,sql,deptno)
select empno,ename,sal,deptno from emp
where deptno = 10;

5)使用多表插入数据。从Oracle9i开始,使用INSERT语句可以将某张表的数据同时插入到多张表中。
    使用ALL操作符,在每个条件子句上都要执行INTO子句后的子查询。
insert all when deptno=10 then into t_dept10
when deptno=20 then into t_dept20
when deptno=30 then into t_dept30
when job='clerk' then into t_clerk
else into t_other
select * from emp;

     使用FIRST操作符执行多表插入,如果数据已经满足了先前条件,并且已经被插入到某表,那么该行数据在后续插入中将不会被再次使用。
insert first when deptno=10 then into t_dept10
when deptno=20 then into t_dept20
when deptno=30 then into t_dept30
when job='clerk' then into t_clerk
else into t_other
select * from emp;

五、多列子查询
    多列子查询是指返回多列数据的子查询语句。当多列子查询返回单行数据时,在WHERE子句中可以使用单行比较符;当多列子查询返回多行数据时,在WHERE子句中必须使用多行比较符(IN,ANY,ALL)。
    如显示与Id为10000的人员部门和岗位完全相同的所有雇员:
SELECT ename,job,sal,deptno FROM emp WHERE (deptno,job)=(SELECT deptno,job FROM emp WHERE id=10000);

    当执行成对比较是时,因为要求多个列的数据必须同时匹配,所以必须要使用多列子查询实现。
     如显示工资和补助与部门30雇员的工资和补助完全匹配的所有雇员:
SELECT ename,sal,comm,dptno FROM emp WHERE (sal, nvl(comm,-1)) IN (SELECT sal, nvl(comm,-1) FROM emp WHERE deptno=30);

    执行非成对比较时,应该使用多个多行子查询来实现。
     如显示工资匹配于部门30工资列表、补助匹配于部门30补助列表的所有雇员:
SELECT ename,sal,comm,deptno FROM emp WHERE sal IN (SELECT sal FROM emp WHERE deptno=30) AND nvl(comm,-1) IN (SELECT nvl(comm,-1) FROM emp WHERE deptno=30);

六、相关子查询与FROM子句中子查询
     相关子查询是指需要引用主查询表列的子查询语句,是通过EXISTS谓词来实现的。
      如显示工作在“NEW YORK”的所有雇员:
SELECT ename,job,sal,deptno FROM emp WHERE EXISTS (SELECT 1 FROM dept WHERE dept.deptno=emp.deptno AND dept.loc='NEW YORK');

     在FROM子句中使用子查询时,该子查询会被作为视图对待。因此也被称为内嵌视图。
      如显示高于部门平均工资的雇员信息:
SELECT ename,job,sal FROM emp, (SELECT deptno,avg(sal) avgsal FROM emp GROUP BY deptno) dept WHERE emp.deptno=dept.deptno AND sal>dept.avgsal;

七、合并查询
    集合操作符有UNION,UNION ALL, INTERSECT和MINUS。当使用集合操作符时,必须确保不同查询的列个数和数据类型都要匹配。
     有以下一些限制:
1.对于LOB,VARRAY和嵌套表列来说,集合操作符是无效的。
2.对于LONG列来说,UNION,INTERSECT,MINUS操作符是无效的。
3.如果选择列表包含了表达式,则必须为为其指定列别名。
(一)UNION
    UNION操作符用于获取两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。并且会以第一列的结果进行排序。
SELECT ename,sal,job FROM emp WHERE sal>2500 UNION SELECT ename,sal,job FROM emp WHERE job='MANAGER';

(二)UNION ALL
    UNION ALL操作符获取两个结果集的并集,但不会取消重复值,而且也不会以任何列进行排序。
SELECT ename,sal,job FROM emp WHERE sal>2500 UNION ALL SELECT ename,sal,job FROM emp WHERE job='MANAGER';

(三)INTERSECT
    INTERSECT操作符用于获取两个结果集的交集。当使用该操作符时,只会显示同时存在于两个结果集中的数据,并且会以第一列进行排序。
SELECT ename,sal,job FROM emp WHERE sal>2500 INTERSECT SELECT ename,sal,job FROM emp WHERE job='MANAGER';

(四)MINUS
    MINUS用于获取两个结果集的差集。以第一列进行排序。
SELECT ename,sal,job FROM emp WHERE sal>2500 MINUS SELECT ename,sal,job FROM emp WHERE job='MANAGER';

八、CASE表达式和倒叙查询
     通过CASE表达式,可以避免调用过程来完成条件分支操作。
SELECT ename,sal,CASE WHEN sal>3000 THEN 3 WHEN sal>2000 THEN 2 ELSE 1 END grade FROM emp WHERE deptno=10;

    默认情况下,当执行查询操作时,只能看到最近提交的数据。从Oracle9i开始,通过使用倒叙查询(Flashback Query)特征,可以查看到过去某个时间点所提交的数据。注意,如果使用倒叙查询,那么要示数据库必须彩UNDO管理方式,并且初始化参数undo_retention限制了UNDO数据的保留时间。
SELECT ename,sal FROM emp AS OF TIMESTAMP to_timestamp('2009-01-01 12:12:00','YYYY-MM-DD HH24:MI:SS') WHERE ename='CLARK';

九、使用WITH子句重用子查询
     从Oracle9i开始,通过WITH子句可以给子查询指定一个名称,并且使得在一条语句中可以完成所有任务,从而避免使用临时表。
      如显示部门工资总和高于雇员工资总和三分之一的部门名称及工资总和。
WITH summary AS (SELECT dname,SUM(sal) AS dept_total FROM emp,dept WHERE emp.deptno=dept.deptno GROUP BY dname)
SELECT dname, dept_total FROM summary WHERE dept_total>(
SELECT SUM(dept_total) * 1/3 FROM summary);

十、oracle对记录进行去重sql
  DELETE FROM [TABLE_NAME] 
  WHERE ROWID NOT IN (
     SELECT MIN(ROWID) FROM [TABLE_NAME] 
     GROUP BY [COL1,COL2,COL3...]
  ); 

十一、SQL排序后的NULL位置
      可以把那些NULL值假想为所有内容中值是最大的,因此,升序排序后NULL值在最后,倒序排序后NULL值在最前!
       当指定"NULLS FIRST"时,无论是升序排序还是倒序排序,NULL值都会排列在最前面;当指定“NULLS LAST”时,无论是升序排序还是倒序排序,NULL值都会排列在最后面。
  SELECT * FROM t ORDER BY x DESC NULLS LAST;
分享到:
评论

相关推荐

    Oracle经典SQL语句

    复制一张表的数据到另外一张表中 PLSQL中存储过程及游标的基本使用 Oracle中恢复某张表丢失数据的方法 -- 把SELECT出来的结果导到一个文本文件中 -- 查询新建用户 -- 查询那些用户,操纵了那些表造成了锁机 --看锁...

    Oracle_Database_11g完全参考手册.part3/3

     构造SQL语句、过程、查询和子查询  使用虚拟专用数据库和透明数据加密优化安全性  使用SQL*oader乘10racle Data Pump导入和导出数据  使用SQL重放、变更管理和缓存结果  使用闪回和自动撤消管理功能避免人为...

    Oracle_Database_11g完全参考手册.part2/3

     构造SQL语句、过程、查询和子查询  使用虚拟专用数据库和透明数据加密优化安全性  使用SQL*oader乘10racle Data Pump导入和导出数据  使用SQL重放、变更管理和缓存结果  使用闪回和自动撤消管理功能避免人为...

    Oracle 10g应用指导

    包括加密Oracle子程序,存储应用程序用户名和口令,禁止修改删除数据库对象,Oracle数据加密以及丢失SYSMAN及资料档案库用户口令的解决方法。书中给出了丰富的图表,多数图例是作者根据多年实践总结出来的,图示简练...

    Oracle11g从入门到精通2

    3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.4.4 TRLINCATE语句 3.5 数据控制 3.5.1 GRANT语句 3.5.2 REVOKE语句 3.6 Oracle常用函数 3.6.1 字符类函数 ...

    精通SQL 结构化查询语言详解

    10.2.2 IN子查询实现集合交和集合差运算 10.2.3 EXISTS子查询  10.2.4 EXISTS子查询实现两表交集  10.2.5 SOME/ALL子查询  10.2.6 UNIQUE子查询  10.3 相关子查询  10.3.1 使用IN引入相关子查询  ...

    Oracle.11g.从入门到精通 (2/2)

    3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.4.4 TRLINCATE语句 3.5 数据控制 3.5.1 GRANT语句 3.5.2 REVOKE语句 3.6 Oracle常用函数 3.6.1 字符类函数 3.6.2 数字类函数 ...

    Oracle.11g.从入门到精通 (1/2)

    3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.4.4 TRLINCATE语句 3.5 数据控制 3.5.1 GRANT语句 3.5.2 REVOKE语句 3.6 Oracle常用函数 3.6.1 字符类函数 3.6.2 数字类函数 ...

    Oracle数据库管理员技术指南

    3.4.1 子分区的导出和导入 3.4.2 导出/导入多个转储文件 3.4.3 为卸载表的导出过程的选择语句 指定一个查询 3.4.4 导出/导入预计算优化程序统计 数据 3.4.5 可移动表空间 3.5 回顾 第4章 设计高可用性数据库...

    Oracle11g从入门到精通

    3.3.8 子查询 3.4 数据操纵 3.4.1 INSERT语句 3.4.2 UPDATE语句 3.4.3 DELETE语句 3.4.4 TRLINCATE语句 3.5 数据控制 3.5.1 GRANT语句 3.5.2 REVOKE语句 3.6 Oracle常用函数 3.6.1 字符类函数 3.6.2 数字...

    oracle实验报告

    在命令的where子句中给出1=2,表示条件不可能成立,因而只能复制表结构,而不能复制任何数据到新表中去。另外,还可以复制一个表的部分列定义或部分列定义及其数据。 三、 Oracle数据库数据查询 1、单表查询 2、多...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    10.2.5 将子查询因子化应用到PL/SQL中 270 10.3 递归子查询 273 10.3.1 一个CONNECT BY的例子 274 10.3.2 使用RSF的例子 275 10.3.3 RSF的限制条件 276 10.3.4 与CONNECT BY的不同点 276 10.4 复制CONNECT BY...

    Oracle8i_9i数据库基础

    §3.9 表和索引有关的数据字典 124 §3.9.1 表和索引数据字典 124 §3.9.2 数据字典查询例子 125 第四章 视图、同义词和序列 128 §4.1 视图 128 §4.1.1 使用视图来修改表中数据 128 §4.1.2 创建一个新视图 128 §...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。  SQL语言主要包含5个部分  数据定义...

    Oracle+10g应用指导与案例精讲

    包括加密Oracle子程序,存储应用程序用户名和口令,禁止修改删除数据库对象,Oracle数据加密以及丢失SYSMAN及资料档案库用户口令的解决方法。书中给出了丰富的图表,多数图例是作者根据多年实践总结出来的,图示简练...

    Oracle创建视图(View)

    1.视图的查询可以使用复杂的SELECT语法,包括连接/分组查询和子查询; 2.在没有WITH CHECK OPTION和 READ ONLY 的情况下,查询中不能使用ORDER BY 子句; 3.如果没有为CHECK OPTION约束命名,系统会自动为之命名,...

    oracle数据库dba管理手册

    1.4.1 表、列和数据类型 4 1.4.2 约束条件 5 1.4.3 抽象数据类型 6 1.4.4 分区和子分区 7 1.4.5 用户 7 1.4.6 模式 8 1.4.7 索引 8 1.4.8 簇 9 1.4.9 散列簇 9 1.4.10 视图 9 1.4.11 序列 10 1.4.12 过程 10 1.4.13 ...

Global site tag (gtag.js) - Google Analytics