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

拆解MySQL的高階使用與概念

數據庫 MySQL
前面我們主要分享了MySQL中的常見知識與使用。這里我們主要分享一下MySQL中的高階使用,主要包括:函數、存儲過程和存儲引擎。

前面我們主要分享了MySQL中的常見知識與使用。這里我們主要分享一下MySQL中的高階使用,主要包括:函數、存儲過程和存儲引擎。

對于MySQL中的基礎知識,可以參見

《與 MySQL 的零距離接觸》

1. 函數

函數可以返回任意類型的值,也可以接收這些類型的參數。

字符函數

函數名稱 描述
CONCAT() 字符連接
CONCAT_WS() 使用指定的分隔符進行字符連接
FORMAT() 數字格式化
LOWER() 轉換成小寫字母
UPPER() 轉換成大寫字母
LEFT() 獲取左側字符
RIGHT() 獲取右側字符
LENGTH() 獲取字符串長度
LTRIM() 刪除前導空格
RTRIM() 刪除后續空格
TRIM() 刪除前導和后續空格
SUBSTRING() 字符串截取
[NOT] LIKE 模式匹配
REPLACE() 字符串替換

函數可以嵌套使用。

% (百分號):代表任意個字符。

_ (下劃線):代表任意一個字符。

  1. # 刪除前導'?'符號 
  2. SELECT TRIM(LEADING '?' FROM '??MySQL???'); 
  3. # 刪除后續'?'符號 
  4. SELECT TRIM(TRAILING '?' FROM '??MySQL???'); 
  5. # 刪除前后'?'符號 
  6. SELECT TRIM(BOTH '?' FROM '??My??SQL???'); 
  7. # 將'?'符號替換成'!'符號 
  8. SELECT REPLACE('??My??SQL???''?''!'); 
  9. # 從中'MySQL'第1個開始,截取2個字符 
  10. SELECT SUBSTRING('MySQL', 1, 2); 
  11. # 從中'MySQL'截取最后1個字符 
  12. SELECT SUBSTRING('MySQL', -1); 
  13. # 從中'MySQL'第2個開始,截取至結尾 
  14. SELECT SUBSTRING('MySQL', 2);  

數值運算符函數

函數名稱 描述
CEIL() 進一取整
DIV 整數除法
FLOOR() 舍一取整
MOD 取余數(取模)
POWER() 冪運算
ROUND() 四舍五入
TRUNCATE() 數字截取

比較運算符函數

函數名稱 描述
[NOT]BETWEEN…AND.. [不]在范圍之內
[NOT]IN() [不]在列出值范圍內
IS[NOT]NULL [不]為空

日期時間函數

函數名稱 描述
NOW() 當前日期和時間
CURDATE() 當前日期
CURTIME() 當前時間
DATE_ADD() 日期變化
DATEDIFF() 日期差值
DATE_FORMAT() 日期格式化

  

  1. # 時間增加1年 
  2. SELECT DATE_ADD('2016-05-28', INTERVAL 365 DAY); 
  3. # 時間減少1年 
  4. SELECT DATE_ADD('2016-05-28', INTERVAL -365 DAY); 
  5. # 時間增加3周 
  6. SELECT DATE_ADD('2016-05-28', INTERVAL 3 WEEK); 
  7. # 日期格式化 
  8. SELECT DATE_FORMAT('2016-05-28''%m/%d/%Y'); 
  9. # 更多時間格式可以前往MySQL官網查看手冊  

信息函數

函數名稱 描述
CONNECTION_ID() 連接ID
DATEBASE() 當前數據庫
LAST_INSERT_ID() 最后插入記錄的ID號
USER() 當前用戶
VERSION() 版本信息

聚合函數

函數名稱 描述
AVG() 平均值
COUNT() 計數
MAX() 最大值
MIN() 最小值
SUM() 求和

加密函數

函數名稱 描述
MD5() 信息摘要算法
PASSWORD() 密碼算法

自定義函數

用戶自定義函數(user-defined function,UDF)是一種對MySQL擴展的途徑,其用法與內置函數相同。UDF是對MySQL擴展的一種途徑。

必要條件

  • 參數:可以有零個或多個
  • 返回值:只能有一個

參數和返回值沒有必然的聯系。

創建自定義函數

  1. CREATE FUNCTION function_name RETURNS {STRING|INTEGER|REAL|DECIMAL} routine_body 

函數體(routine_body)

  • 函數體由合法的SQL語句構成;
  • 函數體可以是簡單的SELECT或INSERT語句;
  • 函數體如果為復合結構則使用BEGIN…END語句;
  • 復合結構可以包含聲明,循環,控制結構。

