MySql學習(四) —— 函數、視圖


注:該MySql系列博客僅為個人學習筆記。

本篇博客主要涉及MySql 函數(數學函數、字符串函數、日期時間函數、流程控制函數等),視圖。

 

一、函數

1. 數學函數

  對於數學函數,若發生錯誤,所有數學函數會返回 NULL

  1.1  abs(x)   返回x的絕對值

  1.2  bin(x)    返回x的二進制數 

  1.3  oct(x)    返回x的八進制數

  1.4  hex(x)   返回x的十六進制數

  1.5  ceiling(x)  返回大於x的最小整數值

  1.6  floor(x)  返回小於x的最大整數值

  1.7  exp(x)   返回e的x次方(e是自然數的底)

  1.8  greatest(x1,x2,x3,...,xn)   返回集合中最大的值

  1.9  least(x1,x2,x3,...,xn)        返回集合中最小的值

  1.10  ln(x)       返回x的自然對數

  1.11  log(x, y)  返回x的以y為底的對數

  1.12  mod(x, y)  返回x/y的模(余數)

  1.13  pi()      返回PI的值(圓周率)

             

 

  1.14  rand()    返回一個隨機浮點值 v ,范圍在 0 到1 之間 (即, 其范圍為 0 ≤ v ≤ 1.0)。若已指定一個整數參數 N ,則它被用作種子值,用來產生重復序列。

            rand(N),隨機數的產生取決於種子,種子不同,產生不同的隨機數,種子相同,不管運行多少次都產生相同的隨機數。所以,除非必要,否則不要設置隨機種子。

                 

            若要在iRj 這個范圍得到一個隨機整數R ,需要用到表達式 FLOOR(i + RAND() * (ji + 1))

              例如, 若要在7 到 12 的范圍(包括7和12)內得到一個隨機整數, 可使用以下語句:SELECT FLOOR(7 + (RAND() * 6));

            

            ORDER BY RAND()同 LIMIT 的結合從一組列中選擇隨機樣本很有用;

            在WHERE語句中,WHERE每執行一次, RAND()就會被再計算一次;

              

  

  1.15  round(x), round(x, y)  返回x的四舍五入的有y位小數的值。若要接保留x值小數點左邊的y 位,可將 y 設為負值。 

                  

  

  1.16  sign(x)  返回x作為-1、 0或1的符號,該符號取決於x的值為負、零或正。

             

  

  1.17  sqrt(x)  返回非負數X 的二次方根

             

 

    1.18  pow(x, y)    返回xy乘方的結果值

  1.19  truncate(x, y)  返回被舍去至小數點后y位的數字x。若y 的值為 0, 則結果不帶有小數點或不帶有小數部分。可以將y設為負數,若要截去(歸零) x小數點左起第y位開始后面所有低位的值。所有數字的舍入方向都接近於零。

               

 

2. 聚合函數(常用於group by從句的select查詢中)

  2.1  avg(expr)  返回expr 的平均值。若找不到匹配的行,則avg()返回 NULL  

  2.2  count(expr)  返回SELECT語句檢索到的行中非NULL值的數目  

  2.3  min(expr)  返回表達式的最小值

  2.4  max(expr) 返回表達式的最大值

  2.5  sum(expr)  返回表達式的和

  2.6  group_concat()  返回帶有來自一個組的連接的非NULL值的字符串結果

      

 

3. 字符串函數

  3.1  ascii(str)  返回值為字符串str 的最左字符的數值。假如str為空字符串,則返回值為 0 。假如str 為NULL,則返回值為 NULL。 ASCII()用於帶有從 0到255的數值的字符。

  3.2  length(str)  返回字符串字節長度

        

  3.3  char_length(str)  返回字符串長度

        

  3.2  bit_length(str)  返回值為二進制的字符串str 長度。

         

  3.3  concat(s1,s2,s3,..,sn)  返回結果為連接參數產生的字符串。如有任何一個參數為NULL ,則返回值為 NULL。

         

  3.4  concat_ws(sep, s1, s2,..,sn)  代表Concat With Separator ,是concat()的特殊形式。第一個參數是其它參數的分隔符。分隔符的位置放在要連接的兩個字符串之間。分隔符可以是一個字符串,也可以是其它參數。如果分隔符為 NULL,則結果為 NULL。函數會忽略任何分隔符參數后的 NULL 值。

        

  3.5  insert(str, x, y, instr)  將字符串str從x位置開始,y個字符長度的子串替換為instr,返回結果。

        

  3.6  find_in_set(str, strList)  strList是由一些被‘,’符號分開的自鏈組成的字符串,返回str在strList中的位置。

        

  3.7  lcase(str) 或 lower(str)   返回小寫字符串

  3.8  ucase(str) 或 upper(str)  返回大寫字符串 

  3.9  left(str, x)  返回str左邊x個字符

  3.10  right(str, x)  返回str右邊x個字符

  3.11  ltrim(str)  去掉str左邊的空格

  3.12  trim(str)   去掉str兩邊的空格

  3.13  rtrim(str)  去掉str右邊的空格

  3.14  position(subStr in str)  返回子串subStr第一次在str中出現的位置

  3.15  repeat(str, x)  返回str重復x的結果

  3.16  reverse(str)  反轉str

  3.17  strcmp(s1, s2)  比較s1和s2

  

