oracle資料庫的安裝和基礎使用

一、安裝Oracle資料庫

二、創建資料庫

三、資料庫相關概念

四、使用oem管理資料庫

五、SQL語句

=================================================

一、安裝Oracle資料庫

(1)安裝包下載

百度雲盤鏈接:【https://pan.baidu.com/s/1nSH1StEDtcEkWEiGVV0K0g】
提取密碼:8ec3

(2)開始安裝

解壓下載下來的安裝包,解壓完成後,到相應路徑下,找到【setup.exe】,雙擊運行,開始安裝Oracle 11g。

(3)點擊安裝包中的setup.exe,進入Oracle安裝界面首頁

(4)跳過配置安全更新,可以選擇不需要更新,直接下一步。

(5)安裝選項中,選擇「創建和配置資料庫」。

(安裝完資料庫管理軟體後,系統會自動創建一個資料庫實例)

(6) 系統類,直接選擇默認的桌面類就可以了。

(7)典型安裝。#重要步驟

建議只需要將Oracle基目錄自己設置下,目錄路徑不要含有中文或其它的特殊字元。全局資料庫名可以默認,且口令密碼,必須要牢記。密碼輸入時,要盡量符合Oracle的規則:必須是大寫字母加小寫字母加數字,而且必須是8位以上。

(8)先決條件檢查。

安裝程序會檢查軟硬體系統是否滿足安裝此Oracle版本的最低要求。只要都成功,就直接下一步。

(9)概要。

安裝前的一些相關選擇配置信息。可以保存成文件或不保存文件,直接點完成即可。

(10)安裝產品

耐心等待安裝產品過程完成。大約20分鐘左右可以完成。

資料庫管理軟體文件及dbms文件安裝完後,會自動創建安裝一個實例資料庫默認前面的orcl名稱的資料庫。

實例資料庫創建完成了,系統默認是把所有賬戶都鎖定不可用了(除sys和system賬戶可用外),建議點右邊的口令管理,嘗試將一個常用的scott賬戶解鎖並輸入密碼。

設置完成以後可以查看是否設置成功

註:在Oracle系統中,有兩個用戶賬號非常重要,介紹一下:

超級管理員:sys,具有資料庫所有許可權,包括啟動和關閉資料庫。

系統管理員:system,許可權僅次於sys,用於日常資料庫管理操作。

Database Control URL 為 https://localhost:1158/em(OEM資料庫管理系統)

(11)安裝完成

(12)安裝完成後,測試一下

win+R 輸入cmd
sqlplus 用戶名/密碼 as sysdba #as sysdba 表示使用管理員用戶
eg:sqlplus sys/Test1234 as sysdba

顯示進入SQL即代表安裝成功

或者:

在開始菜單裡面--oracle--應用程序開發--sql developer

注意:第一啟動sql developer,需要設置java.exe

例如:D:myOracleproduct11.2.0dbhome_1jdkjrein

如果彈出sql developer窗口,安裝成功.

或者:

在瀏覽器中輸入https://localhost:1158/em #OEM資料庫管理系統

查看是否可以成功登錄

二、創建資料庫

(1)win:開始--所有選項--配置和移植工具--database configuration Assistant(DBCA)

(2)創建資料庫

(3)選擇一般用途

(4)資料庫標識,修改資料庫名

(5)管理選項,默認

(6)資料庫身份確認,使用統一管理口令

(7)資料庫所在位置,默認即可

(8)恢復配置,默認

(9)資料庫內容,可以勾選示例方案

(10)初始化參數,默認

(11)資料庫存儲,默認

(12)創建選項,點擊完成

(13)等待系統自己創建,完成後一樣設置一個Scott的賬號

此時設置完後,點擊退出就可以完成創建了。

注意:安裝中可能會出現的問題

問題一:使用Database Control配置資料庫時,要求在當前Oracle主目錄中配置監聽程序

必須運行Netca以配置監聽程序,然後才能繼續

解決方法:

打開cmd命令輸入:lsnrctl start

打開windows任務管理器——服務——找到OracleListener右擊點擊重新啟動,然後再創建新的資料庫

問題二:ORACLE 11g 創建資料庫時 Enterprise Manager配置失敗的解決辦法 無法打開OEM

解決方法:

在listener.ora中增加對ip地址的偵聽,具體步驟如下

