暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle PL/SQL 基础教程(3)简单查询(下)

SQL干货分享 2021-08-13
356

(CSDN博主:写代码也要符合基本法)
各位看官老爷大家好,又到了每周三的小刘胡诌八扯小课堂时间,上堂课我们已经从横向学习了 SQL 查询语句,今天我们就来从纵向着手,更加深入地了解查询语句
PL/SQL 基础教程第三课:简单 SQL 查询!下篇!

我们先来看一下今天学习内容的简明语法结构式
上堂课我们学习了关键字 WHERE 前面的部分,今天我们就先来着重学习一下 WHERE 条件

WHERE条件总述
    SQL> --查询名叫SCOTT的员工
    SQL> SELECT e.* FROM emp e WHERE e.ename = 'SCOTT';


    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------
    7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20


    SQL> --查询工资在3k到5k的员工
    SQL> SELECT e.* FROM emp e WHERE e.sal BETWEEN 3000 AND 5000;


    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------
    7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20
    7839 KING PRESIDENT 1981/11/17 5000.00 10
    7902 FORD ANALYST 7566 1981/12/3 3000.00 20


    SQL> --查询工号是7839/7566/7788/7876的员工
    SQL> SELECT e.* FROM emp e WHERE e.empno IN (7839, 7566, 7788, 7876);


    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    ----- ---------- --------- ----- ----------- --------- --------- ------
    7566 JONES MANAGER 7839 1981/4/2 2975.00 20
    7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20
    7839 KING PRESIDENT 1981/11/17 5000.00 10
     7876 ADAMS      CLERK      7788 1983/1/12     1100.00               20
    复制

    观察上面的几个例子,我们不难发现,WHERE 用以设立筛选条件,这个筛选条件是作用在结果集纵向上的

    表别名可以在 WHERE 节中使用,但要注意的是,SELECT 列表中声明的列别名是不能在 WHERE 条件中使用的,这是因为数据库实际在执行 SQL 语句的过程中,是先执行了 WHERE 条件,而后在返回结果集时才用列别名进行修饰
    另外如果使用字符串常量,需要用单引号括起来表示,而数值常量则不需要(在 Oracle 中,一定长度内的纯数字字符串可以静默地转换为数字类型,反之亦然)
    至于日期常量则比较复杂,因为我们没法直接键入一个日期(类似 2020/10/14 这样婶的值实际是我们表示日期的字符串,并不是日期本身),Oracle 提供了将字符串转换为日期量值的函数 TO_DATE,使用方法例如 TO_DATE('27-10月-20'),关于这个函数更详细的使用方法,我们以后会全面讲解

    比较运算符
    所谓 WHERE 条件就是指示特定的运算规则,以验证表中每一行是否符合要求,符合要求的行,经过规则运算结果会是 TRUE,从而被选入查询结果;不符合要求的行,对应运算结果就会是 FALSE,继而被数据库舍弃
    WHERE 条件中不可细分的最小单元就是每一条由若干列或常量值用比较运算符连接表示出的表达式,例如 empno=7788,表示选择 empno 字段值为 7788 的行
    • =、>、>=、<、<= 这些比较运算符使用方法和它们在数学运算中一样,都是对符号两边的量值进行对应的比较验证

    • 在 Oracle 中 <>、!=、^= 等运算符都可以表示“不等于”运算

    • 关键字 BETWEEN <下限值> AND <上限值> 可以表示一个闭区间,也就是筛选“大于等于下限值并且小于等于上限值”的值

    • 关键字 IN 用来罗列要筛选的特定元素,这些元素要放在括号中,元素之间使用逗号隔开,例如 empno IN (7839, 7566, 7788) 表示选择 empno 列的值为 7839 或者 7566 或者 7788 的行;相反地,NOT IN 则表示排除掉集合中罗列的元素,例如 empno NOT IN (7839, 7566, 7788) 则表示排除掉 empno 列的值为 7839 或者 7566 或者 7788 的行

    • LIKE 运算符是专门用来检验字符串是否符合指定特征的,这个所谓的“特征”也是一个字符串,字符串中可以使用两个通配符,除了通配符以外的其它字符就是表示其字符本身,通配符包括下划线(_)匹配一个任意字符,百分号(%)匹配任意个任意字符

    • 如前面所说的 NULL 的特殊性,NULL 与其它量值或者 NULL 之间不能使用一般的运算符来比较,准确的说 NULL 是一种概念,所以筛选某列中的空值或者非空值,要使用专门的 IS NULL 或者 IS NOT NULL 来判断

    下面着重演示一下 [NOT] LIKE 和 IS [NOT] NULL 的用法
      SQL> --1、LIKE的使用方法
      SQL> --例1.1:查找姓名以S开头的员工
      SQL> SELECT e.* FROM emp e WHERE e.ename LIKE 'S%';


      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      ----- ---------- --------- ----- ----------- --------- --------- ------
      7369 SMITH CLERK 7902 1980/12/17 800.00 20
      7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20


      SQL> --例1.2:查找姓名中包含字母A的员工
      SQL> SELECT e.* FROM emp e WHERE e.ename LIKE '%A%';


      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      ----- ---------- --------- ----- ----------- --------- --------- ------
      7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
      7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
      7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
      7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
      7782 CLARK MANAGER 7839 1981/6/9 2450.00 10
      7876 ADAMS CLERK 7788 1983/1/12 1100.00 20
      7900 JAMES CLERK 7698 1981/12/3 950.00 30


      SQL> --例1.3:查找姓名中第二个字母是A的员工
      SQL> SELECT e.* FROM emp e WHERE e.ename LIKE '_A%';


      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      ----- ---------- --------- ----- ----------- --------- --------- ------
      7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
      7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
      7900 JAMES CLERK 7698 1981/12/3 950.00 30


      SQL> --例1.4:查找姓名中第三个字母是A的员工
      SQL> SELECT e.* FROM emp e WHERE e.ename LIKE '__A%';


      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      ----- ---------- --------- ----- ----------- --------- --------- ------
      7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
      7782 CLARK MANAGER 7839 1981/6/9 2450.00 10
      7876 ADAMS CLERK 7788 1983/1/12 1100.00 20


      SQL> --2、IS NULL的使用方法
      SQL> --例2.1:查找绩效为空的员工
      SQL> SELECT e.* FROM emp e WHERE e.comm IS NULL;


      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      ----- ---------- --------- ----- ----------- --------- --------- ------
      7369 SMITH CLERK 7902 1980/12/17 800.00 20
      7566 JONES MANAGER 7839 1981/4/2 2975.00 20
      7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
      7782 CLARK MANAGER 7839 1981/6/9 2450.00 10
      7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20
      7839 KING PRESIDENT 1981/11/17 5000.00 10
      7876 ADAMS CLERK 7788 1983/1/12 1100.00 20
      7900 JAMES CLERK 7698 1981/12/3 950.00 30
      7902 FORD ANALYST 7566 1981/12/3 3000.00 20
      7934 MILLER CLERK 7782 1982/1/23 1300.00 10


      SQL> --例2.2:查找绩效不为空的员工
      SQL> SELECT e.* FROM emp e WHERE e.comm IS NOT NULL;


      EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
      ----- ---------- --------- ----- ----------- --------- --------- ------
      7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
      7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
      7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
       7844 TURNER     SALESMAN   7698 1981/9/8      1500.00      0.00     30
      复制
      逻辑运算符
      学习完比较运算符,我们不难发现,想要应付日常工作所需,每次只能写一个小条件来查询是远远远远远远不够的,所以我们再来学习一下逻辑运算符
      上面说到 WHERE 条件可以拆分为若干个表达式,每个表达式都将返回一个布尔结果,那么逻辑运算符就是串联这些布尔表达式成为一个大 WHERE 条件的纽带
      AND 只有在两边的表达式都为真时,运算结果才能为真,表示“并且”的意思。数据库在实际执行语句时,如果 AND 左边的表达式结果已经是假了,就不会计算右边的表达式
        SQL> --查询30号部门当中从事CLERK职务之员工
        SQL> SELECT e.* FROM emp e WHERE e.deptno = 30 AND e.job = 'CLERK';


        EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
        ----- ---------- --------- ----- ----------- --------- --------- ------
         7900 JAMES      CLERK      7698 1981/12/3      950.00               30
        复制

        OR 则在两边任一个表达式为真时,运算结果就可以为真,表示“或者”的意思。数据库在实际执行语句时,如果 OR 左边的表达式结果已经是真了,就不会计算右边的表达式

          SQL> --查询所有供职于30号部门或者从事CLERK职务之员工
          SQL> SELECT e.* FROM emp e WHERE e.deptno = 30 OR e.job = 'CLERK';


          EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
          ----- ---------- --------- ----- ----------- --------- --------- ------
          7369 SMITH CLERK 7902 1980/12/17 800.00 20
          7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
          7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
          7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
          7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
          7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
          7876 ADAMS CLERK 7788 1983/1/12 1100.00 20
          7900 JAMES CLERK 7698 1981/12/3 950.00 30
           7934 MILLER     CLERK      7782 1982/1/23     1300.00               10
          复制

          NOT 是将表达式原本的结果反过来,如果表达式本来结果为真,则 NOT 可以返回假,反之亦然,就像 NOT IN、NOT LIKE 里的 NOT 分别对 IN 和 LIKE 的影响一样。注意 NOT 只作用于紧随其后的表达式

            SQL> --查询所有不在30部门供职或者从事CLERK职务之员工
            SQL> SELECT e.* FROM emp e WHERE NOT e.deptno = 30 OR e.job = 'CLERK';


            EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
            ----- ---------- --------- ----- ----------- --------- --------- ------
            7369 SMITH CLERK 7902 1980/12/17 800.00 20
            7566 JONES MANAGER 7839 1981/4/2 2975.00 20
            7782 CLARK MANAGER 7839 1981/6/9 2450.00 10
            7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20
            7839 KING PRESIDENT 1981/11/17 5000.00 10
            7876 ADAMS CLERK 7788 1983/1/12 1100.00 20
            7900 JAMES CLERK 7698 1981/12/3 950.00 30
            7902 FORD ANALYST 7566 1981/12/3 3000.00 20
            7934 MILLER CLERK 7782 1982/1/23 1300.00 10


            SQL> --查询所有除供职于30部门或从事CLERK职务以外之员工
            SQL> SELECT e.* FROM emp e WHERE NOT (e.deptno = 30 OR e.job = 'CLERK');


            EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
            ----- ---------- --------- ----- ----------- --------- --------- ------
            7566 JONES MANAGER 7839 1981/4/2 2975.00 20
            7782 CLARK MANAGER 7839 1981/6/9 2450.00 10
            7788 SCOTT ANALYST 7566 1982/12/9 3000.00 20
            7839 KING PRESIDENT 1981/11/17 5000.00 10
             7902 FORD       ANALYST    7566 1981/12/3     3000.00               20
            复制

            • SQL 中的算术表达式计算完全遵循数学中的优先级规则

            • 在逻辑运算符中,优先级顺序为 NOT > AND > OR

            • 在逻辑运算表达式中,括号括起来的部分总是先计算

              SQL> --验证ANDOR优先级高
              SQL> SELECT 1 FROM dual WHERE 1 = 0 AND 1 = 0 OR 1 = 1;


              1
              ----------
                       1
              复制
              排序
              SQL 查询语句在 WHERE 节后面可以附加 ORDER BY 来指示数据库在筛选出结果集后,对结果集进行排序的规则
              • ORDER BY 可以指定多个字段,这些字段可以不出现在 SELECT 列表当中,字段之间用逗号隔开

              • 默认对每个字段做升序排序,排序的优先级以 ORDER BY 列表中最左侧最高,最右侧最低

              • 可以使用 DESC(降序)或者 ASC(升序)关键字,干预数据库排序的行为,这两个关键字只作用于其紧跟的字段

              • DESC 默认将 NULL 值排在最前面,DESC NULLS LAST 规定 NULL 在最后面

              • ASC 默认将 NULL 排在最后面,ASC NULLS FIRST 规定 NULL 在最前面

              • ORDER BY 中可以使用 SELECT 里面规定的列别名而取代原来的表达式,但在 ORDER BY 中则不允许再规定别名

              • ORDER BY 中也可以使用表达式,如算术运算式、调用函数等

                SQL> SELECT e.* FROM emp e WHERE e.deptno = 30 ORDER BY e.comm, e.sal;


                EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
                ----- ---------- --------- ----- ----------- --------- --------- ------
                7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
                7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
                7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
                7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
                7900 JAMES CLERK 7698 1981/12/3 950.00 30
                7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30


                SQL> SELECT e.* FROM emp e WHERE e.deptno = 30 ORDER BY e.comm DESC, e.sal;


                EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
                ----- ---------- --------- ----- ----------- --------- --------- ------
                7900 JAMES CLERK 7698 1981/12/3 950.00 30
                7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
                7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
                7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
                7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
                7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30


                SQL> SELECT e.* FROM emp e WHERE e.deptno = 30 ORDER BY e.comm DESC, e.sal DESC;


                EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
                ----- ---------- --------- ----- ----------- --------- --------- ------
                7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30
                7900 JAMES CLERK 7698 1981/12/3 950.00 30
                7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
                7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
                7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
                7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30


                SQL> SELECT e.* FROM emp e WHERE e.deptno = 30 ORDER BY e.comm DESC NULLS LAST, e.sal;


                EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
                ----- ---------- --------- ----- ----------- --------- --------- ------
                7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30
                7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30
                7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30
                7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30
                7900 JAMES CLERK 7698 1981/12/3 950.00 30
                 7698 BLAKE      MANAGER    7839 1981/5/1      2850.00               30
                复制

                好家伙,今天我可真长

                文章转载自SQL干货分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论