Oracle基本命令與簡單查詢


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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM