1. 程式人生 > >資料庫開發(二)單表查詢:SELECT

資料庫開發(二)單表查詢:SELECT

資料庫指令碼檔案介紹:

  • 已字尾.sql結尾
  • 註釋:
    • 單行: --開始(--這是一個註釋)
    • 多行:/*    */ (/* 只是一個多行註釋 */)
  • 可以把各個物件的建立(表,序列等),以及資料的新增寫到一個指令碼中
  • 執行指令碼:
    • start  指令碼路徑
    • @指令碼路徑
  • 從指令碼的上面逐行執行,一行出錯,後面繼續執行
  • 如果執行指令碼錯誤,建議先刪除使用者,重新建立使用者後再執行
  • 管理員刪除使用者:DROP  USER  使用者名稱  CASCADE;

 

查詢語句--簡單的單表查詢

準備工作

建立使用者(oaec),密碼oaec

授權

切換到oaec,在新的使用者(oaec)下,匯入資料庫指令碼(oaec.sql)(注:alter session set nls-data-language=english; 可以設定本次回話為英文。

 

小技巧:

  • clear scre可以清屏
  • notepad++中按Ctrl+f可以查詢所需內容

單表查詢:SELECT

語法:

SELECT   列名1,列名2,列名3,...,列名n

FROM   表名;

從某張表查詢指定的列

注:

  1. 執行流程:FROM(確定資料來源)-->SELECT,確定哪些列;
  2. 如果查詢全部列,可以用*代替,用*可讀性不高,不建議使用,查詢出來的列順序語定義時一致。
  3. 查詢時,數值型,日期型可以做算術運算,+,-,*,/
  4. 關於空值:代表的是未知的,不確定的,沒有值(空值運算後結果還是空值)                                                                                    空值轉換函式:                                                                                                                                                                                        數值型列      NVL(列,數值) :如果這個列值為空,則用這個數值代替                                                                                                  文字型列      NVL(列,'文字'):如果這個列值為空,則用這個文字代替
  5. 查詢時可以給查詢的列或表示式取別名                                                                                                                                          SELECT  列 [AS]  別名,  列名...                                                                                                                                                              別名如果需要保持原來的大小寫(預設顯示大寫),或者包含一些特殊字元,比如空格,可以用雙引號括起來
  6. 查詢某個列時,如果查詢不重複的結果,distinct

 

eg1:查詢部門編號,部門名

SELECT id, name
FROM s_dept;

eg2:查詢區域表全部列

SELECT *

FROM s_region;

eg3:查詢每個員工加薪1000後的薪資

SELECT id, salary+1000

FROM s_emp;

eg4:求每個員工包含提成後的員工總資總額

SELECT id, salary*(1+NVL(commission_pct ,0)/ 100)

FROM s_emp;

eg5: 求每個員工包含提成後的員工總資總額,取別名為sal

SELECT id AS eid, salary*(1+NVL(commission_pct ,0)/ 100) AS sal

FROM s_emp;

eg5.1:保持別名原樣大小寫

SELECT id AS eid, salary*(1+NVL(commission_pct ,0)/ 100) AS "sal"

FROM s_emp;

eg6:查詢公司的所有部門名,相同的只保留一份

SELECT DISTINCT name

FROM s_dept;

查詢子句之ORDER BY:排序

語法:

      SELECT   列名1,列名2,列名3,...,列名n

      FROM   表名

      ORDER BY 列名 ASC|DESC, 列名 ASC|DESC;

 

注:

  1. 執行流程:FROM-->SELECT,此時確定了結果集-->ORDER BY 把資料改變位置,排序
  2. ASC:升序,DESC:降序,     預設是升序(即不加ASC或DESC是升序)
  3. 按照多列排序,首先先按照第一列排序,如果第一列相等在按第二列排序...
  4. null值預設為最大
  5. ORDER BY 子句永遠在查詢的最後,排序永遠是最後執行

eg1:查詢每個員工的編號,名字,部門編號,並按照部門編號升序排序

--升序排序演示
SELECT id, first_name, dept_id
FROM s_emp
ORDER BY dept_id ASC;
--降序排序演示
SELECT id, first_name, dept_id
FROM s_emp
ORDER BY dept_id DESC;

eg2:查詢每個員工的編號,名字,部門編號,薪資,要求按照部門編號升序排序,如果部門相同,則按照薪資降序排序

--多列排序
SELECT id, first_name, dept_id, salary
FROM s_emp
ORDER BY dept_id ASC, salary DESC;

 

調整結果集的列寬:

  • 數值型:col 名字 format 999999;   用9作站位,一個9表示一個位,前面表示有6位
  • 文字型:col 名字 format a10;   a+數值, 前面表示有10位

設定日期的語言:僅針對於本次會話生效

  • 查詢當前日期:SELECT sysdate FROM dual;
  • 修改為英文語言:
    • ALTER SESSION SET nls_date_language=english;
    • ALTER SESSION SET nls_date_language='SIMPLIFIED CHINESE'; (改回中文)
  • data常量預設形式:
    • 中文下:'14-11月-18'  中文下只認識這個格式
    • 英文下:'14-NOV-18'  英文下只認識這個格式

查詢補充:

可以直接查詢一個常量或者常量表達式:

        SELECT 1+2 FROM dual;       結果為3

此時,為了滿足SELECT ... FROM ..., FROM後面跟的dual(虛表)

        SELECT sysdate FROM dual;

        sysdate:當前系統時間,data型別

 

查詢子句之WHERE  (對行的篩選)

語法:

      SELECT   列名1,列名2,列名3,...,列名n

      FROM   表名

      WHERE  條件

      ORDER BY;

注:

  1. 執行流程: FROM,確定表-->WHERE,確定表的行-->SELECT,確定列,結果集確定-->ORDER BY,排序
  2. WHRER子句緊跟在FROM之後
  3. WHERE篩選,逐行判斷,如果當前行條件滿足,則結果集中包含,否則不包含
  4. 條件中的運算子:
    1. 比較運算子:>, >=, <, <=, =(等於), !=, <>(不等於)
      1. BETWEEN...AND...:在...和...之間,閉區間
      2. IN,           IN(點值1,點值2,...)
      3. IS NULL:是空的,空代表未知的,不確定的,不能用等號判斷(不報錯,但無結果)
      4. LIKE:用來模糊查詢的
        1. 萬用字元:
          1. %:可以匹配0個或多個字元
          2. _:可以代表任意一個字元
        2. 如果需要%,_表示普通的含義,可以利用轉義字元
          1. eg:查詢以 _a 開頭的名字
            --轉義字元示例
            SELECT first_name
            FROM s_emp
            WHERE first_name LIKE '\_a%' escape '\';
      5. NOT BETWEEN...AND...:不在...和...之間
      6. NOT IN
      7. IS NOT NULL:不是空的
      8. NOT LIKE
    2. 邏輯運算子:
      1. NOT: 非    取反
      2. AND: 與,都成立,結果才成立
      3. OR:   或,只要有一個成立,結果就成立
      4. 優先順序:NOT>AND>OR
    3. 拼接:||

eg1:查詢出所有薪資高於1200的員工編號,薪資

--運算子
SELECT id, salary
FROM s_emp
WHERE salary>1200;

eg2:查詢薪資在1100到1450之間的所有員工編號,名字,薪資

--BETWEEN...AND...
SELECT id, first_name, salary
FROM s_emp
WHERE salary BETWEEN 1100 AND 1450;

eg3:查詢部門編號為41或44或45的所有員工編號,部門編號

--IN
SELECT id, dept_id
FROM s_emp
WHERE dept_id IN(41,44,45);

eg4:查詢沒有提成的員工的編號,名字

--IS NULL
SELECT id, first_name
FROM s_emp
WHERE commission_pct IS NULL;

eg5:查詢以a今晚的名字

--模糊查詢
SELECT id, first_name
FROM s_emp
WHERE first_name LIKE '%a';

'B%':以B開頭的

'%b%':包含b的

'_b%':第二個字元是b

'_b':長度是2,第二個字元是b

注:內容區分大小寫

eg6:查詢薪資低於1000或者薪資高於1500的所有員工id,薪資

--邏輯運算子
SELECT id, salary
FROM s_emp
WHERE salary<1000 OR salary>1500;

eg7:查詢在41或44號部門,並且薪資高於1100的員工id,部門id,薪資

--邏輯運算子
SELECT id, dept_id, salary
FROM s_emp
--WHERE dept_id=41 OR dept_id=44 AND salary>1100; 會先計算AND
WHERE (dept_id=41 OR dept_id=44) AND salary>1100;

eg8:查詢每個員工的專案,顯示格式為:名,姓

--拼接
SELECT first_name||','||last_name
FROM s_emp;