作者:gqk
本章內容:
- 基本查詢語句
- 算數運算符
- 空值問題
- 列的別名
- 字符串鏈接
- 查詢消除重復行
- Oracle常用數據類型
- Where過濾
- 模糊查詢
- 排列子句
1,基本查詢語句:
數據庫查詢語句是我們學習的重點,在實際開發中數據庫查詢無處不在:
查詢某張表的某幾列(自定義列查詢):
語法:
SELECT 列名1,列名2,...FROM 表名
查詢表的所有列
語法:
SELECT * FROM 表名
查詢用戶下的所有表:
SELECT tbale_name FROM user_tables; SELECT table_name FROM tabs;
2,算數運算符:
--算數運算符 SELECT 5+3,5-3,5*3,5/2 FROM dual;
--虛表 SELECT 'hello,world',100 FROM dual;
--查詢員工編號,姓名,工資,新工資(=原始工資上浮25% =》衍生列 計算列) SELECT employee_id,last_name,salary,salary*1.25 FROM employees;
查詢:--員工編號,姓名,工資,獎金金額,實發工資(工資+獎金)??
3,空值問題:包含空值的數學表達式結果一定為空
在Oracle中空值null和空字符串是等價的,空值不是空格或者0
SELECT 5+NULL FROM dual; SELECT 5-NULL+3 FROM dual; SELECT 5+'' FROM dual;
4,列的別名:
列別名使用方式:
- AS 別名
- 空格 別名
--列別名 SELECT employee_id, last_name, salary, salary * 1.25 new_sal FROM employees; SELECT employee_id, last_name, salary, salary * commission_pct AS "Comm", salary + salary * commission_pct "my-money" FROM employees;
雙引號可以強制原始大小寫執行:
5,字符串鏈接:
把列和列,列和字符鏈接在一起用“||”
--拼接字符串 SELECT 'hello'||'world' FROM dual; SELECT 'hello'||1234 FROM dual; SELECT 999||1234 FROM dual; SELECT '100'+'200' FROM dual; --員工的姓和名拼接為一列 SELECT first_name||'.'||last_name AS ename FROM employees;
6,查詢消除重復行
在SELECT 語句中使用DISTINCT 關鍵字刪除重復行:
--重復行 SELECT DISTINCT department_id FROM employees; SELECT DISTINCT department_id,job_id FROM employees;
7,Oracle常用的數據類型
1、字符類型
• CHAR:一個定長字符串,當位數不足自動用空格填充來達到其最大長度。如非NULL的CHAR(12)總是包含12字節信息。CHAR字段最多可以存儲2,000字節的信息
• VARCHAR2:目前這也是VARCHAR 的同義詞。這是一個變長字符串,與CHAR 類型不同,它不會用空格填充至最大長度。VARCHAR2(12)可能包含0~
• CLOB:(Character Large Object)在Oracle9i及以前的版本中, 這種數據類型允許存儲最多4GB的數據, 在Oracle 10g及以后的版本中允許存儲最多(4GB)×(數據庫塊大小)字節的數據。CLOB包含要進行字符集轉換的信息。這種數據類型很適合存儲純文本信息。
2、數字類型:
NUMBER:該數據類型能存儲精度最多達38位的數字。每個數存儲在一個變長字段中,其長度在0~22字節之間。Oracle的NUMBER類型精度很高, 遠遠高於許多編程語言中常規的FLOAT和DOUBLE類型。
NUMBER( p,s ) p表示精度(總長度) s表示小數位置且四舍五入
NUMBER(10,3) 10是總長度,3是小數位數的長度
3、日期類型
• DATE:一個7字節的定寬日期/時間數據類型。其中總包含7個屬性,包括:世紀、世紀中哪一年、月份、月中的哪一天、小時、分鍾和秒。
• TIMESTAMP:一個7 字節或12.字節的定寬日期/時間數據類型。它與DATE 數據類型不同,因為TIMESTAMP 可以包含小數秒(fractional second);帶小數秒的TIMESTAMP 在小數點右邊最多可以保留9位。
4、二進制及大文本數據
• BLOB: (binary large object)在Oracle9i及以前的版本中, 這種數據類型允許存儲最多4GB的數據, 在Oracle 10g及以后的版本中允許存儲最多(4GB)×(數據庫塊大小)字節的數據。BLOB包含不需要進行字符集轉換的“二進制“數據,如果要存儲電子表格、字處理文檔、圖像文件等就很適合采用
注意:ORACLE中沒有boolean類型:
8,Where過濾
就是按照條件檢索查詢數據:
比如:查詢本月的手機話費
百度我們感興趣的信息
預定乘坐的飛機,火車票
比較運算符:
--查詢90號部門的員工
--查詢工資超過10000的員工
--查詢姓King的員工(字符串比較區分大小寫)
--查詢員工編號,姓名,工資,新工資(只看新工資超過10000的員工)
--查詢所有在90年以前入職的員工
--查詢所有不是50號部門的員工
判斷一下sql的輸出結果:
FROM employees
WHERE department_id=NULL;
FROM employees
WHERE department_id<>NULL;
特殊比較運算符:
--查詢沒有部門的員工 SELECT * FROM employees WHERE department_id IS NULL; --查詢有部門的員工 SELECT * FROM employees WHERE department_id IS NOT NULL; --查詢工資在5000~10000之間的員工 SELECT * FROM employees WHERE salary BETWEEN 5000 AND 10000; --查詢工資不在5000~10000之間的員工 SELECT * FROM employees WHERE salary NOT BETWEEN 5000 AND 10000; --查詢部門為10,20,50號的員工 SELECT * FROM employees WHERE department_id IN (10,20,50); --查詢部門不是10,20,50號的員工 SELECT * FROM employees WHERE department_id NOT IN (10,20,50);
9,模糊查詢:
練習:
--查詢first_name以S開頭的員工 SELECT * FROM employees WHERE first_name LIKE 'S%'; --查詢last_name以s結尾的員工 SELECT * FROM employees WHERE last_name LIKE '%s'; --查詢last_name以M開頭且第三個字母是u的員工 SELECT * FROM employees WHERE last_name LIKE 'M_u%'; --查詢email中包含EN的員工 SELECT * FROM employees WHERE email LIKE '%EN%'; --查詢job_id倒數第5個字符是下划線的員工 SELECT * FROM employees WHERE job_id LIKE '%\_____' ESCAPE '\'; SELECT * FROM employees WHERE last_name LIKE '%\%%' ESCAPE '\';
練習:
--查詢工資超過5000且last_name以s結尾的員工 SELECT * FROM employees WHERE salary>=5000 AND last_name LIKE '%s'; --查詢部門是10,20,以及沒有部門的員工 SELECT * FROM employees WHERE department_id IN (10,20) OR department_id IS NULL;
排序問題:
練習:
--查詢員工編號,姓名,工資,新工資,部門編號 --按工資升序 SELECT employee_id,last_name,salary,salary*1.5 new_sal FROM employees ORDER BY salary; --按工資降序 SELECT employee_id,last_name,salary,salary*1.5 new_sal FROM employees ORDER BY salary DESC; -- SELECT employee_id,last_name,salary,salary*1.5 new_sal FROM employees ORDER BY new_sal DESC; -- SELECT employee_id,last_name,salary,salary*1.5 new_sal FROM employees ORDER BY salary*1.5 DESC; -- SELECT employee_id,last_name,salary,salary*1.5 new_sal FROM employees ORDER BY 3 DESC; --查詢員工編號,姓名,工資,入職日期,部門編號 --按部門升序,工資降序,入職日期升序 SELECT employee_id,last_name,salary,hire_date,department_id FROM employees ORDER BY department_id,salary DESC,hire_date; --排序表達式可以不是列列表中的列 SELECT employee_id,last_name,salary,salary*1.5 new_sal FROM employees ORDER BY job_id; --查詢50號部門的員工,按工資降序 SELECT * FROM employees WHERE department_id=50 ORDER BY salary DESC;
偽列:
--rownum偽列 SELECT ROWNUM,employee_id,last_name,salary FROM employees WHERE department_id=50; --查詢某表中的前5條數據(TOP N查詢) SELECT ROWNUM,employees.* FROM employees WHERE ROWNUM<=5; --查詢某表中的第6到第10條數據 --查詢工資最高的前5名員工 select rownum ,last_name,salary from employees where rownum <6 order by salary desc(錯誤的) select * from (select rownum,last_name,salary from employees order by salary desc) where rownum <6; --rowid偽列 SELECT ROWID,ROWNUM,employees.* FROM employees;