成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

巧解如何編寫可重用的MySQL查詢

數據庫 MySQL
MySQL查詢在MySQL的應用中是很重要的,MySQL查詢得到廣泛應用,編寫可重用的MySQL查詢對一些初學者來說可能是比較困難的,下面就為大家介紹編寫可重用的MySQL查詢的方法。

導讀:當人們提及可重用的MySQL查詢的時候,立即映入腦海的往往就是存儲過程了。雖然這些存儲過程是編寫可重用代碼不可分割的一部分,但要記住的是,它們只是很少的一部分而已,而非全部。此外,其它可重用代碼包括視圖、內置函數以及用戶定義的函數。在本文中,我們將向讀者詳細介紹如何編寫可重用的MySQL查詢,以令我們的選擇語句可以更好的適用于各種查詢,也可以將MySQL查詢的工作做的更好。

一、關于視圖
  視圖的用途很多,例如簡化復雜的模式及查詢,或者提供安全性等等。視圖提供安全性的一種途徑是對開發者隱藏審計字段。視圖還可通過減少列的數目來提高性能。這個想法是只引用索引字段,而索引字段的搜索速度是非常之快的。實際上,這種想法實現起來很費勁,因為你必須確保不會訪問隱藏列。然而,我們這里主要是利用視圖模擬兩個或更多個表之間的連接,以降低查詢的復雜性。很多時候,要想將數據庫中用戶的概要信息整理成符合第三范式的形式,可能需要多達六次連接操作,例如: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

下面,我們用一個視圖來替換上面的查找過程:

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;

現在,我們可以通過以下簡單的選擇語句來檢索用戶概要信息了:

select *
  from vusers u

  where u.user_id = 100

#p#

二、關于MySQL內置函數
  GROUP_CONCAT()函數可以用來聚集表中的所有行,并返回組成交叉表水平軸的SELECT列表。實際上,這使得將交叉表的選擇語句移植到存儲過程中成為可能。其他的函數,如Count()、Month()和MonthName(),以及過濾語句,如CASE WHEN ELSE,都可以讓我們的代碼更具通用性。

三、建立自己的函數
  如果在MySQL內建的函數中沒有我們所想要的,那么我們不妨自己動手,豐衣足食。 在編寫自己的函數的時候,一定要考慮到該函數的通用性。

  下面是一個示例函數,用來檢查是否指定了強制性的存儲過程參數。這里不允許使用空行或者空白符,所以該函數將進行相應的檢查:

BEGIN
  DECLARE isEmpty TINYINT;

  SET isEmpty = (param_name IS NULL or char_length(trim(param_name)) = 0);

  RETURN isEmpty;

  END


注意,在我們的函數中調用了內建的兩個函數,即char_length()和trim()。現在,我們總能夠將其作為一個通用函數使用了。

  需要提示的是,在我們編寫自己的函數之前,***先在網上搜索一下,看看別人是否已經做過這項工作了,免得重復相同的工作。這時,我們要特別留意那些MySQL函數倉庫站點,如www.mysqludf.org,我們很可能在這里找到所需的函數。

#p#

四、存儲過程
  我們知道,存儲過程能夠起到代碼模塊化和集中化的作用。然而,將SQL代碼放入存儲過程本身并不意味著就能提高通用性或者可重用性。舉例來說,下面的語句將生成一份反映各員工去年獎金總數的報告:

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;

下面我們將其轉變成一個存儲過程:

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;

  現在,其他人或程序就可以方便的使用這個過程了,不過這里有個時間限制,就是只能在明年之前使用。但是,我們為什么要創建這種有限制的東西呢?因為,我們每年都可能需要生成相似的報告,所以下面我們要去掉這個時間限制。

為此,我們將該過程中的硬編碼的日期刪除掉,如下所示:

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;


  作為一名有上進心的開發人員,我們會自問是否可以做得更好呢?客戶程序也許對起始日期和結束日期方面有更高的靈活性要求,比如他們可能要求日期范圍與財政年度一致。從這方面考慮,不管客戶程序是否要求,我們的都必須提供一個起始日期和終止日期參數。 MySQL有一個非常不錯的BETWEEN運算符,可以用來處理某個范圍內的值。

下面我們就將其用于起始日期和終止日期:

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;

五、小結
  在本文中,我們討論了如何利用視圖、內建函數和用戶定義函數以及存儲過程來提高SELECT查詢的通用性和可重用性。為了便于理解,我們還給出了一些實例代碼,以便幫助讀者理解本文講到的內容。根據局部性原理,現在執行的操作,近期內很可能會再次執行該操作,所以提高可重用性是非常有幫助的。希望大家通過這篇文章的閱讀,能夠掌握如何編寫可重用的MySQL查詢的方法,為以后的工作能有所幫助。

【編輯推薦】

  1. MYSQL查詢重復記錄的方法
  2. MySQL查詢分頁的優化
  3. 教您如何設計高效合理的MySQL查詢語句
責任編輯:迎迎 來源: IT168
相關推薦

2024-01-03 08:00:00

Java軟件開發代碼

2018-11-08 15:50:18

前端Javascript重用性

2009-08-16 16:11:05

2010-10-08 15:53:42

2010-09-17 13:45:40

JVM termina

2013-04-15 09:02:43

JavaScriptJS

2009-11-26 14:40:51

無線路由器

2020-06-02 09:06:31

VueTransition前端

2011-07-21 13:24:14

java

2023-11-08 13:55:27

2010-09-26 15:53:25

JVM內存溢出

2009-08-11 09:16:00

2010-09-27 10:20:09

JVMLinux

2010-06-09 09:15:58

JSF 2Ajax組件

2017-09-07 16:20:39

SQL查詢語句查詢優化

2023-11-30 09:36:39

2016-11-30 18:35:03

JavaScript

2024-06-13 10:11:33

WPFCommand命令模式

2013-04-23 09:14:22

可重用云工具Java安全框架云中間件

2013-04-23 09:24:51

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲人人 | 成人一区二区在线 | 久久久天天| 欧美 中文字幕 | 久草免费在线视频 | 超碰最新在线 | 成人精品在线观看 | 伊人精品在线 | 日本激情视频在线播放 | 91精品国产综合久久香蕉922 | 日韩欧美亚洲一区 | h视频免费看 | 日本特黄a级高清免费大片 国产精品久久性 | 一区二区三区国产 | 亚洲毛片| 国产一区亚洲 | 国产免费一区二区三区 | 久久久久久亚洲精品 | 国产精品一区二区电影 | 日韩av一区二区在线观看 | 国产电影一区二区 | heyzo在线| 干干干日日日 | 日韩免费视频一区二区 | 国产精品永久免费视频 | 在线观看av网站 | 天天干成人网 | 亚洲精品永久免费 | 久久大 | 成人av电影免费在线观看 | 范冰冰一级做a爰片久久毛片 | 欧美13videosex性极品 | 婷婷在线视频 | 黑人巨大精品欧美一区二区一视频 | 国产视频一区二区 | 久久在线| 国产精品久久一区二区三区 | 亚洲第一天堂 | 免费国产视频 | 精品久久av | 免费欧美 |