啟動Net Manager,在「監聽程序」--Listener下添加一個地址,主機名寫計算機名字或者ip,埠號還是1521,然後保存

重啟監聽服務

重新配置監聽程序:net configuration--監聽程序配置--重新配置--

檢驗資料庫是否安裝成功:

1.查看伺服器是否啟動

#查看oracle win+r services.msc

2.使用sqlplus登錄資料庫

win+r----cmd----sqlplus sys/Test1234 as sysdba

登錄:

sqlplus 用戶/密碼

注意:

如果用戶是sys,需要加上 as sysdba,格式:sqlplus 用戶/密碼 as sysdba

查看當前數據實例名:

show parameter instance_name;
show parameter db_name;

3.登錄oem數據管理系統

打開瀏覽器---輸入oem網址

注意:

如果用戶名是sys,那麼連接身份選擇sysdba

創建的每一個資料庫都有一個對應的oem網址,不同的oem網址區別在埠號不一樣

如果忘記了oem網址:安裝文件中有保存地址

例如:D:oracleproduct11.2.0dbhome_1install

在這個路徑下,portlist文件和readme文件都可以找到

4.區域網訪問

(1)打開net manager -- 連接資料庫

(2)打開本地的服務命名,點擊左邊的+號

(3)填寫服務名(這個自己定義的)

(4)網路協議:tcp/ip協議

(5)協議設置:填寫要訪問的IP地址

(6)填寫要訪問的資料庫名(服務名)

(7)進行連接測試

(8)測試完成後點擊完成,就會在列表中看到對應的連接

如果是訪問不同的資料庫,在登錄的時候要在後面加上@服務名(資料庫名字)

訪問資料庫格式:sqlplus 用戶名/密碼@服務名

三、資料庫相關概念

1.數據(data)

2.資料庫(database DB)

3.資料庫管理系統(database manager system DBMS)

4.資料庫系統(database system DBS)

5.數據模型

(1)概念模型

實體-聯繫模型(E-R)

(2)邏輯模型

是具體DBMS所支持的數據模型,任何一個DBMS都基於某種邏輯模型

1)層次模型

最早期資料庫使用的數據模型,就是一個「有向樹」。最典型的層次模型是組織結構

2)網狀模型

層次模型的擴展

3)關係模型

二維表

4)面向對象模型

面向對象模型是一種新興的數據模型,它採用面向對象的方法來設計資料庫。面向對象的資料庫存儲對象是以對象為單位,每個對象包含對象的屬性和方法,具有類和繼承等特點。

(3)物理模型

數據在存儲介質上的組織結構,物理和操作系統,計算機的硬體。。有關

每種邏輯模型都會有對應的物理模型進行存儲

6.關係資料庫

數據模型使用關係模型作為邏輯數據模型,目前使用最廣泛的資料庫

關係資料庫的組織結構是:二維表

表(table):也叫做關係,由表明,行,列組成。

在一個資料庫中,表一是唯一。

列(field):也叫做欄位,屬性。

在同一個表中,欄位名不能重複,在不同的表中,欄位名可以重複

在同一列,數據類型相同

行(row):也叫做元組(tuple),記錄(record)。一行代表一條數據,行中的每一個欄位的代表的是對象的屬性。

主鍵:能夠唯一確定一條數據的屬性,只能有一個

候選鍵:如果表格中有多個屬性能夠唯一確定一個元組,這些屬性都叫做候選鍵

外鍵:表中的一個屬性不是當前表的主鍵,是另外一個表的主鍵

7.資料庫設計

(1)需求分析

(2)設計概念模型

E-R圖

(3)設計邏輯模型

關係模型

E-R圖-----關係模型

(4)物理模型

邏輯模型對應的物理模型

(5)資料庫執行

(6)資料庫維護

如何把E-R圖轉換成關係模型:

E-R:

實體:entity

屬性:Attribute

聯繫:relation

關係模型:

二維表

欄位

實體:

實體轉換成關係(table),屬性轉換成欄位(列)

聯繫:

轉換成關係:關係的屬性是與聯繫相連的各個實體的主鍵以及聯繫本身的屬性

一對一(1:1):可以轉換成一個關係,也可以與聯繫相連的任意一端合併。

一對多(1:N):可以轉換成一個關係,也可以與N端的實體合併

多對多(M:N):只能單獨轉換成一個關係