示例

  1. # 不帶參數 
  2. CREATE FUNCTION f1() RETURNS VARCHAR(30) RETURN DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); 
  3.  
  4. # 帶參數 
  5. CREATE FUNCTION f2(num1 SMALLINT UNSIGNED, num2 SMALLINT UNSIGNED) RETURNS FLOAT(10, 2) UNSIGNED RETURN (num1 + num2) / 2; 
  6.  
  7. # 具有復合結構函數體 
  8. # 可能需要使用DELIMITER命令修改分隔符 
  9. CREATE FUNCTION f3(username VARCHAR(20)) RETURNS INT UNSIGNED  
  10. BEGIN  
  11. INSERT test(username) VALUES(username); 
  12. RETURN LAST_INSERT_ID(); 
  13. END  

2. 存儲過程  

 

存儲過程是SQL語句和控制語句的預編譯集合,以一個名稱存儲作為一個單元處理。可以由用戶調用執行,允許用戶聲明變量以及進行流程控制。存儲過程可以接收輸入類型的參數,也可以接收輸出類型的參數,并可以存在多個返回值。執行效率比單一的SQL語句高。

優點

  • 增強SQL語句的功能和靈活性

在存儲過程中可以寫控制語句具有很強的靈活性,可以完成復雜的判斷及較復雜的運算。

  • 實現較快的執行速度

如果某一操作包含了大量的SQL語句,那么這些SQL語句都將被MySQL引擎執行語法分析、編譯、執行,所以效率相對過低。而存儲過程是預編譯的,當客戶端第一次調用存儲過程時,MySQL的引擎將對它進行語法分析、編譯等操作,然后把這個編譯的結果存儲到內存中,所以說第一次使用的時候效率和以前是相同的。但是以后客戶端再次調用這個存儲過程時,直接從內存中執行,所以說效率比較高,速度比較快。

  • 減少網絡流量

如果通過客戶端每一個單獨發送SQL語句讓服務器來執行,那么通過http協議來提交的數據量相對來說較大。

創建

  1. CREATE [DEFINER = {user|CURRENT_USER}] PROCEDURE sp_name ([proc_parameter[, ...]]) [characteristic ...] routine_body 

proc_parameter :

[IN | OUT | INOUT] param_name type

參數:

IN ,表示該參數的值必須在調用存儲過程時指定。

OUT ,表示該參數值可以被存儲過程改變,并且可以返回。

INOUT ,表示該參數的調用時指定,并且可以被改變和返回。

特性:

COMMENT 注釋

CONTAINS SQL 包含SQL語句,但不包含讀或寫數據的語句。

NO SQL 不包含SQL語句。

READS SQL DATA 包含讀寫數據的語句。

MODIFIES SQL DATA 包含寫數據的語句。

SQL SECURITY {DEFINER | INVOKER} 指明誰有權限來執行。

過程體

  • 過程體由合法的SQL語句構成;
  • 過程體可以是任意SQL語句;

不能通過存儲過程來創建數據表、數據庫。可以通過存儲過程對數據進行增、刪、改、查和多表連接操作。

  • 過程體如果為復合結構則使用BEGIN…END語句;
  • 復合結構中可以包含聲明、循環、控制結構。

調用

  1. CALL sp_name ([parameter[, ...]]) 
  2.  
  3. CALL sp_name[()]  

刪除

  1. DROP PROCEDURE [IF EXISTS] sp_name 

修改

  1. ALTER PROCEDURE sp_name [characteristic ...] COMMENT 'string' 
  2. | {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA} 
  3. | SQL SECURITY {DEFINER | INVOKER}  

存儲過程與自定義函數的區別

  • 存儲過程實現的功能要復雜一些,而函數的針對性更強。
  • 存儲過程可以返回多個值,函數只能有一個返回值。
  • 存儲過程一般獨立執行,函數可以作為其他SQL語句的組成部分來實現。

示例:

  1. # 創建不帶參數的存儲過程 
  2. CREATE PROCEDURE sp1() SELECT VERSION(); 
  3.  
  4. # 創建帶有IN類型參數的存儲過程(users為數據表名) 
  5. # 參數的名字不能和數據表中的記錄名字一樣 
  6. CREATE PROCEDURE removeUserById(IN p_id INT UNSIGNED) 
  7. BEGIN 
  8. DELETE FROM users WHERE id = p_id; 
  9. END 
  10.  
  11. # 創建帶有INOUT類型參數的存儲過程(users為數據表名) 
  12. CREATE PROCEDURE removeUserAndReturnUserNumsById(IN p_id INT UNSIGNED, OUT userNums INT UNSIGNED) 
  13. BEGIN 
  14. DELETE FROM users WHERE id = p_id; 
  15. SELECT COUNT(id) FROM users INTO userNums; 
  16. END 
  17.  
  18. # 創建帶有多個OUT類型參數的存儲過程(users為數據表名) 
  19. CREATE PROCEDURE removeUserAndReturnInfosByAge(IN p_age SMALLINT UNSIGNED, OUT delUser SMALLINT UNSIGNED,  OUT userNums SMALLINT UNSIGNED) 
  20. BEGIN 
  21. DELETE FROM users WHERE age = p_age; 
  22. SELECT ROW_COUNT INTO delUser; 
  23. SELECT COUNT(id) FROM users INTO userNums; 
  24. END  

