mysql內錶和外表 內錶查詢用到外表

2021-10-19 16:07:53 字數 2315 閱讀 9041

在 csdn 上看到的乙個例子,很多記錄中以某個欄位為中心最前面的兩條資料

--給個例子參考

--查詢每門課程的前2名成績

create table studentgrade(

stuid char(4),    --學號

subid int,        --課程號

grade int,        --成績

primary key (stuid,subid)

go--表中資料如下

insert into studentgrade(stuid,subid,grade) values('001',1,97);

insert into studentgrade(stuid,subid,grade) values('001',2,50);

insert into studentgrade(stuid,subid,grade) values('001',3,70);

insert into studentgrade(stuid,subid,grade) values('002',1,92);

insert into studentgrade(stuid,subid,grade) values('002',2,80);

insert into studentgrade(stuid,subid,grade) values('002',3,30);

insert into studentgrade(stuid,subid,grade) values('003',1,93);

insert into studentgrade(stuid,subid,grade) values('003',2,95);

insert into studentgrade(stuid,subid,grade) values('003',3,85);

insert into studentgrade(stuid,subid,grade) values('004',1,73);

insert into studentgrade(stuid,subid,grade) values('004',2,78);

insert into studentgrade(stuid,subid,grade) values('004',3,87);

go要查詢每門課程的前2名成績

001 1 97

003 1 93

003 2 95

002 2 80

004 3 87

003 3 85

如何實現?

--檢視資料

select * from studentgrade

--假如出現並列時,也只取兩個同學的話。

--方法一:

select distinct *

from studentgrade as t1

where stuid in

(select top 2 stuid

from studentgrade as t2

where t1.subid=t2.subid

order by t2.grade desc)

order by subid, grade desc

--方法二:

select * from studentgrade a where (select count(1) from studentgrade where subid=a.subid and grade>=a.grade)<=2

--方法三:

select * from studentgrade t

where (select count(1) from studentgrade where subid=t.subid and grade>t.grade)<=1

order by subid,grade desc

--結果

stuid subid       grade

001   1           97

003   1           93

003   2           95

002   2           80

004   3           87

003   3           85

(6 row(s) affected)

共有三種方案,從難易程度上講我傾向於後兩種,從查詢邏輯思想上來講後兩種是一樣的

select * from studentgrade t

where (select count(1) from studentgrade where subid=t.subid and grade>t.grade)<=1

order by subid,grade desc

mysql內錶和外表區別 Hive內錶和外表的區別

本文以例子的形式介紹一下hive內錶和外表的區別。例子共有4個 不帶分割槽的內錶 帶分割槽的內錶 不帶分割槽的外表 帶分割槽的外表。1 不帶分割槽的內錶 建立表 create table innertable id int,name string row format delimited field...

Hive 內錶和外表的區別

原文 1.內部表 create table zz name string age string location input table data 注 hive預設建立的是內部表 此時,會在hdfs上新建乙個zz表的資料存放地 load data inpath input data into tab...

Hive建立內錶和外表的區別

內部表也稱為管理表或臨時表,hive控制著整個表的生命週期,預設存放目錄為 user hive warehouse,當刪除一張表的時候表中的資料也會相應的刪除。缺點 在實際開發中,內部表不方便和其他工作共享資料,hive在設計之初就不允許共享管理表中的資料,那應該如何來實現呢?hive提供了外部表。...