例子:

二維圖:

二維圖:

四、使用oem管理資料庫

1.oem地址:

D:oracleproduct11.2.0dbhome_1install
eadme.txt

localhost:1158/em

注意:

登錄的時候,如果使用sys用戶登錄,連接身份選擇「sysdba」

2.創建表空間

用來存儲資料庫對象(表,用戶,索引。。。)。如果想要正常使用資料庫,一定要創建表空間。

伺服器---表空間(存儲)--創建--表空間名字--添加

文件名:表空間名.dbf

數據文件滿後自動擴展:勾選

繼續--確定

3.創建用戶

表空間創建好以後,只有sys和system用戶可以訪問,一般會創建一些普通用戶來操作資料庫

伺服器--用戶(安全性)--創建

名稱:用戶名

口令:密碼

默認表空間:自己創建的表空間

臨時表空間:temp

狀態:未鎖定

注意:

用戶創建好以後,需要賦予角色(每個角色會有不同的許可權)

給新用戶賦予角色:

一般用戶賦予:connect,resource

角色--編輯列表--移動resource到所選角色--確定

注意:

管理選項不要勾選

每個角色都用對應的許可權:

如何查看角色有哪些許可權:

伺服器--角色--點擊角色查看對應的許可權

給用戶添加單個許可權:

選中用戶--系統許可權--編輯列表--確定

在現實使用中,會創建一個新角色,然後把需要的許可權都添加都新的角色中,然後創建的新用戶知己賦予新的角色

如何創新角色:

伺服器--角色--創建--系統許可權--編輯列表--選擇需要的許可權--確定

4.創建表

方案--表--創建--

5.添加約束

主鍵約束:

不能為空,不能重複

候選鍵約束

不能重複,可以為空

外鍵約束:

外鍵對應的表格一定要存在

外鍵的值來源於關聯表格的主鍵值

刪除外鍵的時候,先要刪除關聯表格中主鍵對應的值

檢查約束:

sex 比如:姓名(『男』或者『女』)

address: (武漢,北京,上海,廣州)

sex in (男』,女)

address in (武漢,北京,上海)

非空:

not null

五、SQL語句

sql(structured query language):結構化查詢語言

1.數據定義語言(DDL)

操作資料庫對象:表,索引。。。

create:創建

alter:添加

drop:刪除

2.數據操縱語言(DML)

操作數據

(1)insert:添加

(2)delete:刪除

(3)update:修改

(4)select:查詢 數據查詢(DQL )

3.數據控制語言(DCL)

操作許可權

grant

revoke

============================================

1.數據定義

[ ]:可選

(1)創建表:

create table 表名(

欄位1 數據類型 [約束],

欄位2 數據類型 [約束],

....

欄位n 數據類型 [約束]

);

create table student(
sid varchar2(10),
sname varchar(10),
ssex varchar2(5),
sage int,
sphone varchar2(12),
primary key(sid),
constraint ck_student_ssex check(ssex in (,))
);
create table course(
cid varchar2(10),
cname varchar2(20),
chour int,
tname varchar2(10),
primary key(cid)
);
create table score(
scid int,
sid varchar2(10),
cid varchar2(10),
grade int,
primary key(scid),
foreign key(sid) references student(sid),
foreign key(cid) references course(cid)
);

創建完成以後查詢表結構:desc 表名

(2)刪除表

drop table 表名;

(3)修改表

alter table 表名 modify 欄位 數據類型 #修改數據類型

alter table 表名 change 舊欄位名 新欄位名 數據類型 [約束]

(4)添加約束

主鍵:

create table 表名(

欄位1 數據類型 [約束],

欄位2 數據類型 [約束],

....

欄位n 數據類型 [約束],

primary key(欄位)

);

候選鍵

create table 表名(

欄位1 數據類型 [約束],

欄位2 數據類型 [約束],

....

欄位n 數據類型 [約束],

unique(欄位)

);

外鍵

create table 表名(

欄位1 數據類型 [約束],

欄位2 數據類型 [約束],

....

欄位n 數據類型 [約束],

foreign key(本表欄位) references 關聯表(主鍵)

);

主鍵:

alter table 表名 add primary key(欄位);

alter table score add primary key(scid);

外鍵:

alter table 表名 add [constraint 外鍵名] foreign key(本表欄位) references 關聯表(主鍵);

