存儲(chǔ)過(guò)程經(jīng)常需要返回多個(gè)結(jié)果集。 Mysql 中直接用 select 即可返回結(jié)果集。而 oracle 則需要使用游標(biāo)來(lái)返回結(jié) 果 集。這一點(diǎn) Mysql 相對(duì)比較方便,如下代碼即可實(shí)現(xiàn)輸出兩個(gè)結(jié)果集:
創(chuàng)新互聯(lián)建站成立與2013年,先為右江等服務(wù)建站,右江等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為右江企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
CREATE PROCEDURE test_proc_multi_select()
BEGIN
select * from testproc;
select * from testproc where id=1;
END;
java 中利用循環(huán),即可獲取結(jié)果集數(shù)據(jù):
con = MConnection.getConn();
String sql = "{call test_proc_multi_select()}";
cs = con.prepareCall(sql);
boolean hadResults = cs.execute();
int i = 0;
while (hadResults) {
System.out.println("result No:----" + (++i));
ResultSet rs = cs.getResultSet();
while (rs != null rs.next()) {
int id1 = rs.getInt(1);
String name1 = rs.getString(2);
System.out.println(id1 + ":" + name1);
}
hadResults = cs.getMoreResults(); // 檢查是否存在更多結(jié)果集
}
通過(guò)group by就可以一次性返回結(jié)果集了
1
select FROM_UNIXTIME(date,'%m.%d'),count(1),sum(money) from tests where date='startTimes' and date='endTimes' group by FROM_UNIXTIME(date,'%m.%d')
你拿這個(gè)去執(zhí)行
select FROM_UNIXTIME(date,'%m.%d'),count(1),sum(money) from tests where date=1469980800 and date=1470585599 group by FROM_UNIXTIME(date,'%m.%d');
這個(gè)返回的結(jié)果就是8月1號(hào)~8月7號(hào)每天的數(shù)據(jù)量及金額
MySQL中的UNION
ALL
而UNION
ALL只是簡(jiǎn)單的將兩個(gè)結(jié)果合并后就返回。這樣,如果返回的兩個(gè)結(jié)果集中有重復(fù)的數(shù)據(jù),那么返回的結(jié)果集就會(huì)包含重復(fù)的數(shù)據(jù)了。
從效率上說(shuō),UNION
ALL
要比UNION快很多,所以,如果可以確認(rèn)合并的兩個(gè)結(jié)果集中不包含重復(fù)的數(shù)據(jù)的話(huà),那么就使用UNION
ALL,如下:
select
*
from
gc_dfys
union
all
select
*
from
ls_jg_dfys
使用Union,則所有返回的行都是唯一的,如同您已經(jīng)對(duì)整個(gè)結(jié)果集合使用了DISTINCT
使用Union
all,則不會(huì)排重,返回所有的行
如果您想使用ORDER
BY或LIMIT子句來(lái)對(duì)全部UNION結(jié)果進(jìn)行分類(lèi)或限制,則應(yīng)對(duì)單個(gè)地SELECT語(yǔ)句加圓括號(hào),并把ORDER
BY或LIMIT放到最后一個(gè)的后面:
(SELECT
a
FROM
tbl_name
WHERE
a=10
AND
B=1)
UNION
(SELECT
a
FROM
tbl_name
WHERE
a=11
AND
B=2)
ORDER
BY
a
LIMIT
10;
麻煩一點(diǎn)也可以這么干:
select
userid
from
(
select
userid
from
testa
union
all
select
userid
from
testb)
as
t
order
by
userid
limit
0,1;
如果你還想group
by,而且還有條件,那么:
select
userid
from
(select
userid
from
testa
union
all
select
userid
from
testb)
t
group
by
userid
having
count(userid)
=
2;
注意:在union的括號(hào)后面必須有個(gè)別名,否則會(huì)報(bào)錯(cuò)
當(dāng)然了,如果當(dāng)union的幾個(gè)表的數(shù)據(jù)量很大時(shí),建議還是采用先導(dǎo)出文本,然后用腳本來(lái)執(zhí)行
因?yàn)榧兇庥胹ql,效率會(huì)比較低,而且它會(huì)寫(xiě)臨時(shí)文件,如果你的磁盤(pán)空間不夠大,就有可能會(huì)出錯(cuò)
Error
writing
file
'/tmp/MYLsivgK'
(Errcode:
28)