一、连接查询 

1.内连接 

    内连接用于返回满足连接条件的所有记录。默认情况下,在执行连接查询时如果没有指定任何连接操作符,那么这些连接查询都属于内连接。

Sql代码  

1.  
SELECT a.dname,b.ename from dept a,emp b where a.deptno=b.deptno and a.deptno=10;

在FROM子句中指定INNER JOIN选项,也可以指定内连接。

Sql代码  

1.  
SELECT a.dname,b.ename from dept a INNER JOIN emp b where a.deptno=b.deptno and a.deptno=10;

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

Sql代码  

1.  
SELECT dname,ename FROM dept NATURAL JOIN emp;

2.左外连接 

    左外连接通过指定LEFT[OUTER]
JOIN选项来实现。当使用左外连接时,不仅会返回满足连接条件的所有记录,而且还会返回不满足连接条件的连接操作符左边表的其他行。

Sql代码  

1.  
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选项来实现的。当使用右外连接时,不仅会返回满足连接条件的所有行,而且还会返回不满足连接条件操作符右边表的其他行。

Sql代码  

1.  
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 选项来实现的。当使用完全外连接时,不仅会返回满足连接条件的所有行,而且还会返回不满足连接条件的所有其他行。

Sql代码  

1.  
SELECT a.dname,b.ename FROM dept a FULL JOIN emp b ON a.deptno=b.deptno AND a.deptno=10;

相当于没连接去掉where条件

Sql代码  

1.  
SELECT a.dname,b.ename from dept a,emp;

5.使用(+)操作符 

    在Oracle9i之前,当执行外连接时,都是使用连接操作符(+)来完成的。尽管可以使用操作符(+)执行外连接操作。但Oralce9i开始Oracle建议使用OUTER
JOIN执行外连接。语法如下: 

    SELECT table1.column, table2.column FROM table1, table2 WHERE table1.column1(+) = table2.column2; 

    当使用(+)操作符执行外连接时,应该将该操作符放在显示较少行(完全满足连接条件行)的一端。 

     一句话,左外连接时,(+)要放在右边表的一端。右外连接时,(+)放在左边表的一端。 

    左外连接:

Sql代码  

1.  
SELECT a.dname,b.ename FROM dept a, emp b where a.deptno=b.deptno(+) AND b.deptno(+)=10;

右外连接

Sql代码  

1.  
SELECT a.dname,b.ename FROM dept a, emp b where a.deptno(+)=b.deptno AND a.deptno(+)=10;

二、递归查询 

1.语法

Sql代码  

1.  
Select * from …. Where [结果过滤条件语句]

2.  
Start with  [起始条件过滤语句]

3.  
Connect by prior [中间记录过滤条件语句]

2.例子

Sql代码  

1.  
Select * from company t Where t.flag=1

2.  
Start with  t.company_id=50500000

3.  
Connect by prior t.company_id=t.parent_id

说明:

Sql代码  

1.  
select [level],column,expr from table [where condition]

2.  
[start with] //[起点]

3.  
[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下,实现中-英字符集转换

Sql代码  

1.  
alter session set nls_language='AMERICAN';

2.  
alter session set nls_language='SIMPLIFIED CHINESE';

四、复制表和数据 

1)建表

Sql代码  

1.  
create table test as select * from dept; --从已知表复制数据和结构

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

建立视图:

Sql代码  

1.  
CREATE OR REPLACE VIEW dept_10 AS SELECT empno,ename,job,sal,deptno FROM emp WHERE deptno=10 ORDER BY empno;

建立实体化视图:

Sql代码  

1.  
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)不使用列的列表插入数据:

Sql代码  

1.  
insert into test select * from dept;

3)使用DEFAULT插入数据:如果列存在默认值,则会使用其默认值;如果列不存在默认值,则自动使用NULL.

Sql代码  

1.  
insert into dept values(10,'市场部',default);

4)使用子查询插入数据

将查出来的内容全部插入

Sql代码  

1.  
insert into employee(empno,ename,sql,deptno)

2.  
select empno,ename,sal,deptno from emp

3.  
where deptno = 10;

将查出来的内容部分插入

Sql代码  

1.  
insert into employee(empno,ename,sql,deptno)

2.  
select empno,’杨凯’,sal,deptno from emp

3.  
where deptno = 10;

当要装载大批量数据时,用直接装载方式:

Sql代码  

1.  
insert /*+APPEND */ into employee(empno,ename,sql,deptno)

2.  
select empno,ename,sal,deptno from emp

3.  
where deptno = 10;

5)使用多表插入数据。从Oracle9i开始,使用INSERT语句可以将某张表的数据同时插入到多张表中。 

    使用ALL操作符,在每个条件子句上都要执行INTO子句后的子查询。