alter table score add constraint fK_score_sid foreign key(sid) references student(sid);
alter table score add constraint fK_score_cid foreign key(cid) references course(cid);

(5)刪除約束

主鍵:

alter table 表名 drop primary key;

alter table score drop primary key;

外鍵:

alter table 表名 drop constraint 外鍵名;

alter table score drop constraint fk_score_sid;
alter table score drop constraint fk_score_cid;

(6)添加check約束

create table 表名(

欄位1 數據類型 [約束],

欄位2 數據類型 [約束],

....

欄位n 數據類型 [約束],

constraint 約束名 check(約束內容)

);

alter table 表名 add constraint 約束名 check(約束條件);

alter table student add constraint ck_student_ssex check(ssex in(男,女));
alter table student add (constraint sage check(sage>18 and sage<36));

2.數據操縱

(1)添加:insert

添加所有欄位

insert into 表名 values(值1,值2...);

insert into student values(110,小明,男,12,123456)

添加某些欄位

insert into 表名(欄位1,欄位2...) values(值1,值2...)

insert into student(sid,sname) values(111,小紅);

(2)修改:update

update 表名 set 欄位=值,欄位=值...

update student set ssex=女, sage=15,sphone=11111;

注意:

如果沒有加過濾條件,修改的是表中所有的數據

update student set ssex=男,sage=12,sphone=123456 where sid=110;

(3)刪除:delete

delete from 表名

delete from student

注意:

如果沒有加過濾條件,刪除的表中所有的數據

delete from student where sid=111;

3.數據查詢:select

select 欄位列表

from 表名

where 條件

group by ... having....

order by ...

(1)欄位列表就是要查詢的內容

如果要查詢所有欄位,可以用 *

select * from student;

select sname from student;

可以給欄位列表去別名: 欄位名 [as] 別名

select sname as 姓名,ssex 性別 from student;

(2)from:數據來源

(3)where :查詢條件

查詢條件:

比較

②範圍

③集合

④字元匹配

⑤非空

⑥and or

比較:

>

<

>=

<=

=

<>

查詢年齡大於30歲的

select * from student where sage>30;

範圍:between

between A and B

select * from student where sage between 20 and 30;

集合:in

字元匹配:like

通配符:% _

非空:

is not null

空:

is null

and/or:範圍

20---30

sage>=20 and sage<=30

(4)order by:排序

asc(默認) 升序 1 2 3

desc 降序 3 2 1

(5)group by分組聚合查詢

聚合函數:

count():求總個數

sum():求總和

max():最大值

min():最小值

avg():平均值

having:

對分組查詢後的結果進行過濾

例子:

select * from student;
-- 查詢年齡大於30歲的
select * from student where sage>30;
-- 查詢性別為男的
select * from student where ssex=M;
-- 查詢年齡在20-30之間的
select * from student where sage between 20 and 25;
-- 地址在北京/上海/武漢的人
select * from student where saddress in(北京,上海,武漢);
-- 查詢姓名以金開頭的人
select * from student where sname like 金%;
-- 查詢姓名以文結尾的人
select * from student where sname like %文;
-- 查詢姓名中包含文的人
select * from student where sname like %文%;
-- 年齡不為空的人
select * from student where sage is null;
-- 查詢年齡在20-30之間的
select * from student where sage>=20 and sage<=30;
-- 按年齡排序
select * from student order by sage desc;
-- 在score表中,按課程分類查詢,查每門課程報考的人數
select cid,count(*) from score group by cid;
-- 在score表中,按課程分類查詢,查每門課程的總成績
select cid,sum(grade) from score group by cid;
-- 在score表中,按課程分類查詢,查每門課程的平均成績
select cid,avg(grade) from score group by cid;
-- 在score表中,按課程分類查詢,查每門課程成績最高的人
select cid,max(grade) from score group by cid;
-- 在score表中,按課程分類查詢,查每門課程的平均成績,平均成績要>80
select cid,avg(grade) from score group by cid having avg(grade)>80;

4.多表查詢

(1)內連接

inner join

格式一:

select 欄位

from 表名1 inner join 表名2 on 連接條件

inner join 表3 on 連接條件

格式二:

select 欄位

from 表名1 , 表名2

where 連接條件 and 過濾條件

給表取別名:

表名 [as] 表別名

(2)外連接

