MySQL歷史
- 1979年:TcX公司 Monty Widenius,Unireg
- 1996年:發佈MySQL1.0,Solaris版本,Linux版本
- 1999年:MySQL AB公司,瑞典
- 2003年:MySQL 5.0版本,提供視圖、存儲過程等功能
- 2008年:Sun 收購
- 2009年:Oracle收購sun
- 2009年:Monty成立MariaDB


MySQL系列
MYSQL的特性
- 插件式存儲引擎:也稱爲「表類型」,存儲管理器有多種實現版本,功能和特 性可能均略有差異;用戶可根據須要靈活選擇,Mysql5.5.5開始innoDB引擎是MYSQL默認引擎
• MyISAM ==> Aria
• InnoDB ==> XtraDB
- 單進程,多線程
- 諸多擴展和新特性
- 提供了較多測試組件
- 開源
安裝MYSQL
RPM包安裝MySQL
MySQL程序
- 客戶端程序:
• mysql: 交互式的CLI工具
• mysqldump:備份工具,基於mysql協議向mysqld發起查詢請求,並將查得的所 有數據轉換成insert等寫操做語句保存文本文件中
• mysqladmin:基於mysql協議管理mysqld
• mysqlimport:數據導入工具
- MyISAM存儲引擎的管理工具:
• myisamchk:檢查MyISAM庫
• myisampack:打包MyISAM表,只讀
- 服務器端程序
• mysqld_safe
• mysqld
• mysqld_multi 多實例 ,示例:mysqld_multi --example
- 腳本模式:
• mysql –uUSERNAME -pPASSWORD < /path/somefile.sql
• mysql> source /path/from/somefile.sql
mysql客戶端
- mysql客戶端可用選項:
• -A, --no-auto-rehash 禁止補全
• -u, --user= 用戶名,默認爲root
• -h, --host= 服務器主機,默認爲localhost
• -p, --passowrd= 用戶密碼,建議使用-p,默認爲空密碼
• -P, --port= 服務器端口
• -S, --socket= 指定鏈接socket文件路徑
• -D, --database= 指定默認數據庫
• -C, --compress 啓用壓縮
• -e 「SQL「 執行SQL命令
• -V, --version 顯示版本
• -v --verbose 顯示詳細信息
• --print-defaults 獲取程序默認使用的配置
socket地址
- 服務器監聽的兩種socket地址:
• ip socket: 監聽在tcp的3306端口,支持遠程通訊
• unix sock: 監聽在sock文件上,僅支持本機通訊
• 如:/var/lib/mysql/mysql.sock) 說明:host爲localhost,127.0.0.1時自動使用unix sock
執行命令
- 運行mysql命令:默認空密碼登陸
• mysql>use mysql
• mysql>select user();查看當前用戶
• mysql>SELECT User,Host,Password FROM user;
- 登陸系統:mysql –uroot –p
- 客戶端命令:本地執行
• mysql> help 每一個命令都完整形式和簡寫格式
• mysql> status 或 \s
- 服務端命令:經過mysql協議發往服務器執行並取回結果每一個命令末尾都必須使用命令結束符號,默認爲分號
示例:SELECT VERSION();
服務器端配置
- 服務器端(mysqld):工做特性有多種配置方式
- 一、命令行選項:
- 二、配置文件:類ini格式 集中式的配置,可以爲mysql的各應用程序提供配置信息 [mysqld]
[mysqld_safe]
[mysqld_multi]
[mysql]
[mysqldump]
[server] [client]
格式:parameter = value
說明:_和- 相同
1,ON,TRUE意義相同, 0,OFF,FALSE意義相同
- 配置文件:
後面覆蓋前面的配置文件,順序以下:
• etc/my.cnf Global選項
• /etc/mysql/my.cnf Global選項 • SYSCONFDIR/my.cnf Global選項
• $MYSQL_HOME/my.cnf Server-specific 選項
• --defaults-extra-file=path
• ~/.my.cnf User-specific 選項
通用二進制格式安裝過程
- 二進制格式安裝過程
(1) 準備用戶
• groupadd -r -g 306 mysql
• useradd -r -g 306 -u 306 –d /data/mysql mysql
(2) 準備數據目錄,建議使用邏輯卷
• mkdir /data/mysql
• chown mysql:mysql /data/mysql
(3) 準備二進制程序
• tar xf mariadb-VERSION-linux-x86_64.tar.gz -C /usr/local
• cd /usr/local
• ln -sv mariadb-VERSION mysql
• chown -R root:mysql /usr/local/mysql/
(4) 準備配置文件
• mkdir /etc/mysql/
• cp support-files/my-large.cnf /etc/mysql/my.cnf
[mysqld]中添加三個選項:
• datadir = /data/mysql
• innodb_file_per_table = on
• skip_name_resolve = on 禁止主機名解析,建議使用 (5)建立數據庫文件
• cd /usr/local/mysql/
• ./scripts/mysql_install_db --datadir=/data/mysql --user=mysql (6)準備服務腳本,並啓動服務
• cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
• chkconfig --add mysqld
• service mysqld start
(7)PATH路徑
• echo ‘PATH=/user/local/mysql/bin:$PATH’ > /etc/profile.d/mysql (8)安全初始化
• /user/local/mysql/bin/mysql_secure_installation
源碼編譯安裝mariadb
yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boostdevel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssldevel libevent-devel libaio-devellinux
- 作準備用戶和數據目錄 • useradd –r –s /sbin/nologin –d /data/mysql/ mysql • mkdir /data/mysql • chown mysql.mysql /data/mysql • tar xvf mariadb-10.2.18.tar.gz
- cmake 編譯安裝 cmake的重要特性之一是其獨立於源碼(out-of-source)的編譯功能,即編譯工做能夠在 另外一個指定的目錄中而非源碼目錄中進行,這能夠保證源碼目錄不受任何一次編譯的影 響,所以在同一個源碼樹上能夠進行屢次不一樣的編譯,如針對於不一樣平臺編譯 編譯選項:https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html
cd mariadb-10.2.18/
cmake . \
-DCMAKE_INSTALL_PREFIX=/app/mysql \
-DMYSQL_DATADIR=/data/mysql/ \
-DSYSCONFDIR=/etc \
-DMYSQL_USER=mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
make && make installc++
• 提示:若是出錯,執行rm -f CMakeCache.txt正則表達式
- 準備環境變量
• echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
• . /etc/profile.d/mysql.sh
- 生成數據庫文件
• cd /app/mysql/
• scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql
- 準備配置文件
• cp /app/mysql/support-files/my-huge.cnf /etc/my.cnf
- 準備啓動腳本
• cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld
- 啓動服務
• chkconfig --add mysqld ;service mysqld start
關係型數據庫的常見組件
- 組件
• 數據庫:database
• 表:table
行:row
列:column
• 索引:index
• 視圖:view
• 用戶:user
• 權限:privilege
• 存儲過程:procedure
• 存儲函數:function • 觸發器:trigger
• 事件調度器:event scheduler,任務計劃
SQL語言的興起與語法標準
- 20世紀70年代,IBM開發出SQL,用於DB2
- 1981年,IBM推出SQL/DS數據庫
- 業內標準微軟和Sybase的T-SQL,Oracle的PL/SQL
- SQL做爲關係型數據庫所使用的標準語言,最初是基於IBM的實如今1986年被 批准的。1987年,「國際標準化組織(ISO)」把ANSI(美國國家標準化組織) SQL做爲國際標準。
- SQL:ANSI SQL
SQL-1986, SQL-1989, SQL-1992, SQL-1999, SQL-2003 SQL-2008, SQL-2011
SQL語言規範
- 在數據庫系統中,SQL語句不區分大小寫(建議用大寫)
- SQL語句可單行或多行書寫,以「;」結尾
- 關鍵詞不能跨多行或簡寫
- 用空格和縮進來提升語句的可讀性
- 子句一般位於獨立行,便於編輯,提升可讀性
- 註釋: • SQL標準:
/*註釋內容*/ 多行註釋
-- 註釋內容 單行註釋,注意有空格
• MySQL註釋:
#
- 數據庫的組件(對象): 數據庫、表、索引、視圖、用戶、存儲過程、函數、觸發器、事件調度器等
- 命名規則:
• 必須以字母開頭
• 可包括數字和三個特殊字符(# _ $)
• 不要使用MySQL的保留字
• 同一database(Schema)下的對象不能同名
SQL語句分類
- SQL語句分類:
• DDL: Data Defination Language 數據定義語言
CREATE,DROP,ALTER
• DML: Data Manipulation Language 數據操縱語言
INSERT,DELETE,UPDATE
• DCL:Data Control Language 數據控制語言
GRANT,REVOKE,COMMIT,ROLLBACK
• DQL:Data Query Language 數據查詢語言
SELECT
數據庫操做
- 建立數據庫:
• CREATE DATABASE|SCHEMA [IF NOT EXISTS] 'DB_NAME';
• CHARACTER SET 'character set name'
• COLLATE 'collate name'
- 刪除數據庫
• DROP DATABASE|SCHEMA [IF EXISTS] 'DB_NAME';
- 查看支持全部字符集:SHOW CHARACTER SET;
- 查看支持全部排序規則:SHOW COLLATION;
- 獲取命令使用幫助:
• mysql> HELP KEYWORD;
- 查看數據庫列表:
• mysql> SHOW DATABASES;
表
- 表:二維關係
- 設計表:遵循規範
- 定義:字段,索引
• 字段:字段名,字段數據類型,修飾符
• 約束,索引:應該建立在常常用做查詢條件的字段上
- 建立表:CREATE TABLE
(1) 直接建立
(2) 經過查詢現存表建立;新表會被直接插入查詢而來的數據
• CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)] [table_options] [partition_options] select_statement
(3) 經過複製現存的表的表結構建立,但不復制數據
• CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name { LIKE old_tbl_name | (LIKE old_tbl_name) }
- 注意:
• Storage Engine是指表類型,也即在表建立時指明其使用的存儲引擎,同一 庫中不一樣表可使用不一樣的存儲引擎
• 同一個庫中表建議要使用同一種存儲引擎類型
- CREATE TABLE [IF NOT EXISTS] ‘tbl_name’ (col1 type1 修飾符, col2 type2 修飾符, ...)
- 字段信息
• col type1
• PRIMARY KEY(col1,...)
• INDEX(col1, ...)
• UNIQUE KEY(col1, ...)
- 表選項:
• ENGINE [=] engine_name
SHOW ENGINES;查看支持的engine類型
• ROW_FORMAT [=]
{DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
- 獲取幫助:mysql> HELP CREATE TABLE;
表操做
- 查看全部的引擎:SHOW ENGINES
- 查看錶:SHOW TABLES [FROM db_name]
- 查看錶結構: DESC [db_name.]tb_name
SHOW COLUMNS FROM [db_name.]tb_name
- 刪除表:DROP TABLE [IF EXISTS] tb_name
- 查看錶建立命令:SHOW CREATE TABLE tbl_name
- 查看錶狀態:SHOW TABLE STATUS LIKE 'tbl_name’
- 查看庫中全部表狀態:SHOW TABLE STATUS FROM db_name
數據類型
數據變型

- 一、整型
• tinyint(m) 1個字節 範圍(-128~127)
• smallint(m) 2個字節 範圍(-32768~32767)
• mediumint(m) 3個字節 範圍(-8388608~8388607)
• int(m) 4個字節 範圍(-2147483648~2147483647)
• bigint(m) 8個字節 範圍(+-9.22*10的18次方)
加了unsigned,則最大值翻倍,如:tinyint unsigned的取值範圍爲(0~255) int(m)裏的m是表示SELECT查詢結果集中的顯示寬度,並不影響實際的取值範 圍,規定了MySQL的一些交互工具(例如MySQL命令行客戶端)用來顯示字符 的個數。對於存儲和計算來講,Int(1)和Int(20)是相同的
• BOOL,BOOLEAN:布爾型,是TINYINT(1)的同義詞。zero值被視爲假, 非zero值視爲真
- 二、浮點型(float和double),近似值
• float(m,d) 單精度浮點型 8位精度(4字節) m總個數,d小數位.
• double(m,d) 雙精度浮點型16位精度(8字節) m總個數,d小數位. • 設一個字段定義爲float(6,3),若是插入一個數123.45678,實際數據庫裏存 的是123.457,但總個數還以實際爲準,即6位.
- 三、定點數
• 在數據庫中存放的是精確值,存爲十進制
• decimal(m,d) 參數m<65 是總個數,d<30且 d<m 是小數位
• MySQL5.0和更高版本將數字打包保存到一個二進制字符串中(每4個字節存 9個數字)。例如,decimal(18,9)小數點兩邊將各存儲9個數字,一共使用9個字節:小數點前的數字用4個字節,小數點後的數字用4個字節,小數點自己佔1個字節
• 浮點類型在存儲一樣範圍的值時,一般比decimal使用更少的空間。float使 用4個字節存儲。double佔用8個字節
• 由於須要額外的空間和計算開銷,因此應該儘可能只在對小數進行精確計算時才使用decimal——例如存儲財務數據。但在數據量比較大的時候,能夠考慮使用bigint代替decimal
- 四、字符串(char,varchar,_text)
• char(n) 固定長度,最多255個字符
• varchar(n) 可變長度,最多65535個字符
• tinytext 可變長度,最多255個字符
• text 可變長度,最多65535個字符
• mediumtext 可變長度,最多2的24次方-1個字符
• longtext 可變長度,最多2的32次方-1個字符
• BINARY(M) 固定長度,可存二進制或字符,長度爲0-M字節
• VARBINARY(M) 可變長度,可存二進制或字符,容許長度爲0-M字節
• 內建類型:ENUM枚舉, SET集合
- char和varchar的區別
• 1.char(n) 若存入字符數小於n,則以空格補於其後,查詢之時再將空格去掉,因此char類型存儲的字符串末尾不能有空格,varchar不限於此
• 2.char(n) 固定長度,char(4)無論是存入幾個字符,都將佔用4個字節,varchar是存入的實際字符數+1個字節(n< n>255),因此varchar(4),存入3個字符將 佔用4個字節
• 3.char類型的字符串檢索速度要比varchar類型的快
- varchar和text的區別:
• 1.varchar可指定n,text不能指定,內部存儲varchar是存入的實際字符數+1個字節(n<n>255),text是實際字符數+2個字節。
• 2.text類型不能有默認值
• 3.varchar可直接建立索引,text建立索引要指定前多少個字符。varchar查詢速度快於text
- 5.二進制數據:BLOB
• BLOB和text存儲方式不一樣,TEXT以文本方式存儲,英文存儲區分大小寫,而Blob是以二進制方式存儲,不分大小寫
• BLOB存儲的數據只能總體讀出
• TEXT能夠指定字符集,BLOB不用指定字符集
- 6.日期時間類型
• date 日期 '2008-12-2'
• time 時間 '12:25:36'
• datetime 日期時間 '2008-12-2 22:06:44'
• timestamp 自動存儲記錄修改時間
• YEAR(2), YEAR(4):年份
timestamp字段裏的時間數據會隨其餘字段修改的時候自動刷新,這個數據類型的字段能夠存放這條記錄最後被修改的時間
修飾符
- 全部類型:
• NULL 數據列可包含NULL值
• NOT NULL 數據列不容許包含NULL值
• DEFAULT 默認值
• PRIMARY KEY 主鍵
• UNIQUE KEY 惟一鍵
• CHARACTER SET name 指定一個字符集
- 數值型
• AUTO_INCREMENT 自動遞增,適用於整數類型
• UNSIGNED 無符號
表操做
- DROP TABLE [IF EXISTS] 'tbl_name';
- ALTER TABLE 'tbl_name'
1.字段:
• 添加字段:add ADD col1 data_type [FIRST|AFTER col_name]
• 刪除字段:drop
• 修改字段: alter(默認值),change(字段名),modify(字段屬性)
2.索引:
• 添加索引:add index
• 刪除索引:drop index
- 查看錶上的索引:SHOW INDEXES FROM [db_name.]tbl_name;
- 查看幫助:Help ALTER TABLE
DML語句
- DML: INSERT, DELETE, UPDATE
- INSERT: 一次插入一行或多行數據
- 語法
• 第二種方法sql
INSERT [L OW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
{VALUES | VALUE} ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE ]若是重複更新之
col_name=expr
[, col_name=expr] ... ]shell
- 簡化寫法:
• INSERT tbl_name [(col1,...)] VALUES (val1,...), (val21,...)
• 第二種方法數據庫
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]vim
• 第三種方法centos
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE
col_name=expr
[, col_name=expr] ... ]
UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT}[,col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
- 注意:必定要有限制條件,不然將修改全部行的指定字段
限制條件:
• WHERE
• LIMIT
- Mysql 選項:-U|--safe-updates| --i-am-a-dummy
- DELETE:
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
可先排序再指定刪除的行數
- 注意:必定要有限制條件,不然將清空表中的全部數據 限制條件:
• WHERE
• LIMIT
- TRUNCATE TABLE tbl_name; 清空表
DQL語句
SELECT
[ALL | DISTINCT | DISTINCTROW ]
[SQL_CACHE | SQL_NO_CACHE]
select_expr [, select_expr ...]
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[FOR UPDATE | LOCK IN SHARE MODE]
- 字段顯示可使用別名:
col1 AS alias1, col2 AS alias2, ...
- WHERE子句:指明過濾條件以實現「選擇」的功能:
• 過濾條件:布爾型表達式
• 算術操做符:+, -, *, /, %
• 比較操做符:=,<=>(相等或都爲空), <>, !=(非標準SQL), >, >=, <, <=
• BETWEEN min_num AND max_num
• IN (element1, element2, ...)
• IS NULL
• IS NOT NULL
- DISTINCT 去除重複列
• SELECT DISTINCT gender FROM students;
- LIKE:
• % 任意長度的任意字符
• _ 任意單個字符
- RLIKE:正則表達式,索引失效,不建議使用
- REGEXP:匹配字符串可用正則表達式書寫模式,同上
- 邏輯操做符:
• NOT
• AND
• OR
• XOR
- GROUP:根據指定的條件把查詢結果進行「分組」以用於作「聚合」運算 avg(), max(), min(), count(), sum()
• HAVING: 對分組聚合運算後的結果指定過濾條件
- ORDER BY: 根據指定的字段對查詢結果進行排序
• 升序:ASC
• 降序:DESC
- LIMIT [[offset,]row_count]:對查詢的結果進行輸出行數數量限制
- 對查詢結果中的數據請求施加「鎖」
• FOR UPDATE: 寫鎖,獨佔或排它鎖,只有一個讀和寫
• LOCK IN SHARE MODE: 讀鎖,共享鎖,同時多個讀
示例
• DESC students;
• INSERT INTO students VALUES(1,'tom','m'),(2,'alice','f');
• INSERT INTO students(id,name) VALUES(3,'jack'),(4,'allen');
• SELECT * FROM students WHERE id < 3;
• SELECT * FROM students WHERE gender='m';
• SELECT * FROM students WHERE gender IS NULL;
• SELECT * FROM students WHERE gender IS NOT NULL;
• SELECT * FROM students ORDER BY name DESC LIMIT 2;
• SELECT * FROM students ORDER BY name DESC LIMIT 1,2;
• SELECT * FROM students WHERE id >=2 and id <=4
• SELECT * FROM students WHERE BETWEEN 2 AND 4
• SELECT * FROM students WHERE name LIKE ‘t%’
• SELECT * FROM students WHERE name RLIKE '.*[lo].*';
• SELECT id stuid,name as stuname FROM students
SQL JOINS

多表查詢
- 交叉鏈接:笛卡爾乘積
- 內鏈接:
• 等值鏈接:讓表之間的字段以「等值」創建鏈接關係;
• 不等值鏈接
• 天然鏈接:去掉重複列的等值鏈接
• 自鏈接
- 外鏈接:
• 左外鏈接:
FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
• 右外鏈接
FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col
- 子查詢:在查詢語句嵌套着查詢語句,性能較差 基於某語句的查詢結果再次進行的查詢
- 用在WHERE子句中的子查詢
• 用於比較表達式中的子查詢;子查詢僅能返回單個值
SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age) FROM students);
• 用於IN中的子查詢:子查詢應該單鍵查詢並返回一個或多個值從構成列表
SELECT Name,Age FROM students WHERE Age IN (SELECT AgeFROM teachers);
• 用於EXISTS
- 用於FROM子句中的子查詢
• 使用格式:SELECT tb_alias.col1,... FROM (SELECT clause) AS tb_alias WHERE Clause;
示例:
• SELECT s.aage,s.ClassID FROM (SELECT avg(Age) AS aage,ClassID FROM students WHERE ClassID IS NOT NULL GROUP BY ClassID) AS s WHERE s.aage>30;
- 聯合查詢:UNION
• SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;
SELECT語句執行過程


