資料庫開發(二)單表查詢: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 表名;
從某張表查詢指定的列
注:
- 執行流程:FROM(確定資料來源)-->SELECT,確定哪些列;
- 如果查詢全部列,可以用*代替,用*可讀性不高,不建議使用,查詢出來的列順序語定義時一致。
- 查詢時,數值型,日期型可以做算術運算,+,-,*,/
- 關於空值:代表的是未知的,不確定的,沒有值(空值運算後結果還是空值) 空值轉換函式: 數值型列 NVL(列,數值) :如果這個列值為空,則用這個數值代替 文字型列 NVL(列,'文字'):如果這個列值為空,則用這個文字代替
- 查詢時可以給查詢的列或表示式取別名 SELECT 列 [AS] 別名, 列名... 別名如果需要保持原來的大小寫(預設顯示大寫),或者包含一些特殊字元,比如空格,可以用雙引號括起來
- 查詢某個列時,如果查詢不重複的結果,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;
注:
- 執行流程:FROM-->SELECT,此時確定了結果集-->ORDER BY 把資料改變位置,排序
- ASC:升序,DESC:降序, 預設是升序(即不加ASC或DESC是升序)
- 按照多列排序,首先先按照第一列排序,如果第一列相等在按第二列排序...
- null值預設為最大
- 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;
注:
- 執行流程: FROM,確定表-->WHERE,確定表的行-->SELECT,確定列,結果集確定-->ORDER BY,排序
- WHRER子句緊跟在FROM之後
- WHERE篩選,逐行判斷,如果當前行條件滿足,則結果集中包含,否則不包含
- 條件中的運算子:
- 比較運算子:>, >=, <, <=, =(等於), !=, <>(不等於)
- BETWEEN...AND...:在...和...之間,閉區間
- IN, IN(點值1,點值2,...)
- IS NULL:是空的,空代表未知的,不確定的,不能用等號判斷(不報錯,但無結果)
- LIKE:用來模糊查詢的
- 萬用字元:
- %:可以匹配0個或多個字元
- _:可以代表任意一個字元
- 如果需要%,_表示普通的含義,可以利用轉義字元
- eg:查詢以 _a 開頭的名字
--轉義字元示例 SELECT first_name FROM s_emp WHERE first_name LIKE '\_a%' escape '\';
- eg:查詢以 _a 開頭的名字
- 萬用字元:
- NOT BETWEEN...AND...:不在...和...之間
- NOT IN
- IS NOT NULL:不是空的
- NOT LIKE
- 邏輯運算子:
- NOT: 非 取反
- AND: 與,都成立,結果才成立
- OR: 或,只要有一個成立,結果就成立
- 優先順序:NOT>AND>OR
- 拼接:||
- 比較運算子:>, >=, <, <=, =(等於), !=, <>(不等於)
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;