左外連接(左連接)

left join

格式:

select 欄位

from 表名1 left join 表名2 on 連接條件

left join 表3 on 連接條件

右外連接(右連接)

right join

格式:

select 欄位

from 表名1 right join 表名2 on 連接條件

right join 表3 on 連接條件

(3)聯合查詢 union

select 語句

union

select 語句

union

select 語句

例子:

--查詢學生的id,姓名,課程名,成績
select a.sid as 學號,a.sname 姓名,c.cname 課程名,b.grade 成績
from student a inner join score b on a.sid=b.sid
inner join course c on c.cid=b.cid;

select a.sid 學號,a.sname 姓名,c.cname 課程名,b.grade 成績
from student a left join score b on a.sid=b.sid
left join course c on c.cid=b.cid
order by a.sname,b.grade
;

--聯合查詢
select * from STUDENT where ssex=M
union
select * from STUDENT where ssex=F;

5.子查詢(嵌套查詢)

一個查詢語句A中嵌套另外一個查詢語句B,查詢語句A叫做父查詢(外層查詢),查詢語句B叫做子查詢(內層查詢).

執行原理:

先執行子查詢,得到查詢結果

再執行父查詢,把子查詢的結果作為父查詢的過濾條件

格式:

select 欄位 from 表名

where 子查詢

(1)in關鍵字的子查詢

(2)帶比較運算符的子查詢

>

<

>=

<=

=

<>

注意:

子查詢結果一定是一個值,如果結果是一個範圍,需要配合any/some/all

any/some:和範圍中的值進行比較,只要有一個成立,返回結果

all:和範圍中的每個值比較,都成立,才返回結果

12>any(11,15,30) 滿足任意條件即可

31>all(11,15,30) 需要滿足所有的條件

(3)exists子查詢

select 欄位 from 表名

where exists 子查詢

原理:

先進行子查詢,如果子查詢有結果,那麼exists子句結果為true,再進行父查詢

如果子查詢沒有結果,那麼exists子句,結果為false,不進行父查詢

子查詢的欄位沒有意義: 只需要知道子查詢能否查出內容,不需要管查的是什麼內容

例子:

select * from student;
--1.帶in關鍵字的子查詢
-- 在學生表中查詢和王五,陳文,張璐在同一個城市的人
--先要查詢王五,陳文.夏曉燕所在城市
select saddress from student where sname=王五 or sname=陳文 or sname=夏曉燕
--學生中和他們在同一個城市的人 學生的地址在子查詢的範圍內
select * from student where saddress in (select saddress from student where sname=王五 or sname=陳文 or sname=夏曉燕);
--2.帶比較運算符的子查詢
-- (1)和王五性別相同的人
-- 子查詢:查詢王五的性別
select ssex from student where sname=王五
--父查詢中:讓學生的性別=王五的性別
select * from student where ssex=(select ssex from student where sname=王五)
--(2)年齡比夏曉燕大的學生
--子查詢:查詢夏曉燕的年齡
select sage from student where sname=夏曉燕
--父查詢:查詢年齡比夏曉燕大的學生
select * from student where sage>(select sage from student where sname=夏曉燕)

--some/any/all
select * from student where sage>all(23,30)
select * from student where sage>any(23,30)

--帶exists的子查詢
--查詢score中的數據,但是score中age值必須在student表中
select * from score where exists (select * from student where student.sage=score.age)

綜合練習:

員工表(emp):
(
empno NUMBER(4)notnull, --員工編號,表示唯一
ename VARCHAR2(10), --員工姓名
job VARCHAR2(9), --員工工作職位
mgr NUMBER(4), --員工上級領導編號
hiredate DATE, --員工入職日期
sal NUMBER(7,2), --員工薪水
comm NUMBER(7,2), --員工獎金
deptno NUMBER(2) —員工部門編號
)

部門表(dept)
(
deptno NUMBER(2),notnull, --部門編號
dname VARCHAR2(14), --部門名稱
loc VARCHAR2(13) --部門地址
)

