本篇內(nèi)容主要講解“如何編寫可重用的MySQL查詢”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何編寫可重用的MySQL查詢”吧!
成都創(chuàng)新互聯(lián)公司長期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為東營企業(yè)提供專業(yè)的成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè),東營網(wǎng)站改版等技術(shù)服務(wù)。擁有十年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
廣宗ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
當人們提及可重用的查詢的時候,立即映入腦海的往往就是存儲過程了。雖然這些存儲過程是編寫可重用代碼不可分割的一部分,但要記住的是,它們只是 很少的一部分而已,而非全部。此外,其它可重用代碼包括視圖、內(nèi)置函數(shù)以及用戶定義的函數(shù)。在本文中,我們將向讀者詳細介紹如何組合這些元素,以令我們的 選擇語句可以更好的適用于各種查詢。
一、關(guān)于視圖
視圖的用途很多,例如簡化復(fù)雜的模式及查詢,或者提供安全性等等。 視圖提供安全性的一種途徑是對開發(fā)者隱藏審計字段。視圖還可通過減少列的數(shù)目來提高性能。這個想法是只引用索引字段,而索引字段的搜索速度是非常之快的。 實際上,這種想法實現(xiàn)起來很費勁,因為你必須確保不會訪問隱藏列。然而,我們這里主要是利用視圖模擬兩個或更多個表之間的連接,以降低查詢的復(fù)雜性。很多 時候,要想將數(shù)據(jù)庫中用戶的概要信息整理成符合第三范式的形式,可能需要多達六次連接操作,例如:
1 2 3 4 5 6 7 8 | select * from Users u
inner join UserPhoneNumbers upn on u.user_id = upn.user_id
inner join UserScreenNames usn on u.user_id = usn.user_id
inner join UserAffiliations ua on u.user_id = ua.user_id
inner join Affiliations a on a.affiliation_id = ua.affiliation_id
inner join UserWorkHistory uwh on u.user_id = uwh.user_id
inner join Affiliations wa on uwh.affiliation_id = wa.affiliation_id |
下面,我們用一個視圖來替換上面的查找過程:
1 2 3 4 5 6 7 8 9 | CREATE VIEW `vusers` AS
select *
from Users u
inner join UserPhoneNumbers upn on u.user_id = upn.user_id
inner join UserScreenNames usn on u.user_id = usn.user_id
inner join UserAffiliations ua on u.user_id = ua.user_id
inner join Affiliations a on a.affiliation_id = ua.affiliation_id
inner join UserWorkHistory uwh on u.user_id = uwh.user_id
inner join Affiliations wa on uwh.affiliation_id = wa.affiliation_id; |
現(xiàn)在,我們可以通過以下簡單的選擇語句來檢索用戶概要信息了:
1 2 3 | select * from vusers u where u.user_id = 100 |
二、關(guān)于MySQL內(nèi)置函數(shù)
GROUP_CONCAT()函數(shù)可以用來聚集表中的所有行,并返回組成交叉表水平軸的SELECT列表。實際上,這使得將交叉表的選擇語句移植到存儲 過程中成為可能。其他的函數(shù),如Count()、Month()和MonthName(),以及過濾語句,如CASE WHEN ELSE,都可以讓我們的代碼更具通用性。
三、建立自己的函數(shù)
如果在MySQL內(nèi)建的函數(shù)中沒有我們所想要的,那么我們不妨自己動手,豐衣足食。 在編寫自己的函數(shù)的時候,一定要考慮到該函數(shù)的通用性。
下面是一個示例函數(shù),用來檢查是否指定了強制性的存儲過程參數(shù)。這里不允許使用空行或者空白符,所以該函數(shù)將進行相應(yīng)的檢查:
1 2 3 4 5 | BEGIN
DECLARE isEmpty TINYINT;
SET isEmpty = (param_name IS NULL or char_length(trim(param_name)) = 0);
RETURN isEmpty; END |
注意,在我們的函數(shù)中調(diào)用了內(nèi)建的兩個函數(shù),即char_length()和trim()?,F(xiàn)在,我們總能夠?qū)⑵渥鳛橐粋€通用函數(shù)使用了。
需要提示的是,在我們編寫自己的函數(shù)之前,最好先在網(wǎng)上搜索一下,看看別人是否已經(jīng)做過這項工作了,免得重復(fù)相同的工作。這時,我們要特別留意那些MySQL函數(shù)倉庫站點,如www.mysqludf.org,我們很可能在這里找到所需的函數(shù)。
四、存儲過程
我們知道,存儲過程能夠起到代碼模塊化和集中化的作用。然而,將SQL代碼放入存儲過程本身并不意味著就能提高通用性或者可重用性。舉例來說,下面的語句將生成一份反映各員工去年獎金總數(shù)的報告:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | SELECT e. name ,
e.salary,
COUNT (b.bonus_id) AS 'Total Bonuses' FROM employees e
LEFT OUTER JOIN ( SELECT emp_id, bonus_id FROM bonuses WHERE YEAR (award_date) = 2010) AS b
ON e.id = b.emp_id GROUP BY e.id;
下面我們將其轉(zhuǎn)變成一個存儲過程: CREATE PROCEDURE `p_2010_bonuses_lst`() LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN SELECT e. name ,
e.salary,
COUNT (b.bonus_id) AS 'Total Bonuses' FROM employees e LEFT OUTER JOIN
( SELECT emp_id, bonus_id FROM bonuses WHERE YEAR (award_date) = 2010) AS b
ON e.id = b.emp_id GROUP BY e.id;
END ; |
現(xiàn)在,其他人或程序就可以方便的使用這個過程了,不過這里有個時間限制,就是只能在明年之前使用。但是,我們?yōu)槭裁匆獎?chuàng)建這種有限制的東西呢?因為,我們每年都可能需要生成相似的報告,所以下面我們要去掉這個時間限制。
為此,我們將該過程中的硬編碼的日期刪除掉,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | CREATE PROCEDURE `p_yearly_bonuses_lst`( IN `@ year ` INT ) LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN SELECT e. name ,
e.salary,
COUNT (b.bonus_id) AS 'Total Bonuses' FROM employees e LEFT OUTER JOIN
( SELECT emp_id, bonus_id FROM bonuses WHERE YEAR (award_date) = @ year ) AS b
ON e.id = b.emp_id GROUP BY e.id;
END ; |
作為一名有上進心的開發(fā)人員,我們會自問是否可以做得更好呢?客戶程序也許對起始日期和結(jié)束日期方面有更高的靈活性要求,比如他們可能要求日期范圍與 財政年度一致。從這方面考慮,不管客戶程序是否要求,我們的都必須提供一個起始日期和終止日期參數(shù)。 MySQL有一個非常不錯的BETWEEN運算符,可以用來處理某個范圍內(nèi)的值。
下面我們就將其用于起始日期和終止日期:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | CREATE PROCEDURE `p_bonuses_lst`( IN `@StartDate` DATETIME,
IN `@EndDate` DATETIME ) LANGUAGE SQL NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER BEGIN SELECT e. name ,
e.salary,
COUNT (b.bonus_id) AS 'Total Bonuses' FROM employees e LEFT OUTER JOIN
( SELECT emp_id,
bonus_id
FROM bonuses
WHERE award_date Between @StartDate AND @EndDate) AS b
ON e.id = b.emp_id GROUP BY e.id;
END ; |
五、小結(jié)
在本文中,我們討論了如何利用視圖、內(nèi)建函數(shù)和用戶定義函數(shù)以及存儲過程來提高SELECT查詢的通用性和可重用性。為了便于理解,我們還給出了一些實 例代碼,以便幫助讀者理解本文講到的內(nèi)容。根據(jù)局部性原理,現(xiàn)在執(zhí)行的操作,近期內(nèi)很可能會再次執(zhí)行該操作,所以提高可重用性是非常有幫助的。
到此,相信大家對“如何編寫可重用的MySQL查詢”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
網(wǎng)站欄目:如何編寫可重用的MySQL查詢
URL地址:http://jinyejixie.com/article6/jjieig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、企業(yè)建站、網(wǎng)站策劃、外貿(mào)建站、手機網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)