desc dual;sql
select2 * 4from dual;函數
selectsysdatefrom dual;性能
Selectsysdate日期from dual;spa
雙引號能保持格式翻譯
如:selectsysdate 「toDay 日期」 from dual;code
select owner from dba_tables where table_name='表名';排序
注:system.tb_booktype 表tb_booktype屬於system用戶ci
爲了後續咱們使用,咱們如今建立「圖書類型表—tb_booktype」和「圖書信息表— tb_bookinfo」字符串
在圖書類別表查看到ID等於2的數據get
select* from tb_booktype t where t.id='2'
在圖書類別表查看到ID大於2的數據
select* from tb_booktype t where t.id >'2'
在圖書類別表查看到ID小於2的的數據
select* from tb_booktype t where t.id<'2'
在圖書類別表查看到ID小於等於2的數據
select* from tb_booktype t where t.id<='2'
在圖書類別表查看到ID大於等於2的數據
select* from tb_booktype t where t.id>='2'
在圖書類別表查看到ID不等於等於2的數據
select* from tb_booktype t where t.id<>'2'
select* from tb_booktype t where t.id!='2'
in(是知足一個字段的多個值)
在圖書類別表查看類別名稱等於天然和人文的數據
select* from tb_booktype t where t .typename in ('天然','人文')
在圖書類別表查看類別名稱等於天然和人文的數據且;而且類別ID等於1和2
select* from tb_booktype t where t .typename in ('天然','人文')and t.id notin ('1','2')
like模糊
在圖書類別表查看類別名稱包含「文」的數據
select* from tb_booktype t where t.typename like'%文'
注意:百分號的位置不一樣查出的數據也不相同!
select* from tb_booktype t where t.typename like'文%'
select* from tb_booktype t where t.typename like'%文%'
在圖書類別表查看類別名稱爲空的數據
select* from tb_booktype t where t.typename isnull
and(就是和的意思,必須同時知足條件)
在圖書類別表查看到ID大於2的且小於45的數據
select* from tb_booktype t where t.id>'2'and t.id<'45'
or(是或者的意思,兩個或者多個條件知足一個就能夠)
在圖書類別表查看到ID大於2的或類別名稱等於天然的數據
select* from tb_booktype t where t.id>'2'or t.typename='天然'
orderby、asc(升序),desc(降序)
在圖書類別查看數據,按降序排序
select* from tb_booktype t orderby t.id desc
求部門分組後工資最高的員工信息
select emp.ename, emp.sal, emp.deptno from emp, (selectmax(sal) max_sal, deptno from emp groupby deptno) t where emp.sal = t.max_sal and emp.deptno = t.deptno;
求部門平均工資等級
select s.grade, t.deptno, t.avg_sal from scott.salgrade s, (select deptno, avg(sal) avg_sal from emp groupby deptno) t where t.avg_sal > s.losal and t.avg_sal < s.hisal;(between)
innerjoin(等值鏈接) 只返回兩個表中聯結字段相等的行
leftjoin(左聯接) 返回包括左表中的全部記錄和右表中聯結字段相等的記錄
rightjoin(右聯接) 返回包括右表中的全部記錄和左表中聯結字段相等的記錄
fulljoin()取到的除了左右兩邊都匹配上的記錄數,對於左邊表與右邊表沒有匹配的,用null補上做爲右邊表匹配的數據;右邊表與左邊表沒有匹配的,用null補上做爲左邊表匹配的數據。總記錄數=左邊未匹配記錄數+右邊未匹配記錄數+左右都匹配上的記錄數
查詢出圖書類型,和圖書名稱
select t.typename,tb.bookname from tb_booktype t, tb_bookinfo tb where t.id = tb.typeid
select t.typename,tb.bookname from tb_booktype t
innerjoin tb_bookinfo tb on t.id=tb.typeid
select t.typename,tb.bookname from tb_booktype t leftjoin tb_bookinfo tb on t.id=tb.typeid
select t.typename,tb.bookname from tb_booktype t rightjoin tb_bookinfo tb on t.id=tb.typeid
select t.typename,tb.bookname from tb_booktype t fulljoin tb_bookinfo tb on t.id=tb.typeid
--並集:不帶重複數據
select t.id from tb_booktype t
union
select tb.typeid from tb_bookinfo tb;
--並集:帶重複數據
select t.id from tb_booktype t
unionall
select tb.typeid from tb_bookinfo tb;
--割集,顯示不一樣部分(指令是運用在兩個 SQL 語句上。它先找出第一個 SQL 語句所產生的結果,而後看這些結果有沒有在第二個 SQL 語句的結果中。若是有的話,那這一筆資料就被去除,而不會在最後的結果中出現。若是第二個 SQL 語句所產生的結果並無存在於第一個 SQL 語句所產生的結果內,那這筆資料就被拋棄)
select t.id from tb_booktype t
minus
select tb.typeid from tb_bookinfo tb;
--交集。
select t.id from tb_booktype t
intersect
select tb.typeid from tb_bookinfo tb;
含義解釋:
decode(條件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
該函數的含義以下:
IF條件=值1 THEN
RETURN(翻譯值1)
ELSIF條件=值2 THEN
RETURN(翻譯值2)
......
ELSIF條件=值n THEN
RETURN(翻譯值n)
ELSE
RETURN(缺省值)
ENDIF
decode(字段或字段的運算,值1,值2,值3)
這個函數運行的結果是,當字段或字段的運算的值等於值1時,該函數返回值2,不然返回值3
固然值1,值2,值3也能夠是表達式,這個函數使得某些sql語句簡單了許多
例子:在圖書類型表中查詢,當圖書類型等於「人文」的時候那麼它屬於‘百科類’,期他圖說類型屬於「其餘類」
select decode(t.typename,'人文','百科類','其餘類') , t.typename name
from tb_booktype t
概述:
sql語句中的case語句與高級語言中的switch語句,是標準sql的語法,適用於一個條件判斷有多種值的狀況下分別執行不一樣的操做。
首先,讓咱們看一下CASE的語法。在通常的SELECT中,其語法格式以下:
SELECT <myColumnSpec> =
CASE <單值表達式>
when <表達式值> then <SQL語句或者返回值>
when <表達式值> then <SQL語句或者返回值>
...
when <表達式值> then <SQL語句或者返回值>
END
應用CASE語句可讓SQL變得簡潔高效,從而大大提升了執行效率。並且,CASE的使用通常不會引發性能(相比沒有用CASE的語句)低下,反而增長了操做的靈活性
有一張表,裏面有3個字段:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄並按如下條件顯示出來(並寫出您的思路):
大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。
顯示格式:
語文 數學 英語
及格 優秀 不及格
------------------------------------------
select
(casewhen語文>=80then'優秀'
when語文>=60then'及格'
else'不及格') as語文,
(casewhen數學>=80then'優秀'
when數學>=60then'及格'
else'不及格') as數學,
(casewhen英語>=80then'優秀'
when英語>=60then'及格'
else'不及格') as英語,
fromtable
select lower(‘abcABC’) from dual;
select upper(‘abcABC’) from dual;
substr(target, startIndex, length)
select substr(‘abcABC’, 1, 3) from dual;
語法: TRUNC(x[,y])
功能: 計算截尾到y位小數的x值. y缺省爲0,結果變爲一個整數值.若是y是一個負數,那麼就截尾到小數點左邊對應的位上.TRUNC()函數截取時不進行四捨五入,通常用於日期的截取上
select trunc(123.458) from dual --123
select trunc(123.458,0) from dual --123
select trunc(123.458,1) from dual --123.4
select trunc(123.458,-1) from dual --120
select trunc(123.458,-4) from dual --0
select trunc(123.458,4) from dual --123.458
select trunc(123) from dual --123
select trunc(123,1) from dual --123
select trunc(123,-1) from dual --120
用在日期類型上,就是截取到日或時間
SELECT TRUNC(SYSDATE) FROM DUAL;
默認是截取系統日期到日,獲得2012-12-19
好比值爲"2012-12-19 14:30:50"的日期變量
TRUNC(SYSDATE)獲得2012-12-19 , 和TRUNC(SYSDATE,'DD')同樣
TRUNC(SYSDATE,'YYYY'),獲得2012-1-1
TRUNC(SYSDATE,'MM'),獲得2012-12-1
TRUNC(SYSDATE,'DD'),獲得2012-12-19
TRUNC(SYSDATE,'HH')或HH24,獲得2012-12-1914:00:00
TRUNC(SYSDATE,'MI'),獲得2012-12-1914:30:00
TRUNC(SYSDATE,'SS'),是會報錯的,直接用SYSDATE不用TRUNC
另外說明一下,截取後獲得的仍爲date數據類型
(四捨五入)
描述 : 傳回一個數值,該數值是按照指定的小數位元數進行四捨五入運算的結果。
SELECT ROUND( number, [ decimal_places ] ) FROM DUAL
參數:
number : 欲處理之數值
decimal_places : 四捨五入 , 小數取幾位 ( 預設爲0 )
例:select round(123.456, 0) from dual; 獲得:123
取得字符串中指定起始位置和長度的字符串,
格式:substr( string, start_position, [ length ] )
參數:start_position---正數從左邊開始,負數從右邊開始
length -----取得的位數
如: substr('This is a test', 6, 2) 獲得'is'
substr('This is a test', 6) 獲得'is a test'
substr('TechOnTheNet', -3, 3) 獲得'Net'
substr('TechOnTheNet', -6, 3) 獲得'The'
例:select substr('Thisisatest', -4, 2) valuefrom dual
--獲得當前的那年那月
select substr(sysdate,1,6) valuefrom dual
nvl能夠將某個字段的空值轉換成指定的值
nvl(字段名,0),就是當你選出來的時候,這個字段雖然爲空,可是顯示的是0,固然這個0也能夠換成其餘東西,如:1,2,3……
在圖書類別表查看數據類別名稱爲空的補零
select nvl(t.typename,0),t.id from tb_booktype t
在圖書信息表查看最高的價格
selectmax(tb.price) from tb_bookinfo tb
在圖書信息表查看最低的價格
selectmin(tb.price) from tb_bookinfo tb
在圖書信息表查看平均的價格
selectavg(tb.price) from tb_bookinfo tb
在圖書信息表算出表中全部價格的和
selectsum(tb.price) from tb_bookinfo tb
在圖書信息表中價格不爲空的數據條數
selectcount (tb.price) from tb_bookinfo tb
在圖書信息表中價格不相同的數據條數
selectcount(distinct tb.price) from tb_bookinfo tb
去掉重複數據distinct
在圖書類別表中查出有幾類圖書,可是表中有重複如何查詢呢?,
這裏咱們用到了 distinct去掉重複數據
selectdistinct(t.typename) from tb_booktype t
拓展:
Oracle比較一列的最大值或者最小值,咱們會用MAX和MIN函數,可是對於比較一行的最大值或最小值呢?是否是平常用的少,不少人都不知道有ORACLE也有內置函數實現這個功能:COALESCE / GREATEST /LEAST
1. COALESCE返回該表達式列表的第一個非空value。
格式:COALESCE(value1, value2, value3, ...)
含義:返回value列表第一個非空的值。
value列表必須是相同類型,也能夠是一個表的同一行、不一樣列的值進行比較。
EXAMPLE: selectcoalesce (1, null, 2 ) from dual ; -- 返回1
selectcoalesce ( null, 2, 1 ) from dual ; -- 返回2
selectcoalesce (t.empno, t.mgr ) from scott.emp t ; -- 效果相似 NVL( t.empno, t.mgr )
2. GREATEST 返回值列表中最大值
格式: GREATEST(value1, value2, value3, ...)
含義:返回value列表最大的值。
value列表必須是相同類型,也能夠是一個表的同一行、不一樣列的值進行比較。
當value值列表中有一個爲NULL,則返回NULL值。
EXAMPLE: select greatest (1, 3, 2 ) from dual ; -- 返回3
select greatest ( 'A', 'B', 'C' ) from dual ; -- 返回C
select greatest (null, 'B', 'C' ) from dual ; -- 返回null
select greatest (t.empno, t.mgr ) from scott.emp t ; -- 返回empno和mgr 較大值
3. LEAST 返回值列表中最小值
格式: LEAST(value1, value2, value3, ...)
含義:返回value列表最小的值。
value列表必須是相同類型,也能夠是一個表的同一行、不一樣列的值進行比較。
當value值列表中有一個爲NULL,則返回NULL值。
EXAMPLE: select least (1, 3, 2 ) from dual ; -- 返回1
select least ( 'A', 'B', 'C' ) from dual ; -- 返回A
select least (null, 'B', 'C' ) from dual ; -- 返回null
select least (t.empno, t.mgr ) from scott.emp t ; -- 返回empno和mgr 較小值
查詢圖書信息表中的」圖書數量」按」圖書類型id」進行分組;
select tb.typeid,count(tb.bookname) from tb_bookinfo tb
groupby tb.typeid;
having用法
groupby後面是要跟着的select中全部不是聚合函數的字段。
註釋:聚合函數:聚合函數對一組值執行計算並返回單一的值。聚合函數忽略空值。聚合函數常常與SELECT語句的GROUPBY子句一同使用
例1: selectcount(*) from emp;
//只是查詢總總數 emp這張表裏一共有多少條記錄因此不用group by
例2: selectcount(*) , deptno from emp groupby deptno;
// 根據deptno 分組,查到的數據就是 列出不一樣部門記錄總數
selectcount(*) , deptno , comm from emp groupby deptno , comm;
// 根據deptno 和 comm 分組 以此類推
groupby後面是要跟着的select中全部不是聚合函數的字段 不然會報錯。
having至關於where與where的惟一區別是當查詢語句中有聚合函數的時候就不能用where了只能用having
求圖書平均工資大於30的數據:
select * from(
selectavg(tb.price) price,tb.typeid
from tb_bookinfo tb
groupby tb.typeid
)
where price>40
selectavg(tb.price) price,tb.typeid
from tb_bookinfo tb
groupby tb.typeid
havingavg(tb.price)>40
經常使用日期數據格式(該段爲摘抄)
Y或YY或YYY 年的最後一位,兩位或三位Select to_char(sysdate,’YYY’) from dual;002表示2002年
SYEAR或YEAR SYEAR使公元前的年份前加一負號Select to_char(sysdate,’SYEAR’) from dual; -1112表示公元前111 2年
Q 季度,1~3月爲第一季度Select to_char(sysdate,’Q’) from dual;2表示第二季度①
MM 月份數Select to_char(sysdate,’MM’) from dual;12表示12月
RM 月份的羅馬錶示Select to_char(sysdate,’RM’) from dual; IV表示4月
Month用9個字符長度表示的月份名Select to_char(sysdate,’Month’) from dual; May後跟6個空格表示5月
WW 當年第幾周Select to_char(sysdate,’WW’) from dual;24表示2002年6月13日爲第24周
W 本月第幾周Select to_char(sysdate,’W’) from dual;2002年10月1日爲第1周
DDD 當年第幾, 1月1日爲001,2月1日爲032 Select to_char(sysdate,’DDD’) from dual;3632002年1 2月2 9日爲第363天
DD 當月第幾天Select to_char(sysdate,’DD’) from dual;0410月4日爲第4天
D 周內第幾天Select to_char(sysdate,’D’) from dual;52002年3月14日爲星期一
DY 周內第幾天縮寫Select to_char(sysdate,’DY’) from dual; SUN 2002年3月24日爲星期天
HH或HH12 12進制小時數Select to_char(sysdate,’HH’) from dual;02午夜2點過8分爲02
HH24 24小時制Select to_char(sysdate,’HH24’) from dual;14下午2點08分爲14
MI 分鐘數(0~59) Select to_char(sysdate,’MI’) from dual;17下午4點17分
SS 秒數(0~59) Select to_char(sysdate,’SS’) from dual;2211點3分22秒
提示注意不要將MM格式用於分鐘(分鐘應該使用MI)。MM是用於月份的格式,將它用於分鐘也能工做,但結果是錯誤的。
SQL> Selectsysdatefrom dual;
SQL> Select last_day(sysdate) from dual;
用於從一個日期值增長或減小一些月份
date_value:=add_months(date_value,number_of_months)
函數能夠獲得某一時間以前或以後n個月的時間
如select add_months(sysdate,-6) from dual;
該查詢的結果是當前時間半年前的時間
如select add_months(sysdate,6) from dual;
該查詢的結果是當前時間半年後的時間
SQL> Select add_months(sysdate,2) from dual;
SQL> select months_between(sysdate,to_date('2005-11-12','yyyy-mm-dd'))from dual;
date參數爲日期型,
char:爲1~7或Monday/Mon~Sunday/
指定時間的下一個星期幾(由char指定)所在的日期,
char也可用1~7替代,1表示星期日,2表明星期一。。。。
還能夠是星期1、星期二。。。星期日
Sql代碼
select next_day(sysdate,'星期日') from dual;
返回由"char "命名的,在變量"date "指定的日期以後的第一個工做日的日期。參數"char "必須爲該星期中的某一天。
SQL> SELECT next_day(to_date('20050620','YYYYMMDD'),1) FROM dual;