1. 程式人生 > >Oracle資料庫——基本使用《上》

Oracle資料庫——基本使用《上》

1、【使用者操作】

--建立表空間
	create tablespace mollen
	datafile 'c:\myorcldb\mollen'
	size 100m
	autoextend on
	next 10m;

--刪除表空間
	drop tablespace mollen;
	
--建立使用者
	create user mollen	--建立使用者
	identified by mollen	--設定密碼
	default tablespace mollen;	--指定表空間
	
--給使用者授權
--connet:連線角色,基本角色
--resource:開發者角色
--dba:超級管理員角色 --給mollen使用者授予dba角色 grant dba to mollen;

2、【表操作】

--建立一個user表
	create table tab_user(
		id number(20),
		uname varchar2(10)
	);
--新增一列
	alter table tab_user add (gender number(1));	
--修改列型別
	alter table tab_user rename column gender to sex;	
--刪除一列
	alter table tab_user drop column
sex; --新增一條資料 insert into tab_user (id,uname) values(1,'小李'); commit; --修改一條記錄 update tab_user set uname = '小馬' where id = 1; commit; -------【刪除表操作】------------ --刪除表中全部記錄 delete from tab_user; --刪除表結構 drop table tab_user; --先刪再建:資料量大效率高 truncate table tab_user; -------------【序列】---------
--預設1開始,依次遞增,用於主鍵賦值 --dual:虛表,補全語法 create sequence s_iuser; select s_iuser.nextval from dual; --新增一條記錄 insert into tab_user(uid,uname) values(s_user.nextval,'小張'); commit;

3、【scott使用者,密碼tiger】

--解鎖scott使用者
	alter user scott account unlock;
--解鎖scoot使用者密碼(可用於密碼重置)
	alter user scott  identified by tiger;

4、【函式】

--字元函式
	select upper('yes') from dual; --YES
	select lower('YES') from dual; --yes

--數值函式
	select round(56.16,-2) from dual; --四捨五入,後面引數表示保留幾位
	select trunc(56.16,-1) from dual; --直接擷取,不再看後面是否大於5
	select mod(10,3) from dual;--求餘數

--日期函式
--查詢emp表中所有員工入職天數
	select sysdate-e.hiredate from emp e;
--查詢明天此刻
	select sysdate+1 from dual;
--查詢出emp表中所有員工入職幾個月
	select months between (sysdate,e.hiredate) from emp e;
--查詢出emp表中所有員工入職幾年
	select months between(sysdate,e.hiredate)/12 from emp e;
--查詢出emp表中所有員工入職幾周
	select round((sysdate-e.hiredate)/7) from emp e;

--轉換函式
--日期轉字串
	select to_char(sysdate,'fm yyyy-mm-dd hh24:mi:ss') from dual;
--字串轉日期
	select to_date('2018-6-7 16:39:50','fm yyyy-mm-dd hh24:mm-ss') from dual;

--通用函式
--算出emp表中所有員工的底薪
--獎金裡面有null值,如果null值和任意數字做算術運算,
	select e.sal*12+nvl(e.comm,0) from emp e;

--多行函式【聚合函式】:作用於多行,返回一個值。
	select count(1) from emp; ---查詢總數量
	select sum(sal) from emp; --工資總和
	select max(sal) from emp; --最低工資
	select avg(sal) from emp; --平均工資

5、【條件表示式】

--條件表示式的通用寫法,mysql和oracle通用
--給emp表中員工起中文名
	select e.ename,
		case e.ename
		when 'SMITH' then '大王'
		when 'ALLEN' then '小王'
		when 'WARD' then '三王'
		--else '無名'
		end
	from emp e;

--判斷emp表中員工工資,如果高於15000顯示高收入,
--8000到15000顯示中等收入
--其餘顯示低收入
	select e.sal,
		case
		when e.sal>3000 then '高收入'
		when e.sal>1500 then '中等收入'
		else '低收入'
		end
	from emp e;

---oracle中除了起別名,都用單引號。
---oracel專用條件表示式  
	select e.ename,
	       decode(e.ename,
	         'SMITH','大王',
	         'ALLEN','小王',
	         'WARD','三王',
	         '無名')"中文名"                                          
	from emp e;

