Oracle 數據庫基礎練習

查詢當前用戶是誰
show user;

查詢scott用戶下的所有對象,使用tab表,tab表每個用戶都有
select * from tab;

設置顯示的列寬(字符型varchar2、日期型date),10個寬度位,a表示字符型,大小寫均可
column ename format a12;
column hiredate format a10;

設置顯示的列寬(數值型number),9表示數字型,一個9表示一個數字位,四個9表示四個數字位,只能用9
column empno format 9999;
column mgr format 9999;
column sal format 9999;
column comm format 9999;
column deptno format 9999;

設置一頁顯示80個條記錄的高度
set pagesize 80;

使用/槓,執行最近一次的SQL語句
/

清屏,屬於SQL*PLUS工具中的命令
host cls;

查詢emp表的結構
desc emp;

查詢emp表的所有內容,號表示通配符,表示該表中的所有字段,但號不能和具體字段一起使用
select * from emp;

select empno,ename,sal,deptno from emp;

查詢emp表的員工編號,姓名,工資,部門號,列名,大小寫不敏感,但提倡大寫
select empno “編號”,ename “姓名”,sal “工資”,deptNO “部門號” FROM Emp;

查詢emp表的不重複的工作
select distinct job from emp;

查詢員工的編號,姓名,月薪,年薪(月薪*12)
select empno,ename,sal,sal*12 “年薪” from emp;

查詢員工的編號,姓名,入職時間,月薪,年薪,年收入(年薪+獎金)
select empno “編號”,ename”姓名”,hiredate “入職時間”,sal “月薪”,sal*12 “年薪”,sal*12+comm “年收入” from emp;
如果結果爲null,在sqlplus客戶端工具中,是不顯示null這個值的

解決null的問題,使用NVL()函數,NVL(a,b):如果a是NULL,用b替代;如果a是非NULL,就不用b替代,直接返回a的值\
select NVL(null,10) from emp;結果有14行記錄
select NVL(null,10) from dual;結果有1行記錄
select empno “編號”,ename”姓名”,hiredate “入職時間”,sal “月薪”,sal*12 “年薪”,sal*12+NVL(comm,0) “年收入”
from emp;
注意:null與具體數字運算時,結果爲null

使用列別名,查詢員工的編號,姓名,月薪,年薪,年收入(年薪+獎金),AS大小寫都可且可以省略AS,別名用雙引號
select empno AS “編號”,ename as “姓名”,sal “月薪”
from emp;

select empno AS 編號,ename as 姓名,sal 月薪
from emp;
區別
select empno AS “編號”,ename as 姓名,sal “月 薪”
from emp;
不加雙引號的別名不能有空格;加了雙引號的別名可以有空格
要加只能加雙引號,不能加單引號,因爲在oracle中單引號表示字符串類型或者是日期類型
列名不能使用單引號,因爲oracle認爲單引號是字符串型或日期型

使用dual啞表或者僞表,使用字符串連接符號||,輸出”hello world”,在oracle中from是必須寫的
select ‘hello’ || ’ world’ “結果” from dual;

使用sysdate,顯示系統當前時間,在默認情況下,oracle只顯示日期,而不顯示時間,格式:26-4月-15
select sysdate from dual;

使用字符串連接符號||,顯示如下格式信息:*的薪水是*美元
select ename || ‘的薪水是’ || sal || ‘美元’
from emp;

————————————————————————————-where

查詢emp表中20號部門的員工信息
select * from emp where deptno = 20;

查詢姓名是SMITH的員工,字符串使用”,內容大小寫敏感
select * from emp where ename = ‘SMITH’;
總結:你所學過的技術中,哪些是大小寫敏感,哪些是大小寫不敏感

查詢1980年12月17日入職的員工,注意oracle默認日期格式(DD-MON-RR表示2位的年份)
select * from emp where hiredate = ‘17-12月-80’;

查詢工資大於1500的員工
select * from emp where sal > 1500;

查詢工資不等於1500的員工【!=或<>】
select * from emp where sal <> 1500;

查詢薪水在1300到1600之間的員工,包括1300和1600
select * from emp where (sal>=1300) and (sal<=1600);

