--函式
--檢視員工表資料
SELECT * FROM emp_test;
--檢視部門表資料
SELECT * FROM dept_test;
--round( 數字 , 小數點後的位數 )用於數字的四捨五入
--計算金額的四捨五入
--注意:Oracle中別名用雙引號"原樣輸出",mysql可以用單引號
SELECT salary*0.1234567 "原樣輸出",ROUND(salary*0.1234567) "預設零位小數", ROUND(salary*0.1234567,2) "保留兩位小數" FROM emp_test;
--trunc( 數字 , 小數點後的位數 )用於擷取如果沒有第二個引數 , 預設是 0
--計算金額 , 末尾不做四捨五入
--注意:Oracle中擷取用關鍵字TRUNC,MySql用TRUNCATE
SELECT salary*0.1234567 "原樣輸出",TRUNC(salary*0.1234567,2) "直接擷取留兩位小數" FROM emp_test;
--計算員工入職多少天?
--計算時間差Oracle用(expr1,expr2)DAYS,mysql用函式DATEDIFF(expr1,expr2),
SELECT name,hire_date,(SYSDATE-hire_date)DAYS FROM emp_test;
--計算員工入職多少個月?
--mysql用TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2),Oracle用MONTHS_BETWEEN(date1, date2)
SELECT name, ROUND(MONTHS_BETWEEN(SYSDATE,hire_date)) FROM emp_test;
--計算 12 個月之前的時間點
--Oracle (date, int) *計算 12 個月之前的時間點,Myusql用DATE_ADD(date,INTERVAL expr unit)
SELECT ADD_MONTHS(SYSDATE,-12) FROM DUAL;
--計算本月最後一天
SELECT LAST_DAY(SYSDATE) FROM DUAL;
--把時間資料按指定格式輸出
SELECT to_char(SYSDATE , 'yyyy-mm-dd hh24:mi:ss') from DUAL;
--插入一條資料 , 編號為 1012 , 姓名為 amy , 入職時間為當前系統時間
INSERT INTO emp_test(emp_id,name,hire_date) VALUES (1012,'amy',SYSDATE);
SELECT * FROM emp_test;
--插入一條資料 , 編號為 1012 , 姓名為 amy , 入職時間為 2011 年 10 月 10 日
INSERT INTO emp_test(emp_id,name,hire_date) VALUES (1012,'amy',TO_DATE('2011-10-10','yyyy-mm-dd'));
SELECT * FROM emp_test;
--按指定格式顯示員工姓名和入職時間 , 顯示格式為: amy 2011-10-10
SELECT name,TO_CHAR(hire_date,'yyyy-mm-dd') FROM emp_test;
--計算員工的年終獎金
--要求:
--1) 如果 bonus 不是 null , 發年終獎金額為 bonus
--2) 如果 bonus 是 null , 發年終獎金額為 salary * 0.5
--3) 如果 bonus 和 salary 都是 null, 發 100 元安慰一下
--coalesce( 引數列表 )函式的作用:返回引數列表中第一個非空引數 , 引數列表中最後一個值通常為常量
SELECT COALESCE(bonus,salary*0.5,100) FROM emp_test;
--根據員工的職位 , 計算加薪後的薪水資料
--要求:
--1) 如果職位是 Analyst:加薪 10%
--2) 如果職位是 Programmer:加薪 5%
--3) 如果職位是 clerk:加薪 2%
--4) 其他職位:薪水丌變
SELECT name,job,salary ,
CASE job WHEN 'Analyst' THEN salary*1.1
WHEN 'Programmer' THEN salary*1.05
WHEN 'clerk' THEN salary*1.02
ELSE salary
END new_salary
FROM emp_test;
--decode()函式是Oracle 中等價於 case when 語句的函式 , 作用同 case 語句相同。
--decode 函式語法如下:
--decode(判斷條件 , 匹配 1 , 值 1 , 匹配 2 , 值 2 , … , 預設值)
--表達的意思是:如果判斷條件 = 匹配 1 , 則迒回值 1
--判斷條件 = 匹配 2 , 則迒回值 2
--根據員工的職位 , 計算加薪後的薪水資料
--要求:和 case 語句相同
--1) 如果職位是 Analyst:加薪 10%
--2) 如果職位是 Programmer:加薪 5%
--3) 如果職位是 clerk:加薪 2%
--4) 其他職位:薪水丌變
SELECT name,job,salary ,
DECODE(job,'Analyst',salary*1.1,'Programmer',salary*1.05,'clerk',salary*1.02,salary) new_salary
FROM emp_test;
--薪水由低到高排序( 升序排列 )
SELECT name,salary FROM emp_test ORDER BY salary ASC;
--薪水由高到低排序( 降序排列 )
SELECT name,salary FROM emp_test ORDER BY salary DESC;
--按入職時間排序 , 入職時間越早排在前面
SELECT name,hire_date FROM emp_test ORDER BY hire_date ASC;
--按部門排序 , 同一部門按薪水由高到低排序
SELECT name,dept_test_id,salary FROM emp_test ORDER BY dept_test_id,salary;
--員工表中有多少條記錄?
SELECT COUNT(*) FROM emp_test;
--當前帳戶( openlab )下有多少個表?
select count(*) from user_tables
--入職時間不是 null 的資料總數
SELECT COUNT(hire_date) FROM emp_test WHERE hire_date IS NOT NULL;
--計算員工的薪水總和是多少?
SELECT SUM(salary) FROM emp_test;
--計算員工的人數總和、薪水總和、平均薪水是多少?
SELECT COUNT(*), SUM(salary),AVG(salary) FROM emp_test;
--薪水平均值 = 薪水總和 / 人數總和 avg(salary) = sum(salary) / count(*)
--而 avg(salary)叧按有薪水的員工人數計算平均值。這樣得到的資料丌夠準確。
SELECT COUNT(*), SUM(salary),AVG(NVL(salary,0)) FROM emp_test;
--計算員工的最高薪水和最低薪水
SELECT max(salary),min(salary) FROM emp_test;
--組函式:
--count / avg / sum / max / min 如果函式中寫列名 , 預設忽略空值
-- avg / sum 針對數字的操作
-- max / min 對所有資料型別都可以操作
--按部門計算每個部門的最高和最低薪水分別是多少?
SELECT dept_test_id,max(salary),min(salary) FROM emp_test GROUP BY dept_test_id;
--計算每個部門的 薪水總和 和 平均薪水?
SELECT dept_test_id,SUM(salary),AVG(NVL(salary,0)) FROM emp_test GROUP BY dept_test_id;
--每個部門的統計資訊:
--要求格式如下:
--deptno max_s min_s sum_s avg_s emp_num
--10 10000 5000 23000 6789 3
SELECT dept_test_id deptno,
max(salary) max_s,
min(salary) min_s,
SUM(salary) sum_s,
AVG(NVL(salary,0)) avg_s,
COUNT(*) emp_num
FROM emp_test GROUP BY dept_test_id;
--按職位分組 , 每個職位的最高、最低薪水和人數?
SELECT MAX(salary),MIN(salary),COUNT(*) emp_num FROM emp_test GROUP BY job order by emp_num;
SELECT dept_test_id, AVG(NVL(salary,0)) avg_salary FROM emp_test WHERE dept_test_id IS NOT NULL GROUP BY dept_test_id HAVING AVG(NVL(salary,0))>5000;
--薪水總和大於 20000 元的部門資料?
SELECT dept_test_id, SUM(salary) FROM emp_test WHERE dept_test_id IS NOT NULL GROUP BY dept_test_id HAVING SUM(salary)> 20000;
--哪些職位的人數超過 2 個人?
SELECT job,COUNT(*) FROM emp_test GROUP BY job HAVING COUNT(*)>2;
--查詢最高薪水的是誰?
SELECT * FROM emp_test WHERE salary=(SELECT MAX(salary) FROM emp_test);複製程式碼
【從零開始學習Oracle資料庫】(2)函式
相關文章
- 【從零開始學習 MySql 資料庫】(2) 函式MySql資料庫函式
- 【從零開始學習Oracle資料庫】(3)函式與子查詢和連線查詢Oracle資料庫函式
- 【從零開始學習Oracle資料庫】(5)約束檢視與索引Oracle資料庫索引
- 【從零開始學習 MySql 資料庫】(3) 函式與子查詢和連線查詢MySql資料庫函式
- 【從零開始學習Oracle資料庫】(1)建表與簡單查詢Oracle資料庫
- 【從零開始學習Oracle資料庫】(4)建立表與增刪改和資料庫事務Oracle資料庫
- 《從零開始學Swift》學習筆記(Day 40)——解構函式Swift筆記函式
- 《從零開始學Swift》學習筆記(Day 21)——函式返回值Swift筆記函式
- 從零開始學習KafkaKafka
- 從零開始學習機器學習機器學習
- 從零開始學習laravelLaravel
- 大資料學習路線(自己制定,從零開始)大資料
- 【從零開始學習 MySql 資料庫】(5) 約束檢視與索引MySql資料庫索引
- 《從零開始學Swift》學習筆記(Day 37)——預設建構函式Swift筆記函式
- 《從零開始學Swift》學習筆記(Day 39)——建構函式過載Swift筆記函式
- 《從零開始學Swift》學習筆記(Day 19)——函式引數傳遞Swift筆記函式
- eclipse學習從零開始Eclipse
- 從零開始學習Git--遠端倉庫Git
- 從零開始學習時空資料視覺化(序)視覺化
- 從零開始JAVA資料結構學習筆記(一)Java資料結構筆記
- 【從零開始學習 MySql 資料庫】(1) 建表與簡單查詢MySql資料庫
- 《從零開始學Swift》學習筆記(Day 51)——擴充套件建構函式Swift筆記套件函式
- 《從零開始學Swift》學習筆記(Day43)——建構函式繼承Swift筆記函式繼承
- 從零開始學Python:第八課-函式和模組Python函式
- 從零開始學Python:20課-函式使用進階Python函式
- ?從零開始學習webpack系列五(解析打包樣式)Web
- 從零開始學 Oracle 練習題答案(9-10)Oracle
- 從零開始學習 Go ——安裝Go
- 30天從零開始學習SwiftSwift
- 從零開始學習C++(0)C++
- 《從零開始學Swift》學習筆記(Day 20)——函式中引數的傳遞引用Swift筆記函式
- 學用計算機從零開始 G.盲人資料庫(轉)計算機資料庫
- 從零開始學習 React 高階元件React元件
- 從零開始學習邏輯迴歸邏輯迴歸
- 從零開始學習如何部署程式碼
- 從零開始內網滲透學習內網
- 如何從零開始學習一個框架框架
- 從零開始學Python:21課-函式的高階應用Python函式