Sql代码  

1.  
insert all when deptno=10 then into t_dept10

2.  
when deptno=20 then into t_dept20

3.  
when deptno=30 then into t_dept30

4.  
when job='clerk' then into t_clerk

5.  
else into t_other

6.  
select * from emp;

使用FIRST操作符执行多表插入,如果数据已经满足了先前条件,并且已经被插入到某表,那么该行数据在后续插入中将不会被再次使用。

Sql代码  

1.  
insert first when deptno=10 then into t_dept10

2.  
when deptno=20 then into t_dept20

3.  
when deptno=30 then into t_dept30

4.  
when job='clerk' then into t_clerk

5.  
else into t_other

6.  
select * from emp;

五、多列子查询 

    多列子查询是指返回多列数据的子查询语句。当多列子查询返回单行数据时,在WHERE子句中可以使用单行比较符;当多列子查询返回多行数据时,在WHERE子句中必须使用多行比较符(IN,ANY,ALL)。 

    的人员部门和岗位完全相同的所有雇员:

Sql代码  

1.  
SELECT ename,job,sal,deptno FROM emp WHERE (deptno,job)=(SELECT deptno,job FROM emp WHERE id=10000);

当执行成对比较是时,因为要求多个列的数据必须同时匹配,所以必须要使用多列子查询实现。 

     雇员的工资和补助完全匹配的所有雇员:

Sql代码  

1.  
SELECT ename,sal,comm,dptno FROM emp WHERE (sal, nvl(comm,-1)) IN (SELECT sal, nvl(comm,-1) FROM emp WHERE deptno=30);

执行非成对比较时,应该使用多个多行子查询来实现。 

     补助列表的所有雇员:

Sql代码  

1.  
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”的所有雇员:

Sql代码  

1.  
SELECT ename,job,sal,deptno FROM emp WHERE EXISTS (SELECT 1 FROM dept WHERE dept.deptno=emp.deptno AND dept.loc='NEW YORK');

在FROM子句中使用子查询时,该子查询会被作为视图对待。因此也被称为内嵌视图。 

      如显示高于部门平均工资的雇员信息:

Sql代码  

1.  
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操作符用于获取两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。并且会以第一列的结果进行排序。

Sql代码  

1.  
SELECT ename,sal,job FROM emp WHERE sal>2500 UNION SELECT ename,sal,job FROM emp WHERE job='MANAGER';

(二)UNION ALL 

    UNION ALL操作符获取两个结果集的并集,但不会取消重复值,而且也不会以任何列进行排序。

Sql代码  

1.  
SELECT ename,sal,job FROM emp WHERE sal>2500 UNION ALL SELECT ename,sal,job FROM emp WHERE job='MANAGER';

(三)INTERSECT 

    INTERSECT操作符用于获取两个结果集的交集。当使用该操作符时,只会显示同时存在于两个结果集中的数据,并且会以第一列进行排序。

Sql代码  

1.  
SELECT ename,sal,job FROM emp WHERE sal>2500 INTERSECT SELECT ename,sal,job FROM emp WHERE job='MANAGER';

(四)MINUS 

    MINUS用于获取两个结果集的差集。以第一列进行排序。

Sql代码  

1.  
SELECT ename,sal,job FROM emp WHERE sal>2500 MINUS SELECT ename,sal,job FROM emp WHERE job='MANAGER';

八、CASE表达式和倒叙查询 

     通过CASE表达式,可以避免调用过程来完成条件分支操作。

Sql代码  

1.  
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数据的保留时间。

Sql代码  

1.  
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子句可以给子查询指定一个名称,并且使得在一条语句中可以完成所有任务,从而避免使用临时表。 

      如显示部门工资总和高于雇员工资总和三分之一的部门名称及工资总和。

Sql代码  

1.  
WITH summary AS (SELECT dname,SUM(sal) AS dept_total FROM emp,dept WHERE emp.deptno=dept.deptno GROUP BY dname)

2.  
SELECT dname, dept_total FROM summary WHERE dept_total>(

3.  
SELECT SUM(dept_total) * 1/3 FROM summary);

十、oracle对记录进行去重sql

Sql代码  

1.  
DELETE FROM [TABLE_NAME]

2.  
WHERE ROWID NOT IN (

3.  
   SELECT MIN(ROWID) FROM [TABLE_NAME]

4.  
   GROUP BY [COL1,COL2,COL3...]

5.  
);

统计酒店名不重复的总数

Sql代码  

1.  
SELECT COUNT(DISTINCT(hotel_id)) FROM
t_app_travel_hotel_comment
;