select * from emp where sal between 1300 and 1600;

查詢薪水不在1300到1600之間的員工,不包括1300和1600
select * from emp where sal NOT between 1300 and 1600;

查詢入職時間在”1981-2月-20”到”1982-1月-23”之間的員工
select * from emp where hiredate between ‘20-2月-81’ and ‘23-1月-82’;
注意:
1)對於數值型,小數值在前,大數值在後
2)對於日期型,年長值在前,年小值在後

查詢20號或30號部門的員工,例如:根據ID號,選中的員工,批量刪除
select * from emp where (deptno=20) or (deptno=30);

select * from emp where deptno in (30,20);

查詢不是20號或30號部門的員工
select * from emp where deptno NOT in (30,20);

查詢姓名以大寫字母S開頭的員工,使用%表示0個,1個或多個字符
select * from emp where ename like ‘S’;
等價
select * from emp where ename = ‘S’;
select * from emp where ename like ‘S%’;

注意:
凡是精確查詢用=符號
凡是不精確查詢用like符號,我們通常叫模糊查詢

查詢姓名以大寫字母N結束的員工
select * from emp where ename like ‘%N’;

查詢姓名第一個字母是T,最後一個字母是R的員工
select * from emp where ename like ‘T%R’;

查詢姓名是4個字符的員工,且第二個字符是I,使用_只能表示1個字符,不能表示0個或多個字符
select * from emp where ename like ‘I_‘;

插入一條姓名爲’T_IM’的員工,薪水1200
insert into emp(empno,ename) values(1111,’T_IM’);

查詢員工姓名中含有’_’的員工,使用\轉義符,讓其後的字符迴歸本來意思【like ‘%_%’ escape ‘\’】
select * from emp where ename like ‘%_%’ escape ‘\’;

插入一個姓名叫’的員工
insert into emp(empno,ename) values(2222,””);

插入一個姓名叫”的員工
insert into emp(empno,ename) values(2222,”””);

查詢所有員工信息,使用%或%%
select * from emp;
select * from emp where ename like ‘%’;
select * from emp where ename like ‘%_%’;

查詢佣金爲null的員工
select * from emp where comm is null;
注意:null不能參數=運算
null能參數number/date/varchar2類型運算

查詢佣金爲非null的員工
select * from emp where comm is not null;

查詢無佣金且工資大於1500的員工
select *
from emp
where (comm is null) and (sal>1500);

查詢工資是1500或3000或5000的員工
select *
from emp
where sal in (4000,10000,1500,3,300,3000,5000);

查詢職位是”MANAGER”或職位不是”ANALYST”的員工(方式一,使用!=或<>)
select *
from emp
where (job=’MANAGER’) or (job<>’ANALYST’);

查詢職位是”MANAGER”或職位不是”ANALYST”的員工(方式二,使用not)
select *
from emp
where (job=’MANAGER’) or (not(job=’ANALYST’));

————————————————————————————-order by

查詢員工信息(編號,姓名,月薪,年薪),按月薪升序排序,默認升序,如果月薪相同,按oracle內置的校驗規則排序
select empno,ename,sal,sal*12
from emp
order by sal asc;

查詢員工信息(編號,姓名,月薪,年薪),按月薪降序排序
select empno,ename,sal,sal*12
from emp
order by sal desc;

查詢員工信息,按入職日期降序排序,使用列名
select empno,ename,sal,hiredate,sal*12 “年薪”
from emp
order by hiredate desc;

order by後面可以跟列名、別名、表達式、列號(從1開始,在select子句中的列號)
列名:
select empno,ename,sal,hiredate,sal*12 “年薪”
from emp
order by hiredate desc;

別名:
select empno,ename,sal,hiredate,sal*12 “年薪”
from emp
order by “年薪” desc;

表達式:
select empno,ename,sal,hiredate,sal*12 “年薪”
from emp
order by sal*12 desc;

列號,從1開始:
select empno,ename,sal,hiredate,sal*12 “年薪”
from emp
order by 5 desc;

查詢員工信息,按佣金升序或降序排列,null值看成最大值
select * from emp order by comm desc;

查詢員工信息,對有佣金的員工,按佣金降序排列,當order by 和 where 同時出現時,order by 在最後
select *
from emp
where comm is not null
order by comm desc;

查詢員工信息,按工資降序排列,相同工資的員工再按入職時間降序排列
select *
from emp
order by sal desc,hiredate desc;

select *
from emp
order by sal desc,hiredate asc;
注意:只有當sal相同的情況下,hiredate排序纔有作用

查詢20號部門,且工資大於1500,按入職時間降序排列
select *
from emp
where (deptno=20) and (sal>1500)
order by hiredate desc;

select * from emp where deptno in (10,20,30,50,’a’);

————————————————————————————-單行函數

單行函數:只有一個參數輸入,只有一個結果輸出
多行函數或分組函數:可有多個參數輸入,只有一個結果輸出

測試lower/upper/initcap函數,使用dual啞表
select lower(‘www.BAIdu.COM’) from dual;
select upper(‘www.BAIdu.COM’) from dual;
select initcap(‘www.BAIdu.COM’) from dual;

測試concat/substr函數,從1開始,表示字符,不論中英文
select concat(‘hello’,’你好’) from dual;正確
select concat(‘hello’,’你好’,’世界’) from dual;錯誤
select ‘hello’ || ‘你好’ || ‘世界’ from dual;正確
select concat(‘hello’,concat(‘你好’,’世界’)) from dual;正確
select substr(‘hello你好’,5,3) from dual;
5表示從第幾個字符開始算,第一個字符爲1,中英文統一處理
3表示連續取幾個字符

測試length/lengthb函數,編碼方式爲UTF8/GBK(趙君),一箇中文佔3/2個字節長度,一個英文一個字節
select length(‘hello你好’) from dual;
select lengthb(‘hello你好’) from dual;

測試instr/lpad/rpad函數,從左向右找第一次出現的位置,從1開始
select instr(‘helloworld’,’o’) from dual;
注意:找不到返回0
大小寫敏感
select LPAD(‘hello’,10,’#’) from dual;
select RPAD(‘hello’,10,’#’) from dual;

測試trim/replace函數
select trim(’ ’ from ’ he ll ‘) from dual;
select replace(‘hello’,’l’,’L’) from dual;

測試round/trunc/mod函數作用於數值型
select round(3.1415,3) from dual;
select trunc(3.1415,3) from dual;
select mod(10,3) from dual;

當前日期:sysdate = 26-4月-15

測試round作用於日期型(month)
select round(sysdate,’month’) from dual;

測試round作用於日期型(year)
select round(sysdate,’year’) from dual;

測試trunc作用於日期型(month)
select trunc(sysdate,’month’) from dual;

測試trunc作用於日期型(year)
select trunc(sysdate,’year’) from dual;

顯示昨天,今天,明天的日期,日期類型 +- 數值 = 日期類型
select sysdate-1 “昨天”,sysdate “今天”,sysdate+1 “明天” from dual;

以年和月形式顯示員工近似工齡,日期-日期=數值,假設:一年以365天計算,一月以30天計算
select ename as ,round(sysdate-hiredate,0)/365 as “天數” from scott.emp;

使用months_between函數,精確計算到年底還有多少個月
select months_between(‘31-12月-15’,sysdate) from dual;

使用months_between函數,以精確月形式顯示員工工齡
select ename “姓名”,months_between(sysdate,hiredate) “精確月工齡” from scott.emp;

測試add_months函數,下個月今天是多少號
select add_months(sysdate,1) from dual;

測試add_months函數,上個月今天是多少號
select add_months(sysdate,-1) from dual;

測試next_day函數,從今天開始算,下一個星期三是多少號【中文平臺】
select next_day(sysdate,’星期三’) from dual;

測試next_day函數,從今天開始算,下下一個星期三是多少號【中文平臺】
select next_day(next_day(sysdate,’星期三’),’星期三’) from dual;

測試next_day函數,從今天開始算,下一個星期三的下一個星期日是多少號【中文平臺】
select next_day(next_day(sysdate,’星期三’),’星期日’) from dual;

測試last_day函數,本月最後一天是多少號
select last_day(sysdate) from dual;

測試last_day函數,本月倒數第二天是多少號
select last_day(sysdate)-1 from dual;

測試last_day函數,下一個月最後一天是多少號
select last_day(add_months(sysdate,1)) from dual;

測試last_day函數,上一個月最後一天是多少號
select last_day(add_months(sysdate,-1)) from dual;

注意:
1)日期-日期=天數
2)日期+-天數=日期

————————————————————————————-三大類型轉換

oracle中三大類型與隱式數據類型轉換
(1)varchar2變長/char定長–>number,例如:’123’->123
(2)varchar2/char–>date,例如:’25-4月-15’->’25-4月-15’
(3)number—->varchar2/char,例如:123->’123’
(4)date——>varchar2/char,例如:’25-4月-15’->’25-4月-15’

oracle如何隱式轉換:
1)=號二邊的類型是否相同
2)如果=號二邊的類型不同,嘗試的去做轉換
3)在轉換時,要確保合法合理,否則轉換會失敗,例如:12月不會有32天,一年中不會有13月

查詢1980年12月17日入職的員工(方式一:日期隱示式轉換)
select * from emp where hiredate = ‘17-12月-80’;

使用to_char(日期,’格”常量”式’)函數將日期轉成字符串,顯示如下格式:2015 年 04 月 25 日 星期六
select to_char(sysdate,’yyyy” 年 “mm” 月 “dd” 日 “day’) from dual;

使用to_char(日期,’格式’)函數將日期轉成字符串,顯示如格式:2015-04-25今天是星期六 15:15:15
select to_char(sysdate,’yyyy-mm-dd”今天是”day hh24:mi:ss’) from dual;

select to_char(sysdate,’yyyy-mm-dd”今天是”day HH12:MI:SS AM’) from dual;

使用to_char(數值,’格式’)函數將數值轉成字符串,顯示如下格式:1,234selecttochar(1234, 9,999’) from dual;

使用to_char(數值,’格式’)函數將數值轉成字符串,顯示如下格式:¥1,234select to_char(1234,’$9,999’) from dual;
select to_char(1234,’L9,999’) from dual;

使用to_date(‘字符串’,’格式’)函數,查詢1980年12月17日入職的員工(方式二:日期顯式轉換)
select * from scott.emp where hiredate = to_date(‘1980年12月17日’,’yyyy”年”mm”月”dd”日”’);

select * from emp where hiredate = to_date(‘1980#12#17’,’yyyy”#”mm”#”dd’);

select * from scott.emp where hiredate = to_date(‘1980-12-17’,’yyyy-mm-dd’);

使用to_number(‘字符串’)函數將字符串‘123’轉成數字123
select to_number(‘123’) from dual;

注意:
select ‘123’ + 123 from dual;246
select ‘123’ || 123 from dual;123123


使用NVL(a,b)通用函數,統計員工年收入,NVL()作用於任何類型,即(number/varchar2/date)
通用函數:參數類型可以是number或varchar2或date類型

使用NVL2(a,b,c)通用函數,如果a不爲NULL,取b值,否則取c值,統計員工年收入

使用NULLIF(a,b)通用函數,在類型一致的情況下,如果a與b相同,返回NULL,否則返回a,比較10和10.0是否相同

使用SQL99標準通用語法中的case表達式,將職位是分析員的,工資+1000;職位是經理的,工資+800;職位是其它的,工資+400
case 字段
when 條件 then 表達式1
when 條件 then 表達式2
else 表達式n
end

使用oracle專用語法中的decode()函數,職位是分析員的,工資+1000;職位是經理的,工資+800;職位是其它的,工資+400
decode(字段,條件1,表達式1,條件2,表達式2,…表達式n)

單引號出現的地方如下:
1)字符串,例如:’hello’
2)日期型,例如:’17-12月-80’
3)to_char/to_date(日期,’YYYY-MM-DD HH24:MI:SS’)

雙引號出現的地方如下:
1)列別名,例如:select ename “姓 名” from emp
2)to_char/to_date(日期,’YYYY”年”MM”月”DD”日” HH24:MI:SS’)

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