天天看點

SQL基礎1——select查詢

原文轉自  一沙彌的世界  的部落格

一、SQL 結構化查詢語言

    包括DDL(資料定義語言)、DCL(資料控制語言)、

    DQL(資料查詢語言)、DML(資料操縱語言)

二、SQL的特點

    SQL 語句不區分大小寫

    SQL 語句能輸入一行或多行

    關鍵字不能整行縮寫或分離

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

    縮進可提高可讀性

    在SQL 開發工具,SQL 語句能選擇分号結束(;)

.當你運作多個SQL 語句的時候,需要分号

    在SQL*Plus中, 你要用一個分号結束每個SQL 語句.(;)

三、SQL*PLUS特征:

    字元日期左對齊

    數字右對對齊

    列名預設大寫

    SQL PLUS 自己的指令不需以分号“;”結束

四、SQL查詢時,數字和日期類型的資料可用算術運算符

    +   加

    -  減

    *  乘

    /  除

    ( ) 用于改變運算符的優先級

五、空值

    空值一般用NULL表示

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

    一般運算符與其進行運算時,都會為空

    空不與任何值相等

    表示某個列為空用:IS NULL  不能使用COMM=NULL這種形式

    某個列不為空: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 17-DEC-80        800                    20

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       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

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

      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

      7499 ALLEN            1600        600

      7521 WARD             1250        800

--将COMM不為NULL的記錄的COMM乘以

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

 ——注意 where子句 這裡的is null 或者 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

--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;——

第一個參數有(即不空),返2,第一個參數無(即空)返3.簡記為:有2空3. 用來算一年收入不錯,有年終獎的加上,沒年中獎的直接得出。。

     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

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";

--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