oracle學習之基本查詢和條件過濾,分組函數使用
oracle是殷墟出土的甲骨文的第一個單詞,所以在中國叫做甲骨文,成立於1977年,總部位於美國加州。
在安裝好後,主要有兩個服務需要開啟:
1,實例服務,OracleServiceORCL,決定是否可以連接上數據庫
2,監聽服務,OracleOraDb11g_home1TNSListener,決定是否可遠程連接數據庫
在安裝好客戶端後,登錄方式:
sqlplus 用戶名/密碼
如果是遠程登錄,需要加上連接別名,或者IP:
sqlplus 用戶名/密碼@//IP地址/實例名 or sqlplus 用戶名/密碼@連接名
數據庫基本查詢:
select * from tab;
tab是一個數據字典,字義了當前用戶有哪些表,以及類型,查看表結構:
desc dept
註意,如果顯示行大小和寬度不正確,可以通過修改登錄設置文件改變:
路徑:\app\Administrator\product\11.2.0\client_1\sqlplus\admin set linesize 140;//設置行大小 set pagesize 120;//設置頁寬度 col empno for 99999;//修改數值型字段長度 col ename for a20;//設置字符型字段長度
sql語法的註意事項:關鍵字不能縮寫,不能換行,以分號結尾!
查看sqlplus的所有命令:
? topic
查詢SQL語句語法:
select [distinct]*|column_name|expr|alias from tablename
查詢員工號,姓名,月薪,獎金,年薪:
註意,獎金字段有為null的結果,可以通過慮空函數解決,即:nvl(a,b),如果a為null,返回b,否則返回a
如果需要查看員工表不同的部門編號,並且去除重復的,可以這麽做:
通常,我們還可以借助偽表來進行一些的數學計算或函數操作:
select 3+20*5,sysdate from dual;
比較運算符的查詢條件過濾: = != <> < > <= >= (between and)
case1: 查詢入職日期為1981年11月17日的員工信息:
select * from emp where hiredate = ‘1981-11-17‘
這裏要註意,如果顯示文字與格式字符串不匹配的問題,通常必須按照具體日期格式寫:
如果自己想修改這個日期格式,可以進入管理員用戶後修改,如下:
SQL> select sysdate from dual; //修改會話日期格式 SQL> alter session set nls_date_format=‘yyyy-mm-dd‘; //後面就可以這樣查詢了: SQL> select * from emp where hiredate =‘1981-11-17‘;
邏輯運算符 and or not,這裏特別說明一下,查找工資在1000~2000的員工信息:
select * from emp where sal >= 1000 and sal <= 2000; //或者 select * from emp where sal between 1000 and 2000;
between and 是屬於閉區間,從小到大!
如何正確查詢獎金為空的員工信息 - null
select * from emp where comm is null;
當and or 存在多個條件寫,如何來寫才更優?
sql語句是從右到左執行,and情況,應該將易假的放在右側,or情況,應該將真的放在右側。
like ->模糊查詢,‘%‘匹配任意多個字符,‘_‘匹配任意一個字符
重點:查詢帶在下劃線‘_‘的應該怎麽查詢:
select * from emp where ename like ‘%/_%‘ escape ‘/‘;
排序:group by; having; order by;語法如下:
order by col|expr|alias|number
員工薪水按從大到小排序(序號)
select * from emp order by sal desc; //或者 select * from emp order by 6 desc; //或者 select empno,ename,job,mgr,sal,comm,deptno from emp order by 5 desc;
這裏更要註意null的情況,默認無窮大:
解決辦法是:
select * from emp where deptno = 30 order by comm desc nulls last;
//或者
select * from emp where deptno = 30 order by nvl(comm,-1) desc;
oracle的單行函數:
什麽叫單行函數,即對一行進行變換,只產生一個結果。
lower(小寫),upper(大寫),initcap(首字母大寫),||(可以進行字符串連接)
select lower(‘hello WorLD‘) one,upper(‘HeLLo woRld‘) two,initcap(‘hello WOrld‘) from dual; select ‘aaaa‘||‘bbbb‘||‘cccc‘ from dual;
substr(字符串,位置,長度),從位置開始截取長度,長度可以省略,代表截取到未尾:
select substr(‘helloworld‘,1,3) one,substr(‘helloworld‘,1) two ,substr(‘helloworld‘,-3) three from dual;
length求字符串長度,lengthb求字節長度:
instr(str1,str2) ,判斷str2是否在str1中,如果存在返回出現的首位置,否則返回0:
select instr(‘hello world‘,‘llo‘) from dual;
lpad,rpad,左右填充l(r)pad(str,len,char) 返回len長度的字符串,如果str不夠長度,則是char字符填充:
select lpad(‘hello‘,10,‘#‘) from dual;
trim(str)去首尾空格,replace(str,substr,strto)替換
select ‘aaa‘||trim(‘ hello world ‘)||‘bbb‘ from dual;
還能這麽玩:
重要:數值函數,round四舍五入,trunc截斷,mod取模
select round(45.926, 2) 一, round(45.926, 1) 二, round(45.926, 0) 三, round(45.926, -1) 四, round(45.926, -2) 五 from dual; select trunc(45.926, 2) 一, trunc(45.926, 1) 二, trunc(45.926, 0) 三, trunc(45.926, -1) 四, trunc(45.926, -2) 五 from dual; select mod(600,1000),mod(1000,600) from dual; //ceil 和floor 向上取整,向下取整 select ceil(121/60),floor(121/60) from dual;
重要:轉換函數,to_char,to_number,to_date
把薪水轉換為本地貨幣字符型:
select sal,to_char(sal,‘L9,999‘) from emp;
如果要將這個在轉回數值型,語句是一樣的:
select to_number(‘¥1,250‘,‘L9,999‘) from dual;
to_char 與 to_date 顯示 ‘yyyy-mm-dd hh24:mi:ss 今天是 星期幾‘
select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss "今天是" day‘) from dual;
將上述字符串反轉為日期:
select to_date(‘2017-11-10 15:48:13 今天是 星期五‘,‘yyyy-mm-dd hh24:mi:ss "今天是" day‘) from dual;
此處可以解決一個隱式日期轉換問題:
select * from emp where to_char(hiredate,‘yyyy-mm-dd‘)=‘1981-11-17‘;
上面的能顯示轉換,盡量顯示轉換。
重要:日期函數
1,顯示昨天,今天,明天:
select sysdate-1 昨天,sysdate 今天,sysdate+1 明天 from dual;
2,計算員工工齡,可以按日,周,月,年,日期差減方法
oracle學習之基本查詢和條件過濾,分組函數使用