十一、SQL排序后的NULL位置 

      可以把那些NULL值假想为所有内容中值是最大的,因此,升序排序后NULL值在最后,倒序排序后NULL值在最前! 

       当指定"NULLS  FIRST"时,无论是升序排序还是倒序排序,NULL值都会排列在最前面;当指定“NULLS
 LAST”时,无论是升序排序还是倒序排序,NULL值都会排列在最后面。

Sql代码  

1.  
SELECT * FROM t ORDER BY x DESC NULLS LAST;

Oracle与Mysql的高级查询与难点sql的更多相关文章

  1. Oracle和MySql的分页查询区别和PL/SQL的基本概念

    Oracle和MySql的分页查询区别:     Oracle的分析查询,之前Oracle的分页是使用伪列 ROWNUM 结合子查询实现,mysql的分页更简单,直接使用 LIMIT 关键字就可以实现 ...

  2. Mysql 基础 高级查询

    在西面内容中    car  和  nation   都表示 表名 1.无论 高级查询还是简单查询   都用  select.. from..语句   from  后面 加表名  可以使一张表也可以是 ...

  3. MySQL的高级查询

    高级查询 1.连接查询(对列的扩展) 第一种形式select * from Info,Nation #会形成笛卡尔积 select * from Info,Nation where Info.Nati ...

  4. MYSQL之高级查询

    PHP高级查询 分组查询.联合查询.连接查询.子查询 版权声明:本文为博主原创文章,未经博主允许不得转载.

  5. 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序

    前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来 ...

  6. MySQL架构总览->查询执行流程->SQL解析顺序

    Reference:  https://www.cnblogs.com/annsshadow/p/5037667.html 前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后 ...

  7. 步步深入MySQL:架构->查询执行流程->SQL解析顺序!

    一.前言 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序 ...

  8. python数据库-MySQL数据库高级查询操作(51)

    一.什么是关系? 1.分析:有这么一组数据关于学生的数据 学号.姓名.年龄.住址.成绩.学科.学科(语文.数学.英语) 我们应该怎么去设计储存这些数据呢? 2.先考虑第一范式:列不可在拆分原则 这里面 ...

  9. mybatis oracle和mysql like模糊查询写法

    oracle:RESOURCE_NAME LIKE '%' || #{resourceName} || '%'mysql:RESOURCE_NAME like concat(concat(" ...

随机推荐

  1. 以KNN为例用sklearn进行数据分析和预测

    准备 相关的库 相关的库包括: numpy pandas sklearn 带入代码如下: import pandas as pd import numpy as np from sklearn.nei ...

  2. win10下载软件防止被杀

    很少接触win10,现在需要下载一个软件,但是一直被和谐掉 解决方案: Windows defender 点击病毒和威胁防护 打开定期扫描 找到病毒威胁防护设置 找到排除项 添加排除项 下载成功 但是 ...

  3. JS 特效三大系列总结

    一. offset系列 1. offset系列的5个属性 1. offsetLeft : 用于获取元素到最近的定位父盒子的左侧距离 * 计算方式: 当前元素的左边框的左侧到定位父盒子的左边框右侧 * ...

  4. Docker容器化【Docker镜像与容器相关命令】

    # Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用 ...

  5. linux下tab作用的描述?

    [Tab] 接在一串指令的第一个字的后面,则为命令补全;     实例怎么描述?什么叫一串指令的第一个字?[Tab] 接在一串指令的第二个字以后时,则为『文件补齐』   实例怎么描述?什么叫一串指令的 ...

  6. 让debian8.8不休眠,debian设置不休眠模式,因为我的本本休眠了时间不准确了,得重新同步

    第一步:sudo vi /etc/systemd/logind.conf /*最好备份下再修改*/ 把下面的参数改为ignoreHandleLidSwitch=ignore 第二步: sudo ser ...

  7. Docker相关学习地址

    菜鸟教程:http://www.runoob.com/docker/docker-image-usage.html 官方文档:https://docs.docker.com/

  8. 六、linux-mysql的mysql字符集问题

    一.什么是字符集? 字符集是用来定义mysql数据字符串的存储方式,而校对规则则是定义比较字符串的方式.mysql字符集包含字符集和校对规则. 二.字符集的选择 常见的字符集中,中英混合环境建议用UT ...

  9. 吴裕雄--天生自然C语言开发:字符串

    ] = {'H', 'e', 'l', 'l', 'o', '\0'}; char greeting[] = "Hello"; #include <stdio.h> i ...

  10. day17-反射

    #反射最常用的两个方法:hasattr getattr # 1. 反射对象属性,反射对象方法: class Goods: def __init__(self,name): self.name = na ...