SQL 基础-->SELECT 查询

–================================

–SQL 基础–>SELECT 查询

–=================================

/*

一、SQL 结构化查询语言

    包括DDL(数据定义语言)、DCL(数据控制语言)、

    DQL(数据查询语言)、DML(数据操纵语言)

 

二、SQL的特点

    SQL 语句不区分大小写

    SQL 语句能输入一行或多行

    关键字不能整行缩写或分离

    子句通常被放置在分开的行上

    缩进可提高可读性

    SQL 开发工具,SQL 语句能选择分号结束(;) .当你运行多个SQL 语句的时候,需要分号

    SQL*Plus, 你要用一个分号结束每个SQL 语句.(;)

 

三、SQL*PLUS特征:

    字符日期左对齐

    数字右对对齐

    列名默认大写

    SQL PLUS 自己的命令不需以分号结束

 

四、SQL查询时,数字和日期类型的数据可用算术运算符

    +  

     

     

     

    ( ) 用于改变运算符的优先级

 

五、空值

    空值一般用NULL表示

    一般表示未知的、不确定的值,也不是空格

    一般运算符与其进行运算时,都会为空

    空不与任何值相等

 

    表示某个列为空用:IS NULL  不能使用COMMNULL这种形式

    某个列不为空:IS NOT NULL 不能使用COMM != NULL 这种形式

 

    空值在作升序排列时,空值会放到最后。

    相反作降序排列时,空值会放在最前。

 

    空值作逻辑运算时:

    AND运算:

    F AND F F       F AND T F       F AND NULL F

    T AND F F       T AND T T       T AND NULL IS NULL

    NULL AND F F    NULL AND T IS NULL   NULL AND NULL IS NULL

 

    就是说AND的优先级是:F ->NULL ->T

 

 

    OR运算:

    T OR T T     T OR F T     T OR NULL T

    F OR T T     F OR F F     F OR NULL IS NULL

    NULL OR T T  NULL OR F IS NULL NULL OR NULL IS NULL

 

    OR运算优先级:T ->NULL ->F

 

 

    NOT运算:

       NOT T F

       NOT F T

       NOT NULL IS NULL

 

 

    与空值相关的函数:

    NVL 函数

       格式:NVL(表达式1,表达式2)

       作用:测试表达式的值,如果表达式1为空,则返回表达式2的值;不为空,返回表达式1的值。

 

    NVL2   函数

       格式:NVL2(表达式1,表达式2,表达式3)

       作用:测试表达式的值,表达式1不为空,返回表达式2的值,如果为空,则返回表达式3的值。

 

 

    NULLIF  相等为空

       格式:NULLIF (表达式1,表达式2)

       作用:比较表达式1和表达式2的值,如果两个相等则返回为空,否则返回表达式1的值。

 

    COALESCE    找非空

       格式:COALESCE (表达式1,表达式2,表达式3,,表达式n)

       作用:返回第一个不为空的值,如果所有的都为空,则返回NULL

 

 

六、SELECT语句的用法

SELECT *|{[DISTINCT] column|expression [alias],…}

FROM table;

 

七、演示   */

 

选择所有字段

SQL> SET LINESIZE 200

SQL> SELECT * FROM SCOTT.EMP;

 

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

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

      7369 SMITH      CLERK           7902 17DEC80        800                    20

      7499 ALLEN      SALESMAN        7698 20FEB81       1600        300         30

      7521 WARD       SALESMAN        7698 22FEB81       1250        500         30

      7566 JONES      MANAGER         7839 02APR81       2975                    20

      7654 MARTIN     SALESMAN        7698 28SEP81       1250       1400         30

 

选择部分字段

SQL> SELECT EMPNO,ENAME,SAL FROM SCOTT.EMP;

 

     EMPNO ENAME             SAL

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

      7369 SMITH             800

      7499 ALLEN            1600

      7521 WARD             1250

 

算术加减运算

SQL> SELECT EMPNO,ENAME,SAL + 300 FROM SCOTT.EMP;

 

     EMPNO ENAME         SAL+300

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

      7369 SMITH            1100

      7499 ALLEN            1900

      7521 WARD             1550

 

优先级

SQL> SELECT EMPNO,ENAME,12 * (SAL + 300) FROM SCOTT.EMP;

 

     EMPNO ENAME      12*(SAL+300)

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

      7369 SMITH             13200

      7499 ALLEN             22800

      7521 WARD              18600

 

SQL> SELECT EMPNO,ENAME,12 * SAL + 300 FROM SCOTT.EMP;

 

     EMPNO ENAME      12*SAL+300

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

      7369 SMITH            9900

      7499 ALLEN           19500

      7521 WARD            15300

 

–NULL,记录中COMM存在为NULL的情况

SQL> SELECT EMPNO,ENAME,SAL,COMM FROM SCOTT.EMP;

 

     EMPNO ENAME             SAL       COMM

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

      7369 SMITH             800

      7499 ALLEN            1600        300

      7521 WARD             1250        500

      7566 JONES            2975

 

NULL运算,结果为NULL

SQL> SELECT EMPNO,ENAME,SAL,COMM + 300 FROM SCOTT.EMP;

 

     EMPNO ENAME             SAL   COMM+300

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

      7369 SMITH             800

      7499 ALLEN            1600        600

      7521 WARD             1250        800

      7566 JONES            2975

 

