Oracle基礎 之 查詢基礎

所有例子都是scott中的表

0x01.單行函數

  • 作用於一行,返回一個值。

1.字符函數

接收字符輸入返回字符或者數值。

  • upper(列|字符串): 把小寫的字符轉換成大小的字符。

  • lower(列|字符串): 把大寫字符變成小寫字符。

  • initcap(列|字符串): 開頭字母大寫,其餘全部小寫。

  • length(列|字符串): 取得字符串長度。

  • substr(列|字符串,開始索引,[長度]): 截取字符串,若沒有設置長度,則從開始截取到結尾。(Oracle默認從1開始而不是0)。

  • replace(列|字符串,舊內容,新內容) : 新內容替換舊內容。

  • 示範:

-- upper
select upper('atfwus') from dual;--輸出‘ATFWUS’

-- lower
select lower('ATFWUS') from dual;--輸出‘atfwus’
select lower (ename) from emp;--將會從emp表中選擇14行,大寫變小寫。

-- initcap
select ename,initcap(ename) from emp;--將會從emp表中選擇14行,開頭字母大寫,其餘小寫。

-- length
select length('ATFWUS') from dual;--輸出6

-- substr
select substr('ATFWUS',3) from dual;--輸出‘FWUS’
select substr('ATFWUS',1,2) from dual;--輸出‘AT’

-- replace
select substr('ATFWUS','AT','A') from dual;--輸出'AFWUS'

2.數值函數

  • round():默認情況下 ROUND 四捨五入取整,可以自己指定保留的位數。
  • trunc(列 | 數字 [,小數位]): 實現數據的截取,即不進位。
  • mod(列 | 數字 ,列 | 數字): 求模(計算餘數)。
  • 示範:
-- round
select round(123.1231) from dual;--輸出123
select round(123.1231,2) from dual;--輸出123.12
select round(55.52,-2) from dual;--輸出100

-- trunc
select trunc(123.9231) from dual;--輸出123
select trunc(123.9931,1) from dual;--輸出123.9
select trunc(56.3,-1) from dual;--輸出50

-- mod
select mod(10,3) from dual;--輸出1

3.日期函數

  • 模糊日期的運算規則:

    • 日期 – 數字 = 日期(若干天之前的日期)
    • 日期 + 數字 = 日期(幹天之後的日期)
    • 日期 – 日期 = 數字 (天數)
  • SYSDATE :系統時間。

  • 日期 AND_MONTHS(列 | 日期,月數) 在指定日期上增加若干月之後的日期

  • 數字 MONTHS_BETWEEN (列|日期,列|日期) 返回兩個日期之間所經歷的月數

  • 日期 LAST_DAY(列|日期) 取得所在日期月的最後一天

  • 日期 NEXT_DAY(列|日期,星期X) 返回下一個指定的一週時間數對應的日期

  • 示範:

-- 查詢系統時間
select sysdate from dual;

-- 輸出明天這個時候的時間
select sysdate+1 from dual;

-- 查詢出emp表所有員工入職距離現在幾個月
select months_between(sysdate,e.hiredate) from emp e;

-- 四個月後的日期
select add_months(sysdate,4) from dual;

-- 查詢本月最後一天的這個時候
select last_day(sysdate) from dual;

-- 查詢下前日期下週四所對應的日期
select next_day(sysdate,'thusday') from dual;

4.轉換函數

  • TO_CHAR(列|日期|數字,轉換格式): 將日期或數字轉換成指定結構的字符串。

    • 日期:年(yyyy)、月(mm)、日(dd)。
    • 時間:時(hh、hh24)、分(mi)、秒(ss)。
    • 數字:任意數字(9)、本地貨幣符號(L)。
  • TO_DATE(列|字符串,轉換格式) 按照指定的轉換格式編寫字符串後將其變爲日期型數據。

  • TO_NUMBER(列|字符串) 將字符串變爲數字。

  • 示範:

-- 轉換當前的日期格式
select to_char(sysdate,'yyyy年-mm月-d日') from dual;
-- 拆分日期 
select to_char(sysdate,'yyyy'),to_char(sysdate,'mm'),to_char(sysdate,'dd') from dual;
-- 數字格式化(輸出: ¥9,999,999,999)
select to_char(9999999999,'L999,999,999,999,999') from dual;

-- TO_DATE(字符串轉日期)
select to_date('2020-05-20','yyyy-mm-dd') from dual;

--TO_NUMBER(字符串轉數字)
select to_number('1')+to_number('2') from dual;--輸出3