1.找出獎金高於薪水60%的員工信息。
2.找出部門10中所有經理(MANAGER)和部門20中所有辦事員(CLERK)的詳細資料。
3.統計各部門的薪水總和。
4.找出部門10中所有經理理(MANAGER),和部門20中所有辦事員(CLERK),和既不是經理又不是辦事員但其薪水大於或等2000的所有員工的詳細資料。
5.列出各種工作的最低工資。
6.列出各個部門的MANAGER(經理)的最低薪水。
7.找出收取獎金的員工的不同工作。
8.找出不收取獎金或收取的獎金小於等於300的員工。
9.找出在1981年入職的所有員工。
10.顯示所有員工的姓名,首字母大寫。
11.顯示正好為5個字元的員工的姓名。
12.顯示不帶有「R」的員工姓名。
13.列出 員工編號、員工姓名、管理者姓名、部門名、部門地址,並按照部門名、員工名升序輸出。
14.列出emp表中最低工資小於2000的部門中,job為『CLERK』的員工的部門號、最高工資、最低工資 按部門號降序排列。
15.查詢 部門地址不在DALLAS並且薪水大於部門平均薪水的員工姓名、部門名稱、薪水 按薪水降序排列

參考:

--1.找出獎金高於薪水60%的員工信息。
select * from emp where comm>sal*0.6;

--2.找出部門10中所有經理(MANAGER)和部門20中所有辦事員(CLERK)的詳細資料。
select * from emp where (deptno=10 and job=經理) or (deptno=20 and job=辦事員) order by deptno;

--3.統計各部門的薪水總和。
select deptno, sum(sal) from emp group by deptno;

/*4.
找出部門10中所有經理理(MANAGER),和部門20中所有辦事員(CLERK),
和既不是經理又不是辦事員但其薪水大於或等2000的所有員工的詳細資料。
*/
select * from emp
where (deptno=10 and job=經理)
or (deptno=20 and job=辦事員)
or (job not in(辦事員,經理) and sal>2000)
order by job;

--5.列出各種工作的最低工資。
select job,min(sal) from emp group by job;

--6.列出各個部門的MANAGER(經理)的最低薪水。
--找出每個部門的最低工資,這個人必須是經理
select e.deptno,min(sal)
from emp e
where e.job=經理
group by e.deptno
;

--7.找出收取獎金的員工的不同工作。//有獎金的工作有哪些?
select distinct job from emp where comm is not null;
--查詢出有獎金的員工?
select * from emp where comm is not null and job=員工;

--8.找出不收取獎金或收取的獎金小於等於300的員工。
select * from emp where comm is null or comm<300;

--9.找出在2018年入職的所有員工。
select * from emp where to_char(hiredate,YYYY-MM-DD HH24:MI:SS) like 2018%

select * from emp where hiredate >to_date(2018-01-01 00:00:00,YYYY-MM-DD HH24:MI:SS)
and hiredate < to_date(2019-01-01 00:00:00,YYYY-MM-DD HH24:MI:SS);

--10.顯示所有員工的姓名,首字母大寫。
select upper(ename) from emp;
select lower(ename) from emp;
select initcap(ename) from emp;

--11.顯示正好為5個字元的員工的姓名。
select ename from emp where length(ename) =5;

--12.顯示不帶有「小」的員工姓名。
select ename from emp where ename not like %小%

--13.列出 員工編號、員工姓名、部門名、部門地址,並按照部門名、員工名升序輸出。
select e.empno 員工編號,e.ename 員工姓名,d.dname 部門名,d.loc 部門地址
from emp e left join dept d on e.deptno=d.deptno
order by d.dname,e.ename;

--14.列出emp表中最低工資小於2000的部門中,job為『辦事員』的員工的部門號、最高工資、最低工資 按部門號降序排列。
--先找出最低工資小於2000的部門
select deptno from emp group by deptno having min(sal)<2000
--然後在查詢job為辦事員的員工中找出最高工資、最低工資並且辦事員要在工資小於2000的部門中
select deptno, max(sal),min(sal)
from emp
where job=辦事員 and deptno in(select deptno from emp group by deptno having min(sal)<2000)
group by deptno
order by deptno desc;

--15.查詢 部門地址不在武漢並且薪水大於部門平均薪水的員工姓名、部門名稱、薪水 按薪水降序排列

--查出部門的平均薪水

select e.ename,d.deptno,d.dname,e.sal,d.loc
from emp e left join dept d on e.deptno=d.deptno
where d.loc <>武漢 and sal>(select avg(sal) from emp where emp.deptno=e.deptno group by deptno)

By:談老弟的軟測之路


推薦閱讀:
相關文章