測試環境: create table bqh6 (xm varchar2(10),bmbh number(2),bmmc varchar2(15),gz int);insert into bqh6 values ('張三',01,'技術支持',3500);insert into bqh6 value ...
測試環境:
create table bqh6 (xm varchar2(10),bmbh number(2),bmmc varchar2(15),gz int);
insert into bqh6 values ('張三',01,'技術支持',3500);
insert into bqh6 values ('李四',02,'研發',4500);
insert into bqh6 values ('王五',03,'外業測繪',5000);
insert into bqh6 values ('小崔',02,'研發',8000);
insert into bqh6 values ('錢六',01,'技術支持',5500);
insert into bqh6 values ('趙二',03,'外業測繪',4500);
select * from bqh6
create table bqh7 (xm varchar2(10),bmbh number(2),bmmc varchar2(15), gwjb varchar2(10));
insert into bqh7 values ('張三',01,'技術支持','C');
insert into bqh7 values ('李四',02,'研發','C');
insert into bqh7 values ('王五',03,'外業測繪','A');
insert into bqh7 values ('小崔',02,'研發','A');
insert into bqh7 values ('錢六',01,'技術支持','A');
insert into bqh7 values ('趙二',03,'外業測繪','B');
select * from bqh7
分組函數:max, min, avg, sum, count
查詢工資最高和最低的人的姓名:
select '最高的:'||xm,gz from bqh6 where gz=(select max(gz)from bqh6) union all
select '最低的:'||xm,gz from bqh6 where gz=(select min(gz)from bqh6)
查詢所有工資低於平均工資的人的信息:
select * from bqh6 where gz< (select avg(gz) from bqh6)
給所有低於平均工資的員工薪水上漲10%:
update bqh6 set gz=gz+(select avg(gz) from bqh6)*0.1 where gz< (select avg(gz) from bqh6);
commit;
select * from bqh6;
groupt by用於對查詢結果分組統計
查詢每個部門的平均工資和最高工資:
select avg(gz),max(gz),bmmc from bqh6 group by bmmc;
having子句用於限制分組結果顯示
查詢平均工資低於5000的部門名稱和它的平均工資:
select bmmc,avg(gz) from bqh6 group by bmmc having avg(gz)<5000
註意:
分組函數(max,min,avg,count)只能出現在選擇列表(select後),having和order by子句中;
如果select語句中同時包含group by,having和order by,他們的順序必須是group by,having和order by (先分組→再抑制結果顯示→最後分組);
在選擇列中如果有列,表達式和分組函數,那麼這些列和表達式必須有一個出現在group by子句中,否則就會報錯。
----------------------------------------------------------------------------------
多表查詢
查詢雇員姓名及工資和所在部門的的崗位級別:
select a.xm,a.gz,b.gwjb from bqh6 a,bqh7 b where a.xm=b.xm
笛卡爾積,原則:多表查詢的條件是至少不能少於表的個數-1
查詢部門編號為10的部門名稱、雇員姓名和工資:
select a.xm,b.bmbh,b.bmmc,a.gz from bqh6 a,bqh7 b where a.xm=b.xm and b.bmbh=2;
查詢雇員姓名、工資以及所在部門名稱並按部門排序
select a.xm,b.bmbh,b.bmmc,a.gz from bqh6 a,bqh7 b where a.xm=b.xm order by b.bmmc
order by 預設升序(asc),降序(desc)
子查詢
.單行子查詢
查詢與張三同一部門的所有雇員姓名:
select a.xm from bqh6 a where a.bmmc=(select bmmc from bqh7 b where b.xm='張三')
多行子查詢
查詢部門編號為3的雇員姓名、部門名稱、工資:
all在多行子查詢的使用:與每一個內容相匹配
查詢工資比部門編號3的所有員工的工資高的雇員姓名、工資和部門名稱:
>ALL:比子查詢中返回的最大的記錄還要大
<ALL:比子查詢中返回的最小的記錄還要小
①select xm,bmmc,gz from bqh6 where gz>all (select max(gz) from bqh6 where bmbh=3)
②select xm,bmmc,gz from bqh6 where gz>(select max(gz) from bqh6 where bmbh=3)
②的效率要高於①,因為①會逐條的對比,而②直接比較結果。
IN在子查詢的使用:用於指定一個子查詢的判斷範圍
查詢部門編號為1的雇員姓名、部門名稱及工資信息。
select * from bqh6 where gz in(select gz from bqh6 where bmbh=1);
any在多行子查詢的使用:與每一個內容相匹配,有三種匹配形式
①=any:功能與IN操作符是完全一樣的
②>any:比子查詢中返回記錄最小的還要大的數據
③<any:比子查詢中返回記錄最大的還要小的數據
FROM子句中使用子查詢一般都是返回多行多列,可以將其當作一張數據表:
查詢出每個部門的編號,名稱,部門人數,平均工資
select a.xm,a.bmbh,a.bmmc,b.部門人數,b.平均工資 from bqh6 a,
(select bmbh bh,count(xm) 部門人數,avg(gz) 平均工資 from bqh6 group by bmbh) b
where a.bmbh=b.bh
註意:
當在from子句中使用子查詢時,該子查詢會被作為一個視圖對待,因此叫做內嵌視圖,當在from子句中使用子查詢時,必須給子查詢指定別名。給列取別名可以使用as,但是給表、視圖、子查詢起別名不可以用as
分頁查詢:ROWNUM為顯示每一條記錄動態自動生成行號。
為顯示每一條記錄動態自動生成行號
查詢結果就會多出一列,rn,表示rownum,行號數,是Orcl分配的。
查詢前條記錄:
查詢前3-6條記錄:
Oracle的分頁是最複雜的,要使用2次子查詢,但效率也是最高的,因為內部使用了2分查找的原理。MySql的分頁是最簡單的,直接一個limit就實現了