3. 存儲引擎

MySQL可以將數據以不同的技術存儲在文件(內存)中,這種技術就稱為存儲引擎。

每一種存儲引擎使用不同的存儲機制、索引技巧、鎖定水平,最終提供廣泛且不同的功能。

共享鎖(讀鎖):在同一時間段內,多個用戶可以讀取同一個資源,讀取過程中數據不會發生任何變化。

排他鎖(寫鎖):在任何時候只能有一個用戶寫入資源,當進行寫鎖時會阻塞其他的讀鎖或者寫鎖操作。

  • 鎖顆粒

表鎖:是一種開銷最小的鎖策略。

行鎖:是一種開銷最大的鎖策略。

  • 并發控制

當多個連接記錄進行修改時保證數據的一致性和完整性。

  • 事務

事務用于保證數據庫的完整性。

舉例:用戶銀行轉賬

用戶A 轉賬200元 用戶B

實現步驟:

1)從當前賬戶減掉200元(賬戶余額大于等于200元)。

2)在對方賬戶增加200元。

事務特性:

1)原子性(atomicity)

2)一致性(consistency)

3)隔離性(isolation)

4)持久性(durability)

  • 外鍵

是保證數據一致性的策略。

  • 索引

是對數據表中一列或多列的值進行排序的一種結構。

類型

MySQL主要支持以下幾種引擎類型:

  • MyISAM
  • InnoDB
  • Memory
  • CSV
  • Archive
特點 MyISAM InnoDB Memory Archive
存儲限制 256TB 64TB
事務安全 支持
支持索引 支持 支持 支持  
鎖顆粒 表鎖 行鎖 表鎖 行鎖
數據壓縮 支持 支持
支持外鍵 支持

CSV:實際上是由逗號分隔的數據引擎,在數據庫子目錄為每一個表創建一個 .csv 的文件,這是一種普通的文本文件,每一個數據行占用一個文本行。不支持索引。

BlackHole:黑洞引擎,寫入的數據都會消失,一般用于做數據復制的中繼。

MyISAM:適用于事務的處理不多的情況。

InnoDB:適用于事務處理比較多,需要有外鍵支持的情況。

索引分類:普通索引、唯一索引、全文索引、btree索引、hash索引…

修改存儲引擎

  • 通過修改MySQL配置文件

default-storage-engine=engine_name

  • 通過創建數據表命令實現

CREATE TABLE table_name(...)ENGINE=engine_name

  • 通過修改數據表命令實現

ALTER TABLE table_name ENGINE[=]engine_name

4. 管理工具

  • phpMyAdmin

需要有PHP環境

  • Navicat
  • MySQL Workbench 
責任編輯:龐桂玉 來源: 36大數據
相關推薦

2017-06-15 09:01:24

MySQL拆解高階使用

2023-12-29 08:33:17

2010-06-13 13:50:02

MySQL存儲引擎

2010-05-18 14:21:35

MySQL視圖

2009-09-11 11:16:53

C# Attribut

2021-04-27 07:38:32

分類拆解數據

2010-06-03 09:56:54

MySQL 群集

2025-05-23 10:38:43

2010-05-14 17:44:47

MySQL數據庫

2025-02-14 08:50:00

架構開發軟件

2011-05-03 15:46:58

打印機噴頭EPSON

2020-09-23 16:56:51

Python語言技術

2020-09-23 13:45:07

Python編程語言

2010-09-13 14:34:55

2023-05-06 07:27:47

2010-06-04 10:49:56

MySQL數據庫分區

2025-05-12 00:55:34

2023-03-28 09:58:56

Python變量

2018-12-26 15:15:45

智能制造ICT人工智能

2009-07-15 17:11:31

JDBC的概念
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级片在线观看视频 | 九九热热九九 | 综合久久av| 91精品国产99 | 久草热播| 日韩在线成人 | 97精品国产一区二区三区 | 精品欧美一区二区在线观看视频 | 国产一区二区三区亚洲 | 国产精品久久久 | 午夜影院 | 国产日韩一区二区三免费高清 | 在线看片网站 | 亚洲中午字幕 | 91精品国产777在线观看 | 国产一区二区视频在线 | 国产午夜精品一区二区三区 | 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 欧美一区二区大片 | 国产一区二区在线免费观看 | 国产亚洲欧美在线 | av中文字幕在线观看 | 久久久精品| 99视频久| 久久久女| 91在线视频播放 | 99精品一区二区 | 国产成人午夜精品影院游乐网 | 国产日韩一区二区 | 日本精品久久久久 | 天天操伊人 | 中文字幕一二三区 | 天天干干 | www.日本精品 | 国产乱码精品1区2区3区 | 性高朝久久久久久久3小时 av一区二区三区四区 | 国产成人福利在线观看 | a级毛片免费高清视频 | 日本精品免费在线观看 | 日本成人综合 | 日韩欧美在线一区二区 |