4. 日期時間函數

  4.1  curdate() 或 current_date()  返回當前的日期

  4.2  curtime() 或 current_time()   返回當前的時間

  4.3  now() 或 current_timestamp()  返回當前日期和時間值,其格式為 'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS , 具體格式取決於該函數是否用在字符串中或數字語境中。

      

 

  4.4  year(date)  返回日期date的年份

  4.5  month(date)  返回日期date的月份

  4.6  monthname(date)  返回日期date的月份名

  4.7  week(date)  返回date一年中的第幾周

  4.8  day(date) 或 dayofmonth(date)  返回date 對應的該月日期,范圍是從 1到31

  4.9  dayname(date)  返回date對應的工作日名稱

  4.10  dayofweek(date)  返回date (1 = 周日, 2 = 周一, ..., 7 = 周六)對應的工作日索引。

  4.11  dayofyear(date)  返回date 對應的一年中的天數,范圍是從 1到366。

      

  

  4.12  date(date|datetime)  提取日期部分

  4.13  datediff(expr1, expr2)  返回起始時間 expr和結束時間expr2之間的天數。   

      

 

  4.14  date_add(date|datetime, interval expr type)  執行日期運算。 date 用來指定起始時間。 expr 是一個表達式,用來指定從起始日期添加或減去的時間間隔值。 如果想要執行減運算,在expr前加個‘-’即可。 type 為關鍵詞,它指示時間間隔的類型。

  4.15  date_sub(date|datetime, interval expr type)   date_add()執行加運算,date_sub()執行減運算  

          

       

       date_sub() 是date_add的逆過程

       

 

  4.16  date_format(date, format)  根據format 字符串安排date 值的格式。  

           

          

5. 加密函數

  5.1  md5(str)  MD5加密,碰撞性低,不可逆的;若參數為 NULL 則會返回 NULL。例如,返回值可被用作散列關鍵字。

       

  5.2  password(str)  從原文密碼str 計算並返回密碼字符串,當參數為 NULL 時返回 NULL。PASSWORD()函數在MySQL服務器中的鑒定系統使用;你應將它用在你個人的應用程序中。

      

  5.3  sha(str) 或 sha1(str)  SHA1()可以被視為一個密碼更加安全的函數,相當於  MD5()。

       

 

6. 流程控制函數

  6.1  case [value] when [compare-value] then result [when [compare-value] then result]...[else result] end

      

  6.2  if(expr1,expr2,expr3)  如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),則 IF()的返回值為expr2; 否則返回值則為 expr3。IF() 的返回值為數字值或字符串值。

      

  6.3  IFNULL(expr1, expr2)  假如expr1 不為 NULL,則 IFNULL() 的返回值為 expr1; 否則其返回值為 expr2。IFNULL()的返回值是數字或是字符串

        

  6.4  NULLIF(expr1, expr2)  如果expr1 = expr2  成立,那么返回值為NULL,否則返回值為 expr1

       

 

7 系統信息函數

  7.1  user()  或  current_user()  返回當前話路被驗證的用戶名和主機名組合。

      

  7.2  charset(str)  返回字符串自變量的字符集。

       

  7.3  database()  返回使用 utf8 字符集的默認(當前)數據庫名。

       

  7.4  row_count()  ROW_COUNT()返回被前面語句升級的、插入的或刪除的行數。

  7.5  version()  數據庫版本

 

  MySql函數總結:

    1.mysql的函數肯定會影響查詢速度,應該在建表的時候,通過合理的表結構減少函數的使用;例如添加冗余字段等。

    2.如果確實要使用函數,比如時間的格式化,優先放在業務邏輯層處理,而不是sql查詢語句中。

    3.在查詢時使用了函數,最大的一個壞處是,如果你針對某列查詢,該列用上了函數,此列將不再使用索引。

 

 