5.通用函數

  • 數字 NVL(列|NULL,默認值): 如果傳入的內容是NULL,則使用默認數值處理;如果不是NULL則使用原始數據處理;
  • 數據類型 DECODE(列|字符串|數值,比較內容1,顯示內容1,比較內容2,顯示內容2,…[,默認顯示內容]) 設置的內容會與每一個比較內容進行比較,如果內容相同,則會使用顯示內容進行輸出,如何都不相同,則使用最後的默認信息輸出。
  • 示範:
--  NVL 處理NULL函數(任何數與NULL運算都爲NULL此時把NULL替換成0,所以要處理NULL值)
select empno,ename,comm,(sal+nvl(comm,0))*12 from emp;

-- 將職位信息換成中文(要設置則全部設置,不設置的爲NULL,若不設置也可用‘---’表示)
elect ename,job,decode(job,'CLERK','職員','SALESMAN','銷售員') from emp;

6.條件句表達式(case when)

  • 語法:
CASE expr WHEN comparison_expr1 THEN return_expr1 
		[WHEN comparison_expr2 THEN return_expr2 
		WHEN comparison_exprn THEN return_exprn
	    ELSE else_expr] 
	END 
  • 示範:
select t.empno,t.ename
	case 
		when t.job = 'CLERK' then '職員'
		when t.job = 'PRESIDENT' then '總裁'
		else
			'沒有工作'
	end
from emp t

0x02.多行函數

1.count()

  • 統計記錄數。
  • 示範:
select count(*) from emp;

2.min(),max()

  • 最大最小值查詢。
  • 示範:
select min(val) from emp;

3.avg()

  • 平均值查詢。
  • 示範:
select avg(val) from emp;

4.sum()

  • 求和。
  • 示範:
select sum(val) from emp;

0x03.分組查詢

  • 語法:
SELECT * |列名 
FROM 表名 
	{WEHRE 查詢條件}   
	列名 1 ASC|DESC,
	列名 2...ASC|DESC 
	{GROUP BY 分組字段} ORDER BY
  • 注意事項:

    • 如果使用分組函數,SQL 只可以把 GOURP BY 分組條件字段和分組函數查詢出來,不能有其他字段。
    • 如果使用分組函數,不使用 GROUP BY 只可以查詢出來分組函數的值。
  • 示範:

-- 查詢每個部門的人數
select deptno ,count(ename)
from emp 
group by deptno;

-- 查詢每個部門的平均工資
select deptno,avg(val) 
from emp
group by deptno;

0x04.多表查詢

  • 使用一張以上的表做查詢就是多表查詢 .
  • 語法:
SELECT {DISTINCT} *|列名.. 
FROM 表名 別名,表名 1 別名 
{WHERE 限制條件 
ORDER BY 排序字段 ASC|DESC...} 
  • Oracle 中的內外連接基本相似。
  • Oracle有一個專用的外連接。
  • 示範:
select *
from emp e,dept d
where e.deptno(+)=d.deptnp;
  • 使用(+)表示左連接或者右連接,當(+)在左邊表的關聯條件字段上時是左連接,如果是在右邊表的關聯條件字段上就是右連接。

自連接:

  • 站在不同的角度,把一張表看成多張表。
  • 示範:
-- 查詢員工姓名,員工領導姓名
select e1.ename,e2.ename
from  emp e1,emp e2
where e1.mgr=e2.empno;

0x05.子查詢

  • 在一個查詢的內部還包括另一個查詢,則此查詢稱爲子查詢。 Sql 的任何位置都可以加入子查詢。
  • 在返回多條記錄的子查詢可以把它的結果集當做一張表,起個別名。

1.子查詢返回值

-示範:

-- 查詢出工資和ATFWUS一樣的員工信息
select *
from emp
where sal =
	(select val
	 from emp
	 where name='ATFWUS');

2.子查詢返回一個集合

  • 示範:
-- 查詢出工資和1號部門任意員工一樣的所有員工信息
select *
from emp
where val in 
	(select sal
	 from emp
	 where deptno=1);

3.子查詢返回一張表

  • 示範:
-- 查詢出每個部門最低工資,和最低工資的員工姓名,和員工所在部門。
select t.deptno,t.msal,e.ename,d.dname
from	(select deptno,min(sal) msal
		from emp
		group by deptno
		) t,emp e,dept d
where t.deptno=e.deptno
and t.msal=e.sal
and e.deptno=d.deptno;

0x06.分頁查詢

  • ROWNUM:表示行號,實際上此是一個列,但是這個列是一個僞列,此列可以在每張表中出現。
  • rownum不支持大於號。
  • 示範:
-- emp表工資倒序排列後,每頁五條記錄,查詢第二頁
select * from(
	select rownum rn,e.* from(
		select * from emp order by sal desc
	) e where rownum<11
) where rn>5;

ATFWUS --Writing By 2020–05-04

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章