COMM不为NULL的记录的COMM乘以

SQL> SELECT EMPNO,ENAME,SAL,COMM * 12 FROM SCOTT.EMP  WHERE COMM IS NOT NULL

 

     EMPNO ENAME             SAL    COMM*12

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

      7499 ALLEN            1600       3600

      7521 WARD             1250       6000

      7654 MARTIN           1250      16800

      7844 TURNER           1500          0

 

字段别名,字段后用AS 别名,AS可以省略

SQL> SELECT EMPNO,ENAME AS EmpName,SAL Salary FROM SCOTT.EMP;

 

     EMPNO EMPNAME        SALARY

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

      7369 SMITH             800

      7499 ALLEN            1600

      7521 WARD             1250

      7566 JONES            2975

–DISTINCT,过滤重复行

SQL> SELECT DISTINCT EMPNO,ENAME FROM SCOTT.EMP;

 

连接操作符,通过二个垂直的条描述(||),注意,日期和文字数值一定嵌入在单引号里面

SQL> SELECT EMPNO,ENAME || ‘ IS A ‘ ||JOB AS POSITION FROM SCOTT.EMP;

 

     EMPNO POSITION

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

      7369 SMITH IS A CLERK

      7499 ALLEN IS A SALESMAN

      7521 WARD IS A SALESMAN

 

–DESC table_name,显示表结构信息

SQL> DESC SCOTT.EMP

 Name                                      Null?    Type

 —————————————– ——– —————————-

 EMPNO                                     NOT NULL NUMBER(4)

 ENAME                                              VARCHAR2(10)

 JOB                                                VARCHAR2(9)

 MGR                                                NUMBER(4)

 HIREDATE                                           DATE

 SAL                                                NUMBER(7,2)

 COMM                                               NUMBER(7,2)

 DEPTNO                                             NUMBER(2)

 

 –NVL的用法

 SQL> SELECT EMPNO,ENAME,NVL(TO_CHAR(COMM),‘Not Applicable’) FROM SCOTT.EMP;

 

     EMPNO ENAME      NVL(TO_CHAR(COMM),‘NOTAPPLICABLE’)

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

      7369 SMITH      Not Applicable

      7499 ALLEN      300

      7521 WARD       500

      7566 JONES      Not Applicable

     

–NVL2的用法

SQL> SELECT empno,ename,sal,NVL2(TO_CHAR(comm),12 * (sal + comm),sal) AS Income FROM scott.emp;

 

     EMPNO ENAME             SAL     INCOME

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

      7369 SMITH             800        800

      7499 ALLEN            1600      22800

      7521 WARD             1250      21000

      7566 JONES            2975       2975

 

–NULLIF的用法

等价于CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END

      SQL> SELECT e.last_name, NULLIF(e.job_id, j.job_id) “Old Job ID”

  2     FROM hr.employees e, hr.job_history j

  3     WHERE e.employee_id = j.employee_id

  4     ORDER BY last_name, “Old Job ID”;

 

LAST_NAME                 Old Job ID

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

De Haan                   AD_VP

Hartstein                 MK_MAN

Kaufling                  ST_MAN

Kochhar                   AD_VP

Kochhar                   AD_VP

Raphaely                  PU_MAN

Taylor                    SA_REP

Taylor

Whalen                    AD_ASST

Whalen

 

下面是使用CASE WHEN的等价用法

SQL> SELECT e.last_name, CASE WHEN e.job_id = j.job_id THEN NULL ELSE e.job_id END AS “Old Job ID”

  2  FROM hr.employees e, hr.job_history j

  3  WHERE e.employee_id = j.employee_id

  4  ORDER BY last_name, “Old Job ID”;

 

LAST_NAME                 Old Job ID

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

De Haan                   AD_VP

Hartstein                 MK_MAN

Kaufling                  ST_MAN

Kochhar                   AD_VP

Kochhar                   AD_VP

Raphaely                  PU_MAN

Taylor                    SA_REP

Taylor

Whalen                    AD_ASST

Whalen

 

–COALESCE的用法

COALESCE(exp1,exp2)包含两个表达式时,等价于CASE WHEN exp1 IS NOT NULL THEN exp1 ELSE exp2 END

–COALESCE (expr1, expr2, …, exprn), for n>=3

n >= 3时,等价于

–CASE WHEN expr1 IS NOT NULL THEN expr1

   ELSE COALESCE (expr2, …, exprn) END

SQL> SELECT product_id, list_price, min_price,

  2  COALESCE(0.9*list_price, min_price, 5) “Sale”

  3  FROM oe.product_information

  4  WHERE supplier_id = 102050

  5  ORDER BY product_id, list_price, min_price, “Sale”

 

PRODUCT_ID LIST_PRICE  MIN_PRICE       Sale

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

      1769         48                  43.2

      1770                    73         73

      2378        305        247      274.5

      2382        850        731        765

      3355                                5

 

八、更多

   SQLPlus 常用命令

   Oracle相关

    原文作者:SQL
    原文地址: https://blog.csdn.net/leshami/article/details/5487668
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