二、視圖(view)

  在查詢中,我們經常把查詢結果當成臨時表來看,視圖可以看做一張虛擬表,是表通過某種運算得到的一個投影。臨時表的數據不會變,而投影的數據會根據原表的數據變化而變化。

  計算機數據庫中的視圖是一個虛擬表,其內容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。但是,視圖並不在數據庫中以存儲的數據值集形式存在。

   

  1.創建視圖的語法

    create [algorithm = merge|temptable|undefined] view <view_name> as <select 查詢>;

           

    視圖一旦創建完畢,就可以將其當成一張表來看待。

      

 

   2.視圖在某些情況下,也是可以修改的,要求是視圖的數據和表的數據一一對應;一一對應 是指:根據select關系,從表中取出的行,只能計算出視圖中確定的一行;反之,視圖中任意抽一行,能夠根據select關系,反推出表中的確定的一行。

      

      

      

      

 

  3. show create view <view_name>  該語句給出了1個創建給定視圖的CREATE VIEW語句

      

  4. drop view <view_name> [, <view_name>]  能夠刪除1個或多個視圖

    5. 使用create創建表的時候,生成三個文件,frm(表結構,自動定義等),MYD(數據),MYI(索引),可以看到視圖只有一個表結構定義。

      

  6. algorithm   algorithm可取三個值:merge、temptable或undefined。如果沒有algorithm子句,默認算法是undefined(未定義的)。算法會影響MySQL處理視圖的方式。    

      對於一些簡單的視圖,它在發揮作用的過程中,並沒有建立臨時表,而只是把條件存起來,下次來查詢,把條件合並,直接去查基表,建臨時表相比之下開銷較大。

      如果不指定algorithm,則更傾向於使用merge。

      

      algorithm=temptable 適合於較復雜的視圖,比如有聚合函數的視圖等,這種是無法合並條件去基表查詢的,需要生成一張臨時表。

      

 

  視圖總結:

    1.視圖一旦創建完畢,就可以將其當成一張表來看待

    2.視圖可以簡化查詢,對於一些復雜的統計,可以先用視圖生成一個中間結果,再查詢視圖

    3.更加精細的權限控制,例如可以用視圖隱藏掉用戶表的密碼字段,而將其開放給別人

    4.數據量大,分表時可以用視圖將所有表的查詢結果保存到一個視圖中

    5.表的數據變化,會影響到視圖的變化

    6.視圖在某些情況下,也是可以修改的,要求是視圖的數據和表的數據一一對應。所謂的一一對應,必須是通過select關系,視圖能在基表中查出對應的數據,基表也可以在視圖中查詢對應的數據;例如select句中有order by limit 等都是無法一一對應的。

    7.視圖定義服從下述限制:

      SELECT語句不能包含FROM子句中的子查詢。

      SELECT語句不能引用系統或用戶變量。

      SELECT語句不能引用預處理語句參數。

    8.某些視圖是可更新的。也就是說,可以在諸如UPDATE、DELETE或INSERT等語句中使用它們,以更新基表的內容。對於可更新的視圖,在視圖中的行和基表中的行之間必須具有一對一的關系。還有一些特定的其他結構,這類結構會使得視圖不可更新。

      

  9. ALGORITHM(算法)    

    可選的ALGORITHM子句是對標准SQL的MySQL擴展。ALGORITHM可取三個值:MERGE、TEMPTABLE或UNDEFINED。如果沒有ALGORITHM子句,默認算法是UNDEFINED(未定義的)。算法會影響MySQL處理視圖的方式。

    對於MERGE,會將引用視圖的語句的文本與視圖定義合並起來,使得視圖定義的某一部分取代語句的對應部分。

    對於TEMPTABLE,視圖的結果將被置於臨時表中,然后使用它執行語句;建臨時表的開銷有點大。

    對於UNDEFINED,MySQL將選擇所要使用的算法。如果可能,它傾向於MERGE而不是TEMPTABLE,這是因為MERGE通常更有效,而且如果使用了臨時表,視圖是不可更新的

    明確選擇TEMPTABLE的1個原因在於,創建臨時表之后、並在完成語句處理之前,能夠釋放基表上的鎖定。與MERGE算法相比,鎖定釋放的速度更快,這樣,使用視圖的其他客戶端不會被屏蔽過長時間。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM