1. 程式人生 > >oracle學習(一)

oracle學習(一)

管理 pass 失敗 emp 你好 spool acc manage 獲取

作為一個入門選手,怕忘記,所以所有東西都盡量寫下來。(省略oracle11g的安裝過程)


一、sqlpuls用sys賬戶登錄

(sqlplus是客戶端連上服務器的一個工具)

1.使用cmd控制臺登錄

sqlplus / as sysdba

技術分享

2.直接使用sqlplus用戶名口令登錄

用戶名sys口令as sysdba(口令在登錄的過程中不會顯示)

3.以sys超級用戶名,dba角色,超級管理員的身份解鎖scott用戶,並為Scott用戶設置一個密碼為123456

解鎖用戶:alter user scott account unlock;

設置密碼:alter user scott identified by 123456;

技術分享

4.普通用戶的登錄

sqlplus username/password

註意:在忘記密碼的情況下可以選擇登錄sys來重新修改密碼。

5.使用tab表來獲取當前用戶下的所有對象

技術分享

顯示emp表結構

技術分享

查詢emp表內容

技術分享

我們發現這個表格顯示有點亂,所以我們可以將每頁顯示的數據條數和列寬都設置一下

column hiredate format a10;(a10代表10個字母的長度,只可以用a來代表字母)

column empno format 9999;(9代表數字,只可以用9表示)

set pagesize 80;(設置每頁的顯示條數為80)調整之後的表格如下圖所示:

技術分享


關於select

使用/杠,執行最近一次的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;(distinct只能用於單字段,而不適用多字段)

查詢員工的編號,姓名,月薪,年薪(月薪*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認為單引號是字符串型或日期型

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

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

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

使用spool命令,保存SQL語句到硬盤文件e:/oracle.sql,並創建sql文件
spool e:/oracle.sql;

使用spool off命令,保存SQL語句到硬盤文件e:/oracle.sql,並創建sql文件,結束語句
spool off;

使用@命令,將硬盤文件e:/crm.sql,讀到orcl實例中,並執行文件中的sql語句
@ e:/crm.sql;

使用--符號,設置單行註釋
--select * from emp;

使用/* */符號,設置多行註釋
/*
select
*
from
emp;
*/

註意:

1.列名不能使用單引號,在oracle中單引號是字符串類型或者日期型;

2.SQLPLUS命令是SQLPLUS工具


關於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‘;

查詢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%‘;

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

select * from emp where ename like ‘S‘;
等價
select * from emp where ename = ‘S‘;

查詢姓名以大寫字母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;(5的意思是第五列也就是年薪列)

查詢員工信息,按傭金升序或降序排列,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‘);

註意:in後面的類型應該是和該字段的類型一樣,如果是數字類型,那括號裏都應該是數字類型或者是能轉換成數字類型的


單行函數

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

測試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
大小寫敏感

hello不足10位在左邊寫#補齊10位,假如第二位為3,截取多余的(L代表在左邊補齊,R代表在右邊補齊)
select LPAD(‘hello‘,10,‘#‘) from dual;
select RPAD(‘hello‘,10,‘#‘) from dual;

測試trim/replace函數
trim第一個參數是需要被去掉的字符,第二個參數是需要被去掉字符的字符串
replace:在hello字符串中凡是出現l的地方全部用L替代(如果沒有找到的話就不替換)
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 = 28-10月-17

測試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 "姓名",round(sysdate-hiredate,0)/365 "天數" from emp;

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

使用months_between函數,以精確月形式顯示員工工齡
select ename "姓名",months_between(sysdate,hiredate) "精確月工齡" from 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;


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,234
select to_char(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 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 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

oracle學習(一)