6、【分組查詢】

--分組查詢中,出現再group by後面的原始列,才能出現再select後面
--沒有出現再group by後面的列,想在select後面,必須加上聚合函式
--聚合函式有一個特性,可以把多行記錄變成一個值
--查詢出部門平均工資大於2000的
	select 
	     e.deptno,   --group by 欄位
	     avg(e.sal)  --e.ename 聚合函式
	from
	     emp e
	group by
	      e.deptno
	having 
	      avg(e.sal)>2000;  

--查詢每個部門工資高於800的員工的平均工資
	select 
	      e.deptno,
	      avg(e.sal) asal
	from 
	      emp e
	where 
	      e.sal>800
	group by 
	      e.deptno
	having 
	      avg(e.sal)>2000;
	      

7、【多表查詢的一些概念】

--笛卡兒積
	select 
	      * 
	from 
	      emp e,dept d
	where 
	      e.deptno =d.deptno
--等值連線
	select 
	      * 
	from 
	      emp e,dept d
	where 
	      e.deptno = d.deptno;
--內連線
	select 
	      * 
	from 
	      emp e 
	inner join 
	      dept d 
	on 
	      e.deptno = d.deptno;
--查詢出所有部門,以及部門下的員工資訊(外連線)
	select 
	      * 
	from 
	      emp e 
	right join 
	      dept d
	on 
	      e.deptno = d.deptno;
	      
--查詢所有員工資訊,以及員工所屬部門
	select 
	      * 
	from 
	      emp e  
	left join 
	     dept d 
	on 
	     e.deptno = d.deptno;
	     
--oracle專用外連線
	select 
	     * 
	from
	     emp e,dept d
	where
	     e.deptno(+) =d.deptno;
     
--查詢出員工姓名,員工領導姓名
--自連線:自連線其實就是站在不同的角度把一張表堪稱多張表
	select 
	     e1.ename ,e2.ename
	from 
	     emp e1,emp e2
	where 
	     e1.mgr = e2.empno;

--查詢出員工姓名,員工部門名稱,員工領導姓名,員工領導部門名稱
	select 
		e1.ename,d1.dname,e2.ename,d2.dname
	from
		emp e1,emp e2,dept d1,dept d2
	where
		e1.mgr = e2.empno
	and
		e1.deptno = d1.deptno
	and
		e2.deptno=d2.deptno;

---子查詢
--子查詢返回一個值
--查詢出工資和scott一樣的員工資訊
	select * from emp where sal in
	(select sal from emp where ename = 'SCOTT')

--子查詢返回一個集合
--查詢出工資和10號部門任意員工一樣的員工資訊
	select * from 
		emp 
	where 
		sal 
	in
		(select sal from emp where deptno = 10);

--子查詢返回一張表
--查詢出每個部門最低工資,和最低工資員工姓名,和員工所在部門名稱
--1.先查詢出每個部門最低工資
	select deptno,min(sal) msal from emp group by deptno;

--2.三表聯查,得到最終結果
	select 
	      t.deptno,t.msal,e.ename,d.dname
	from
	      (select deptno,min(sal) msal from emp group by  deptno) t,
	      emp e,
	      dept d
	where 
	      t.deptno = e.deptno
	and
	      t.msal = e.sal
	and
	      e.deptno = d.deptno;
      

8、【oracle中的分頁】

--rownum 行號:當我們做select操作的時候,
--每查詢出一行記錄,就會再該行上加一個行號
--行號從1開始,一次遞增,不能跳著走
--排序操作會影響rownum的順序
	select rownum,e.* from emp e order by e.sal desc;
	
--如果涉及到排序,但是還要使用rownum的話,我們可以再次巢狀查詢
	select rownum , t.* from(
	select rownum,e.*from emp e order by e.sal desc) t;

--emp表工資倒敘排列後,每頁五條記錄,查詢第二頁
--rownnum行號不能寫上大於一個正數。
	select * from 
		(select rownum rn,tt.* from
			(select * from emp order by sal desc) tt 
		where rownum<11) 
	where 
		rn>5;