視圖
- 視圖:VIEW,虛表,保存有實表的查詢結果
- 建立方法:
CREATE VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
- 查看視圖定義:SHOW CREATE VIEW view_name
- 刪除視圖:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
- 視圖中的數據事實上存儲於「基表」中,所以,其修改操做也會針對基表實現;其修改操做受基表限制
函數
CREATE [AGGREGATE] FUNCTIONfunction_name(parameter_name
type,[parameter_name type,...])
RETURNS {STRING|INTEGER|REAL}
runtime_body
• 說明: 參數能夠有多個,也能夠沒有參數 必須有且只有一個返回值
自定義函數
- 建立函數 示例:無參UDF
• CREATE FUNCTION simpleFun() RETURNS VARCHAR(20) RETURN "Hello World!」;
- 查看函數列表:
• SHOW FUNCTION STATUS;
- 查看函數定義
• SHOW CREATE FUNCTION function_name
- 刪除UDF:
• DROP FUNCTION function_name
- 調用自定義函數語法:
• SELECT function_name(parameter_value,...)
- 示例:有參數UDF
DELIMITER // CREATE FUNCTION deleteById(uid SMALLINT UNSIGNED) RETURNS VARCHAR(20) BEGIN DELETE FROM students WHERE stuid = uid; RETURN (SELECT COUNT(stuid) FROM students); END// DELIMITER ;
- 自定義函數中定義局部變量語法 DECLARE 變量1[,變量2,... ]變量類型 [DEFAULT 默認值]
- 說明:局部變量的做用範圍是在BEGIN...END程序中,並且定義局部變量語句必須在 BEGIN...END的第一行定義
- 示例:
DELIMITER // CREATE FUNCTION addTwoNumber(x SMALLINT UNSIGNED, Y SMALLINT UNSIGNED) RETURNS SMALLINT BEGIN DECLARE a, b SMALLINT UNSIGNED; SET a = x, b = y; RETURN a+b; END// DELIMITER ;
- 爲變量賦值語法
• SET parameter_name = value[,parameter_name = value...]
• SELECT INTO parameter_name
- 示例:
...
DECLARE x int; SELECT COUNT(id) FROM tdb_name INTO x; RETURN x; END//
存儲過程
- 存儲過程優點
• 存儲過程把常用的SQL語句或業務邏輯封裝起來,預編譯保存在數據庫中,當須要時從數據庫中直接調用,省去了編譯的過程
• 提升了運行速度
• 同時下降網絡數據傳輸量
- 存儲過程與自定義函數的區別
• 存儲過程實現的過程要複雜一些,而函數的針對性較強
• 存儲過程能夠有多個返回值,而自定義函數只有一個返回值
• 存儲過程通常獨立的來執行,而函數每每是做爲其餘SQL語句的一部分來使用
- 存儲過程:存儲過程保存在mysql.proc表中
- 建立存儲過程
CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]]) routime_body proc_parameter : [IN|OUT|INOUT] parameter_name type
• 其中IN表示輸入參數,OUT表示輸出參數,INOUT表示既能夠輸入也能夠輸出;
param_name表示參數名稱;type表示參數的類型
- 查看存儲過程列表
• SHOW PROCEDURE STATUS;
- 查看存儲過程定義
• SHOW CREATE PROCEDURE sp_name
- 調用存儲過程
• CALL sp_name ([ proc_parameter [,proc_parameter ...]])
• CALL sp_name
說明:當無參時,能夠省略"()",當有參數時,不可省略"()」
- 存儲過程修改
• ALTER語句修改存儲過程只能修改存儲過程的註釋等可有可無的東西,不能修改 存儲過程體,因此要修改存儲過程,方法就是刪除重建
- 刪除存儲過程
• DROP PROCEDURE [IF EXISTS] sp_name
存儲過程示例
- 建立無參存儲過程
delimiter // CREATE PROCEDURE showTime() BEGIN SELECT now(); END// delimiter ;
• 運行:CALL showTime;
- 建立含參存儲過程:只有一個IN參數
delimiter // CREATE PROCEDURE selectById(IN uid SMALLINT UNSIGNED) BEGIN SELECT * FROM students WHERE stuid = uid; END// delimiter ;
• 運行:call selectById(2);
- 示例
delimiter // CREATE PROCEDURE dorepeat(n INT) BEGIN SET @i = 0; SET @sum = 0; REPEAT SET @sum = @sum+@i; SET @i = @i + 1; UNTIL @i > n END REPEAT; END// delimiter ;
• 運行CALL dorepeat(100);
• SELECT @sum;
- 建立含參存儲過程:包含IN參數和OUT參數
delimiter // CREATE PROCEDURE deleteById(IN uid SMALLINT UNSIGNED, OUT num SMALLINT UNSIGNED) BEGIN DELETE FROM students WHERE stuid = uid; SELECT row_count() into num; END// delimiter ;
• 運行call deleteById(2,@Line);
• SELECT @Line;
- 說明:建立存儲過程deleteById,包含一個IN參數和一個OUT參數.調用時,傳入刪 除的ID和保存被修改的行數值的用戶變量@Line,select @Line;輸出被影響行數
流程控制
- 存儲過程和函數中可使用流程控制來控制語句的執行
- 流程控制:
• IF:用來進行條件判斷。根據是否知足條件,執行不一樣語句
• CASE:用來進行條件判斷,可實現比IF語句更復雜的條件判斷
• LOOP:重複執行特定的語句,實現一個簡單的循環
• LEAVE:用於跳出循環控制
• ITERATE:跳出本次循環,而後直接進入下一次循環
• REPEAT:有條件控制的循環語句。當知足特定條件時,就會跳出循環語句
• WHILE:有條件控制的循環語句
觸發器
- 觸發器的執行不是由程序調用,也不是由手工啓動,而是由事件來觸發、激活從而實現 執行
- 建立觸發器
CREATE [DEFINER = { user | CURRENT_USER }] TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_body
- 說明:
• trigger_name:觸發器的名稱
• trigger_time:{ BEFORE | AFTER },表示在事件以前或以後觸發
• trigger_event::{ INSERT |UPDATE | DELETE },觸發的具體事件
• tbl_name:該觸發器做用在表名
觸發器示例
CREATE TABLE student_info ( stu_id INT(11) NOT NULL AUTO_INCREMENT, stu_name VARCHAR(255) DEFAULT NULL, PRIMARY KEY (stu_id) ); CREATE TABLE student_count ( student_count INT(11) DEFAULT 0 ); INSERT INTO student_count VALUES(0);
- 示例:建立觸發器,在向學生表INSERT數據時,學生數增長,DELETE學生時,學生數減小
CREATE TRIGGER trigger_student_count_insert AFTER INSERT ON student_info FOR EACH ROW UPDATE student_count SET student_count=student_count+1;
CREATE TRIGGER trigger_student_count_delete AFTER DELETE ON student_info FOR EACH ROW UPDATE student_count SET student_count=student_count-1;
- 查看觸發器
• SHOW TRIGGERS
- 查詢系統表information_schema.triggers的方式指定查詢條件,查看指定的 觸發器信息。
mysql> USE information_schema;
Database changed
mysql> SELECT * FROM triggers WHERE
trigger_name='trigger_student_count_insert';
- 刪除觸發器
• DROP TRIGGER trigger_name;
MySQL用戶和權限管理
- 元數據數據庫:mysql • 系統受權表: • db, host, user columns_priv, tables_priv, procs_priv,proxies_priv
- 用戶帳號:
'USERNAME'@'HOST'
@'HOST':
主機名
IP地址或Network
通配符: % _
示例:172.16.%.%
用戶管理
- 建立用戶:CREATE USER
• CREATE USER 'USERNAME'@'HOST' [IDENTIFIED BY 'password'];
默認權限:USAGE
- 用戶重命名:RENAME USER
• RENAME USER old_user_name TO new_user_name;
- 刪除用戶:
• DROP USER 'USERNAME'@'HOST‘
示例:刪除默認的空用戶
• DROP USER ''@'localhost';
- 修改密碼:
• mysql>SET PASSWORD FOR 'user'@'host' = PASSWORD(‘password');
• mysql>UPDATE mysql.user SET password=PASSWORD('password') WHERE clause;
• 此方法須要執行下面指令才能生效: mysql> FLUSH PRIVILEGES;
#mysqladmin -u root -poldpass password ‘newpass’
- 忘記管理員密碼的解決辦法:
• 啓動mysqld進程時,爲其使用以下選項: --skip-grant-tables --skip-networking
• 使用UPDATE命令修改管理員密碼
• 關閉mysqld進程,移除上述兩個選項,重啓mysqld
權限管理
- 管理類:
• CREATE TEMPORARY TABLES
• CREATE USER
• FILE
• SUPER
• SHOW DATABASES
• RELOAD
• SHUTDOWN • REPLICATION SLAVE
• REPLICATION CLIENT
• LOCK TABLES
• PROCESS
- 程序類: FUNCTION、PROCEDURE、TRIGGER
• CREATE
• ALTER
• DROP
• EXCUTE
- 庫和表級別:DATABASE、TABLE
• ALTER
• CREATE
• CREATE VIEW
• DROP
• INDEX
• SHOW VIEW
• GRANT OPTION:能將本身得到的權限轉贈給其餘用戶
- 數據操做:
• SELECT
• INSERT
• DELETE
• UPDATE
- 字段級別:
• SELECT(col1,col2,...) • UPDATE(col1,col2,...)
• INSERT(col1,col2,...)
- 全部權限:ALL PRIVILEGES 或 ALL
受權
- 參考:https://dev.mysql.com/doc/refman/5.7/en/grant.html
- GRANT priv_type [(column_list)],... ON [object_type] priv_level TO 'user'@'host' [IDENTIFIED BY 'password'] [WITH GRANT OPTION]; • priv_type: ALL [PRIVILEGES]
• object_type:TABLE | FUNCTION | PROCEDURE
• priv_level: *(全部庫) | *.* | db_name.* |db_name.tbl_name | tbl_name(當前庫 的表) | db_name.routine_name(指定庫的函數,存儲過程,觸發器)
• with_option: GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
• 示例:GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO'someuser'@'somehost‘;
- 回收受權:REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ...
示例:
• REVOKE DELETE ON testdb.* FROM 'testuser'@‘172.16.0.%’;
- 查看指定用戶得到的受權:
• Help SHOW GRANTS
• SHOW GRANTS FOR 'user'@'host';
• SHOW GRANTS FOR CURRENT_USER[()];
- 注意:MariaDB服務進程啓動時會讀取mysql庫中全部受權表至內存
(1) GRANT或REVOKE等執行權限操做會保存於系統表中,MariaDB的服務進程一般會自動重讀受權表,使之生效
(2) 對於不可以或不能及時重讀受權表的命令,可手動讓MariaDB的服務進程重讀受權表:mysql> FLUSH PRIVILEGES;
MySQL體系結構

存儲引擎

Notes:
-
Implemented in the server, rather than in the storage engine.
-
Compressed MyISAM tables are supported only when using the compressed row format. Tables using the compressed row format with MyISAM are read only.
-
Implemented in the server via encryption functions. Data-at-rest tablespace encryption is available in MySQL 5.7 and later.
-
Support for foreign keys is available in MySQL Cluster NDB 7.3 and later.
-
InnoDB support for FULLTEXT indexes is available in MySQL 5.6 and later.
-
InnoDB support for geospatial indexing is available in MySQL 5.7 and later.
-
InnoDB utilizes hash indexes internally for its Adaptive Hash Index feature.
-
See the discussion later in this section.
存儲引擎
- MyISAM引擎特色:
• 不支持事務
• 表級鎖定
• 讀寫相互阻塞,寫入不能讀,讀時不能寫
• 只緩存索引
• 不支持外鍵約束
• 不支持聚簇索引
• 讀取數據較快,佔用資源較少
• 不支持MVCC(多版本併發控制機制)高併發
• 崩潰恢復性較差
• MySQL5.5.5前默認的數據庫引擎
- MyISAM存儲引擎適用場景
只讀(或者寫較少)、表較小(能夠接受長時間進行修復操做)
- MyISAM引擎文件
• tbl_name.frm 表格式定義
• tbl_name.MYD 數據文件
• tbl_name.MYI 索引文件
- InnoDB引擎特色
• 行級鎖
• 支持事務,適合處理大量短時間事務
• 讀寫阻塞與事務隔離級別相關
• 可緩存數據和索引
• 支持聚簇索引
• 崩潰恢復性更好
• 支持MVCC高併發
• 從MySQL5.5後支持全文索引
• 從MySQL5.5.5開始爲默認的數據庫引擎
- InnoDB數據庫文件
• 全部InnoDB表的數據和索引放置於同一個表空間中
表空間文件:datadir定義的目錄下
數據文件:ibddata1, ibddata2, ...
•每一個表單獨使用一個表空間存儲表的數據和索引
啓用:innodb_file_per_table=ON
參看:https://mariadb.com/kb/en/library/xtradbinnodb-serversystem-variables/#innodb_file_per_table
ON (>= MariaDB 5.5)
兩類文件放在數據庫獨立目錄中
數據文件(存儲數據和索引):tb_name.ibd
表格式定義:tb_name.frm
其它存儲引擎
- Performance_Schema:Performance_Schema數據庫使用
- Memory :將全部數據存儲在RAM中,以便在須要快速查找參考和其餘相似數據的環境中進行快速訪問。適用存放臨時數據。引擎之前被稱爲HEAP引擎
- MRG_MyISAM:使MySQLDBA或開發人員可以對一系列相同的MyISAM表進行邏輯分組,並將它們做爲一個對象引用。適用於VLDB(Very Large DataBase)環境,如數據倉庫
- Archive :爲存儲和檢索大量不多參考的存檔或安全審覈信息,只支持 SELECT和INSERT操做;支持行級鎖和專用緩存區
- Federated聯合:用於訪問其它遠程MySQL服務器一個代理,它經過建立一個到遠程MySQL服務器的客戶端鏈接,並將查詢傳輸到遠程服務器執行,然後完成數據存取,提供連接單獨MySQL服務器的能力,以便從多個物理服務 器建立一個邏輯數據庫。很是適合分佈式或數據集市環境
- BDB:可替代InnoDB的事務引擎,支持COMMIT、ROLLBACK和其餘事務特性
- Cluster/NDB:MySQL的簇式數據庫引擎,尤爲適合於具備高性能查找要求的 應用程序,這類查找需求還要求具備最高的正常工做時間和可用性
- CSV:CSV存儲引擎使用逗號分隔值格式將數據存儲在文本文件中。可使用 CSV引擎以CSV格式導入和導出其餘軟件和應用程序之間的數據交換
- BLACKHOLE :黑洞存儲引擎接受但不存儲數據,檢索老是返回一個空集。該功 能可用於分佈式數據庫設計,數據自動複製,但不是本地存儲
- example:「stub」引擎,它什麼都不作。可使用此引擎建立表,但不能將數 據存儲在其中或從中檢索。目的是做爲例子來講明如何開始編寫新的存儲引擎
- MariaDB支持的其它存儲引擎:
• OQGraph
• SphinxSE
• TokuDB
• Cassandra
• CONNECT
• SQUENCE
管理存儲引擎
- 查看mysql支持的存儲引擎 • show engines;
- 查看當前默認的存儲引擎 • show variables like '%storage_engine%';
- 設置默認的存儲引擎
vim /etc/my.conf
[mysqld]
default_storage_engine= InnoDB
- 查看庫中全部表使用的存儲引擎
• show table status from db_name;
- 查看庫中指定表的存儲引擎
• show table status like ' tb_name ';
• show create table tb_name;
- 設置表的存儲引擎:
• CREATE TABLE tb_name(... ) ENGINE=InnoDB;
• ALTER TABLE tb_name ENGINE=InnoDB;
MySQL中的系統數據庫
- mysql數據庫 是mysql的核心數據庫,相似於SqlServer中的master庫,主要負責存儲數據庫的用戶、權限設置、關鍵字等mysql本身須要使用的控制和管理信息
- performance_schema數據庫 MySQL 5.5開始新增的數據庫,主要用於收集數據庫服務器性能參數,庫裏表的存儲引擎均爲PERFORMANCE_SCHEMA,用戶不能建立存儲引擎爲PERFORMANCE_SCHEMA的表
- information_schema數據庫 MySQL 5.0以後產生的,一個虛擬數據庫,物理上並不存在information_schema數據庫相似與「數據字典」,提供了訪問數據庫元數據的 方式,即數據的數據。好比數據庫名或表名,列類型,訪問權限(更加細化的 訪問方式)
服務器配置
https://dev.mysql.com/doc/refman/5.7/en/mysqld-optiontables.html https://mariadb.com/kb/en/library/full-list-of-mariadb-optionssystem-and-status-variables/
- 注意:其中有些參數支持運行時修改,會當即生效;有些參數不支持,且 只能經過修改配置文件,並重啓服務器程序生效;有些參數做用域是全局 的,且不可改變;有些能夠爲每一個用戶提供單獨(會話)的設置
- 獲取mysqld的可用選項列表:
- 設置服務器選項方法:
在命令行中設置
• shell> ./mysqld_safe --skip-name-resolve=1
在配置文件my.cnf中設置
• skip_name_resolve=1
- 服務器系統變量:分全局和會話兩種
- 獲取系統變量
mysql> SHOW GLOBAL VARIABLES; mysql> SHOW [SESSION] VARIABLES; mysql> SELECT @@VARIABLES;
- 修改服務器變量的值:
• mysql> help SET
- 修改全局變量:僅對修改後新建立的會話有效;對已經創建的會話無效
mysql> SET GLOBAL system_var_name=value; mysql> SET @@global.system_var_name=value;
mysql> SET [SESSION] system_var_name=value; mysql> SET @@[session.]system_var_name=value;
- 服務器狀態變量:
分全局和會話兩種
- 狀態變量(只讀):用於保存mysqld運行中的統計數據的變量,不可更改
mysql> SHOW GLOBAL STATUS
服務器變量SQL_MODE
- SQL_MODE:對其設置能夠完成一些約束檢查的工做,可分別進行全局的設置或當前會 話的設置,參看:https://mariadb.com/kb/en/library/sql-mode/
- 常見MODE:• NO_AUTO_CREATE_USER禁止GRANT建立密碼爲空的用戶• NO_ZERO_DATE在嚴格模式,不容許使用‘0000-00-00’的時間• ONLY_FULL_GROUP_BY對於GROUP BY聚合操做,若是在SELECT中的列,沒有在GROUP BY中出現,那麼將認爲這個SQL是不合法的• NO_BACKSLASH_ESCAPES反斜槓「\」做爲普通字符而非轉義字符• PIPES_AS_CONCAT將"||"視爲鏈接操做符而非「或運算符」