1.1簡單查詢語句
在scott用戶下有幾張表,先了解下一下這幾張表在作用。
1雇員表(emp)
2部門表(dept)
3工資等級表(SALGRADE)
4獎金表(BONUS)
簡單查詢語句語法格式:
SELECT *| 具體的別 別名 FROM 表名稱; |
例如只查詢emp表雇員的編號,姓名,工作:
select empno,ename,job from emp; |
查詢的時候可以指定查詢的返回列的名稱,即為一個列取一個別名:
select empno 編號,ename 姓名,job 工作 from emp; |
查詢工作:
select job from emp; |
發現存在重復值,可以通過DISTINCT消除所有的重復列:
SELECT {DISTINCT} *|具體的列 別名 FROM 表名稱 |
在Oracle中提供字符串連接操作,使用“||”表示,所有的其他信息可以使用“’”括起來。
練習
現在要求查詢雇員的編號,姓名,工作,但是顯示的格式:
編號是:7369的雇員,姓名是:SMITH,工作是:CLEKE
SQL> select '編號是:'||empno ||'的雇員,姓名是:'||ename||',工作是:'|| job from emp; |
在查詢中可以使用四則運算功能,例如求出每個雇員的姓名及年薪。
SQL> select ename ,sal*12 from emp; |
1.2限定查詢(WHERE)
限定查詢的語法:
SELECT {DISTINCT} *|具體列 別名 FROM 表名稱 {WHERE 條件(s)} |
例:查詢出所有工資大於1500的所有雇員信息:
select * from emp where sal>1500; |
例:查詢每個月可以得到獎金的雇員信息
為空:IS NULL;不為空:IS NOT NULL。
select * from emp where comm is not null; |
例:查詢工資大於1500,同時可以拿到獎金的雇員信息:
兩個條件同時滿足,可以用“and”連接。
SQL> select * from emp where sal>1500 and comm is not null; |
例:查詢工資大於1500,或者可以拿到獎金的雇員信息:
兩個條件滿足一個,可以用“or”進行連接。
select * from emp where sal>1500 or comm is null; |
例:查詢工資不大於1500,或者拿不到獎金的雇員信息:
用NOT取反操作
SQL> select * from emp where not(sal>1500 and comm is not null); |
例:查詢工資大於1500,不大於3000的雇員信息
語法格式
字段 BETWEEN 最小值 AND 最大值 |
SQL> select * from emp where sal between 1500 and 3000; |
例:查詢1981年雇佣的全部雇佣:
日期表示的時候要加“'”
SQL> select * from emp where hiredate between '01-1月 -81' and '30-12月 -81'; |
例:查詢名字叫SMITH的雇員
SQL> select * from emp where ename = 'SMITH'; |
例:查詢雇員編號為7369、7499、7521的雇員信息:
SQL> select * from emp where empno =7369 or empno=7499 or empno=7521; |
指定從查詢范圍,可以用IN操作符完成,語法格式:
字段 IN(值1,值2,…,值3) |
不在指定范圍,可以用NOT IN 操作符完成
字段 NOT IN(值1,值2,…,值3) |
注意:在使用NOT IN進行范圍判斷的時候,如果范圍里面包含有null,那么不會返回任何結果。
以上查詢語句可以寫成:
select * from emp where empno in(7369,7499,7521); |
IN中指定了表中范圍外的內容,不影響程序運行。
模糊查詢:LIKE
SQL使用LIKE語句完成模糊查詢,在LIKE語句中主要使用以下兩種通配符:
l “%”:可以匹配任意長度的內容;
l “-”:可以匹配一個長度的內容。
例:查詢所有雇員姓名中第二個字母包含“M”的雇員信息
SQL> select * from emp where ename like '_M%'; |
例:查詢所有雇員姓名中包含“M”的雇員信息
SQL> select * from emp where ename like '%M%'; |
例:查詢1981年雇佣的雇員信息
select * from emp where hiredate like '%81'; |
在操作條件中還可以使用>、>=、 =、 <、 <=。
不等於符號:SQL中有兩種形式“<>”、“!=”。
1.3對結果進行排序(ORDER BY)
ORDER BY排序語法格式:
SELECT {DISTINCET} *|具體列 別名 FROM 表名稱 {WHERE 條件(s)} {ORDER BY 排序的字段1,排序的字段2, ASC|DESC} ->ASC升序,DESC降序,默認按升序排 |
例:要求按雇員的工作由低到高排序
SQL> select * from emp order by sal asc; |
例:要求查詢出10部門的所有雇員信息,按工資有高到低排序,如果工資相等,按雇佣日期由早到晚排序。
SQL> select * from emp where deptno=10 order by sal desc,hiredate asc; |
1.4單行函數
單行函數語法:
Function_name(colum|expression,[arg1,arg2,…,]) |
參數說明:
l Function_name:函數名稱;
l Column:數據庫列名;
l Expression:字符串與計算表達式;
l Arg:函數中使用的參數
單行函數分類:
l 字符函數:接受字符輸入並返回字符或數值;
l 數值函數:接受數值輸入並返回數值;
l 日期函數:對日期值數據進行操作;
l 轉換函數:從一種數據類型轉換為另一種數據類型;
l 通用函數:NVL函數、DECODE函數。
1.4.1字符函數
可以將大寫字符變為小寫,還可以求出字符的長度。
在Oracle中所有的函數如果要想進行驗證,也必須編寫SQL語句。為了方便用戶進行一些驗證或者一些不需要查詢表的查詢操作,專門提供了一個dual的虛擬表。
例:將小寫變為大寫
SQL> select upper('smith') from dual; |
例:一般用戶在查詢一個人姓名的時候,可能考慮到這個人的姓名是大寫字母還是小寫字母呢,此時可以使用upper函數完成。
SQL> select * from emp where ename = upper('smith'); |
在Oracle數據庫里面本身數據是區分大小寫的,但是在實際的項目開發中有許多代碼本身的不區分大小寫關系的,所以用戶進行信息查詢的時候也往往不會考慮到字母的大小寫問題。
例:由用戶輸入要查詢的雇員姓名,而后顯示雇員的完整信息
l 在Oracle中如果要想實現數據的輸入操作,可以使用代替變量的方式完成,格式“&標記”
select * from emp where ename=upper('&inputname'); |
例:使用lower()函數將字符串變為小寫
SQL> select lower('HELLO') from dual; |
例:用initcap()函數將單詞第一個字母變成大寫,其他變成小寫。
SQL> select initcap('HELLO') from dual; |
例:將雇員表中雇員姓名變為首字母大寫。
SQL> select initcap(ename) from emp; |
例:字符串連接除了可以用“||”外,還可以用CONCAT()函數進行連接操作。
SQL> select concat('hello','word') from dual; |
l 字符串截取:substr(str,offset,len);
l 字符串長度:length(str);
l 內容替換:replace(str,c1,c2); 字符串str中將c1變為c2
SQL> select substr('hello',1,4), length('hello'), replace('hello','h','t') from dual; |
面試題:Oracle中substr()函數截取點是從0還是從1開始?
|-從0和1都可以,因為Oracle比較智能。
例:要求顯示所有雇員姓名和姓名后三個字符
SQL> select ename,substr(ename,length(ename)-2) from emp; |
實際上substr()函數中提供了一種可以倒着截取的方式,只要輸入的位置是負數就表示倒着進行。
SQL> select ename,substr(ename,-3,3) from emp; |
1.4.2數值函數
四舍五入:ROUND();
截斷小數位:TRUNC();
取余(取模):MOD();
例:執行四舍五入。
SQL> select round(2.31323) from dual; |
例:對整數進行四舍五入進位。
SQL> select round(324.32,-2) from dual; |
例:保留2位小數。
SQL> select trunc(32.23232,2) from dual; |
TRUNC()與ROUND()不同的是,在TRUNC中,不會保留任何的小數,而且小數點不會進行四舍五入操作。
SQL> select trunc(32.427,2) from dual; |
SQL> select trunc(32.427) from dual; |
例:使用負數表示位數。
SQL> select trunc(372.827,-2) from dual; |
例:使用MOD()函數取余操作
SQL> select mod(10,3) from dual; |
1.4.3日期函數
日期的加減操作規律:
l 日期-數字=日期
l 日期+數字=日期
l 日期-日期=數字(天數)
例:顯示10部門雇員進入公司的星期數。
|-獲取當前的時間:SYSDATE
SQL> select sysdate from dual; |
SQL> select round((sysdate-hiredate )/7) from emp; |
l MONTHS_BETWEEN(DATE1,DATE2):求出所給日期范圍的月數;
l ADD_MONTHS(date,months):在給定日期上加上指定月數,求出之后的日期
l NEXT_DAY(date,’星期幾’):下一個的星期幾是那個日期
l LAST_DAY(date);求出所給日期的所在月份的最后一天日期
驗證MONTHS_BETWEEN(DATE1,DATE2)
SQL> select ename,months_between(sysdate,hiredate) from emp; |
驗證ADD_MONTHS(date,months)
SQL> select add_months(sysdate,4) from dual; |
驗證NEXT_DAY(date,’星期幾’)
SQL> select next_day(sysdate,'星期一') from dual; |
驗證LAST_DAY(date)
SQL> select last_day(sysdate) from dual; |
1.4.4轉換函數
l TO_CHAR(日期,通配符):日期轉換成字符串
l TO_NUMBER():字符串轉化成數字
l TO_DATE():字符串轉換成日期
(1)TO_CHAR()函數
日期年、月、日拆分的通配符:
l 年:’y’,年是四位的數字,可以使用’yyyy’表示;
l 月:’m’,月是兩位的數字,可以使用’mm’表示;
l 日:’d’,日是兩位的數字,可以使用’dd’表示;
l 年-月-日:’yyyy-mm-dd’
例:對雇員表的日期進行拆分
SQL> select to_char(hiredate,'yyyy')year,to_char(hiredate,'mm') month,to_char(hiredate,'dd')day from emp; |
SQL> select ename, to_char(hiredate,'yyyy-mm-dd') from emp; |
從運行結果可以看出日期一位數的時候會在前面補0,如果不想要0的話,可以用fm去掉這些0。
SQL> select ename, to_char(hiredate,'fmyyyy-mm-dd') from emp; |
TO_CHAR()函數還可以用在數字中,一般中國使用“,”分割比較長的數據,可以使用to_char()進行格式化。
SQL> select ename,to_char(sal,'99,999') from emp; |
可以使用以下兩種符號表示不同金額:
l $:表示美元
l L:表示Local的縮寫。以本地的語言進行金額的顯示
SQL> select ename,to_char(sal,'$99,999') from emp; |
(2)TO_NUMBER()函數
將字符串轉換成數字
SQL> select to_number('123')+to_number('234') from dual; |
(3)TO_DATE()函數
將字符串轉換成DATE型數據。
SQL> select to_date('2016-09-12','yyyy-mm-dd') from dual; |
1.4.5通用函數
(1)NVL()函數
例:求出每個雇員的年薪(sal+comm)*12。
SQL> select ename ,(sal+comm)*12 from emp; |
造成這樣的結果是因為有些雇員的獎金為NULL,NULL值計算之后結果還是NULL。遇到這種情況就可以使用NVL()函數,可以將一個指定的NULL值變為指定的內容。
SQL> select empno,ename,nvl(comm,0),(sal+nvl(comm,0))*12 from emp; |
(2)DECODE()函數
DECODE()函數在面試中最有可能問到的問題,類似於IF…ELSEIF…ELSE語句。
語法:
DECODE(col/expression,search1,result1[,search2,result2,…][,default]) |
說明:
l Col/expression:為列名或者表達式
l Search1、search2…searchi:用於比較的條件
l Result1、result2…resulti:為返回值
如果col/expression與search相比較,結果相同的話,返回result,如果沒有與col/expression相同的結果,返回默認值default。
SQL> select decode(1,1,'內容是1',2,'內容是2','沒有匹配的') from dual; |
結果是:內容是1
SQL> select decode(5,1,'內容是1',2,'內容是2','沒有匹配的') from dual; |
結果是:沒有匹配的
例:雇員的工作:
|-CLERK:業務員
|-SALESMAN:銷售員
|-MANAGER:經理
|-ANALYST:分析員
|-PRESIDENT:總裁
現要求查詢雇員的編號,姓名,雇佣日期及工作,將工作替換成以上內容。
SQL> select empno,ename,hiredate,decode(job,'CLERK','業務員','SALESMAN','銷售員','MANAGER','經理', 'ANALYST','分析員','PRESIDENT','總裁') from emp; |