DUAL介绍:
dual是一张虚拟表,只有一行一列,用来构成select的语法规则
Oracle的查询中,必须使用“select 列… from 表”的完整语法
当查询单行函数的时候,from后面使用DUAL表
dual表在系统中只有一行一列,该表在输出单行函数时为了select…from的语法完整性而使用

.

———————————

——— 运算符 ———

———————————

.

关系运算符:

运算符 说明
= 等于
<> != 不等于
< 小于
> 大于
<= 小于或者等于
>= 大于或者等于

逻辑运算符: NOT > AND > OR
字符串连接操作符: || a || b

———————————————

——— DISTINCT操作 ———

———————————————

.

  1. Oracle查询中结果中,可能出现若干行相同的情况<br />那么可以使用DISTINCT消除重复行,<br />但是 GROUP BY 与之相比比性能较好
SELECT DISTINCT DEPTNO FROM EMP;

————————————-

——— NULL操作 ———

————————————-

.

如果某条记录中有缺少的数据值,就是空值(NULL值)。
空值不是0或者空格,空值是指未赋值、未知或不可用的值。
任何数据类型的列都可以包括NULL值,除非该列被定义为非空或者主键。
在查询条件中NULL值用IS NULL作判断条件,非NULL值用 IS NOT NULL做判断条件。

空值的一些特性
1、空值跟任何值进行算术运算,得到的结果都为空值
2、空值跟任何值进行关系运算,得到的结果都为不成立
3、空值不参与任何聚合运算
4、排序的时候,空值永远是最大的


SELECT * FROM EMP E WHERE COMM IS NULL; 

SELECT * FROM EMP E WHERE COMM IS NOT NULL;

———————————

——— IN插入 ———

———————————

.

在Where子句中可以使用IN操作符来查询其列值在指定的列表中的行。

[例] 查询出工作职责是SALESMAN、PRESIDENT或者ANALYST的员工。
有两种表示方法:
1. WHERE job = ‘SALESMAN ‘ OR job = ‘PRESIDENT ‘ OR job = ‘ANALYST ‘
2. WHERE job IN (‘SALESMAN’, ‘PRESIDENT’, ‘ANALYST’)


SELECT E.ENAME,E.JOB,E.SAL 
FROM EMP E
WHERE E.JOB IN ('SALESMAN', 'PRESIDENT', 'ANALYST');

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

SELECT E.ENAME,E.JOB,E.SAL 
FROM EMP E
WHERE E.JOB NOT IN ('SALESMAN', 'PRESIDENT', 'ANALYST');

————————————————-

——— BETWEEN…AND ———

————————————————-

.

在WHERE子句中,可以使用BETWEEN操作符来查询列值包含在指定区间内的行
BETWEEN操作所指定的范围也包括边界
[例] 查询工资从1000到2000之间的员工
可以使用传统方法:
WHERE SAL>=1000 AND SAL<=2000
也可以使用:
WHERE SAL BETWEEN 1000 AND 2000

SELECT E.ENAME, E.JOB, E.SAL 
FROM EMP E 
WHERE E.SAL BETWEEN 1000 AND 2000;

——————————————-

——— LIKE模糊查询 ———

——————————————-

.

在一些查询时,可能把握不准需要查询的确切值
比如百度搜索时输入关键字即可查询出相关的结果,这种查询称为模糊查询。
模糊查询使用LIKE关键字通过字符匹配检索出所需要的数据行。
字符匹配操作可以使用通配符“%”和“_”:

% 表示零个或者多个任意字符 _ 代表一个任意字符

[例] 显示员工名称以J开头以S结尾的员工的姓名、工资和工资:

SELECT E.ENAME, E.JOB, E.SAL 
FROM      EMP E
WHERE  E.ENAME LIKE 'J%S';

————————————

——— 集合运算 ———

————————————

.

集合运算就是将两个或者多个结果集组合成为一个结果集。
集合运算包括:
Ø INTERSECT(交集),返回两个查询共有的记录。
Ø UNION ALL(并集),返回各个查询的所有记录,包括重复记录。
Ø UNION(并集),返回各个查询的所有记录,不包括重复记录。
Ø MINUS(补集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录。
( 前者有,后者無 )

当使用集合操作的时候,要注意:

  -   查询所返回的列数以及列的类型必须匹配,列名可以不同
  -   只有UNION ALL不会去重。其他三个都需要排序后去重,性能比较差

[例] 查询出dept表中哪个部门下没有员工,
只需求出dept表中的部门号和emp表中的部门号的补集即可

SELECT D.DEPTNO FROM DEPT D
MINUS
SELECT E.DEPTNO FROM EMP E;

————————————

——— 连接查询 ———

————————————

.

内连接

-----------------------✂---------------------------

              SELECT   *
                       FROM     表名1
                       JOIN     表名2
                     ON       表名1.字段1 = 表名2.字段1

-----------------------✂---------------------------

                  SELECT   *
                           FROM     表名1,表名2
                             WHERE    表名1.字段1 = 表名2.字段1

-----------------------✂---------------------------

外连接


                              左连接   &    右连接

←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←← 


                    SELECT
                    FROM              表名1                     
                    LEFT JOIN     表名2               
                    ON                     表名1.字段1 = 表名2.字段1
                    AND                 表名1.字段2 = 表名2.字段2;

                    ←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←

                                  (Oracle写法)

                   SELECT     *
                   FROM             表名1,表名2
                   WHERE             表名1.字段 = 表名2.字段(+);     --  "+" 为从表



←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←←    



                              全外连接(full outer join)

                      SELECT *
                      FROM         表名1 
                      FULL JOIN    表名2
                      ON                      S.DEPTNO = D.DEPTNO;


→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→

————————————

——— 子查询 ———

————————————

.

子查询在SELECT、UPDATE、DELETE语句内部可以出现SELECT语句。
内部的SELECT语句结果可以作为外部语句中条件子句的一部分,也可以作为外部查询的临时表。

子查询的类型有:

  1.     单行子查询:不向外部返回结果,或者只返回一行结果 
  1.     多行子查询:向外部返回零行、一行或者多行结果 
【例1】查询出销售部(SALES)下面的员工姓名,工作,工资。
                  例题分析:该问题可以用联接查询实现,
                  由于所需的结果信息都在Emp表中,
                  可以先从Dept表中查询出销售部对应的部门号,
                  然后根据当前部门号再到Emp表中查询出符合该部门的员工记录即可。
                  从销售表中查询出的结果可以作为Emp表中查询的条件

        SELECT E.ENAME, E.JOB, E.SAL
        FROM EMP E
        WHERE E.DEPTNO = (SELECT D.DEPTNO FROM DEPT D WHERE DNAME = 'SALES')


需要注意:

    如果内部查询不返回任何记录,
    则外部条件中字段DEPTNO与NULL比较永远为假,也就是说外部查询不返还任何结果

    在单行子查询中外部查询可以使用=、>、<、>=、<=、<>等比较运算符

    内部查询返回的结果必须与外部查询条件中的字段(DEPTNO)匹配

    如果内部查询返回多行结果则出现错误


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


【例2】查询EMP表中每个部门的最低工资的员工信息

        SELECT E.*
        FROM EMP E
        WHERE E.SAL IN (SELECT MIN(A.SAL) FROM EMP A WHERE E.DEPTNO = A.DEPTNO)