mysql数据对象
學習目標:
什么是數據庫索引: 索引就是數據庫中數據的目錄: 索引和數據時兩個對象 索引主要是用來提高數據庫的查詢效率 數據庫中數據變更同樣需要同步索引數據的變更, 因為索引是按照B+TREE,排好位置的,一旦數據變化,則這個數據的相應位置也要變化, 這樣之后再查找,才能快速索引到,而變化位置就是索引的維護; 查看某個數據庫命令: mysql> help create index Name: 'CREATE INDEX' Description: Syntax: CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name[index_type]ON tbl_name (index_col_name,...)[index_option] .. UNIQUE:唯一索引(用戶表的ID,手機號等,唯一信息) SPATIAL:地理位置索引(搜索周邊有哪些人) 兩種創建索引及查看表中索引的方法 mysql> select * from vc; +------+------+ | v | c | +------+------+ | AB | AB | +------+------+ 1 row in set (0.00 sec)mysql> create index idx_v on vc(v); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0mysql> alter table vc add KEY idx_c (c); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0mysql> show index from vc; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | vc | 1 | idx_v | 1 | v | A | 1 | NULL | NULL | YES | BTREE | | | | vc | 1 | idx_c | 1 | c | A | 1 | NULL | NULL | YES | BTREE | | | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 2 rows in set (0.00 sec)mysql> show create table vc; +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | vc | CREATE TABLE `vc` (`v` varchar(5) DEFAULT NULL,`c` char(5) DEFAULT NULL,KEY `idx_v` (`v`),KEY `idx_c` (`c`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) 在mysql中 INDEX 和KEY 都代表了索引; 約束
約束: 唯一約束: unique 外鍵約束:?CONSTRAINT 創建唯一約束(唯一索引可以促成唯一約束):
on update cascade
可以見child只能刪除,其余都受限余父表的約束字段; 而parent都能插入,但其中一條受限于子表約束字段; 給order表增加了一個約束,(CONSTRAINT,約束的關鍵詞)約束名 constarint_uid; 他是一個外鍵約束且order表中userid是外鍵,把order表中的userid 關聯 到 ?user表的userid; 使用外鍵的注意事項:
view作用:
觸發器 是什么: 觸發器是加在表上的特殊程序,當表上出現特定的事件 (insert/update/delete/alter table)時觸發該程序執行。 對一個表的一個事件mysql中只能定義一個觸發器 做什么:
定義:存儲過程是存儲在數據庫端的一組SQL語句集,用戶可以通過存儲過程名和傳參多次調用的程序模塊。 特點:
- 了解掌握常見的幾種數據庫對象
- 學會如何創建具體的數據對象
- DataBase/Schema
- Table
- Index
- View/Trigger/Function/Procedure
- 業務的隔離
- 資源的隔離
- 索引
- 約束
- 視圖,觸發器,函數,存儲過程
什么是數據庫索引: 索引就是數據庫中數據的目錄: 索引和數據時兩個對象 索引主要是用來提高數據庫的查詢效率 數據庫中數據變更同樣需要同步索引數據的變更, 因為索引是按照B+TREE,排好位置的,一旦數據變化,則這個數據的相應位置也要變化, 這樣之后再查找,才能快速索引到,而變化位置就是索引的維護; 查看某個數據庫命令: mysql> help create index Name: 'CREATE INDEX' Description: Syntax: CREATE [ONLINE|OFFLINE] [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name[index_type]ON tbl_name (index_col_name,...)[index_option] .. UNIQUE:唯一索引(用戶表的ID,手機號等,唯一信息) SPATIAL:地理位置索引(搜索周邊有哪些人) 兩種創建索引及查看表中索引的方法 mysql> select * from vc; +------+------+ | v | c | +------+------+ | AB | AB | +------+------+ 1 row in set (0.00 sec)mysql> create index idx_v on vc(v); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0mysql> alter table vc add KEY idx_c (c); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0mysql> show index from vc; +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | vc | 1 | idx_v | 1 | v | A | 1 | NULL | NULL | YES | BTREE | | | | vc | 1 | idx_c | 1 | c | A | 1 | NULL | NULL | YES | BTREE | | | +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 2 rows in set (0.00 sec)mysql> show create table vc; +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ | vc | CREATE TABLE `vc` (`v` varchar(5) DEFAULT NULL,`c` char(5) DEFAULT NULL,KEY `idx_v` (`v`),KEY `idx_c` (`c`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | +-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) 在mysql中 INDEX 和KEY 都代表了索引; 約束
約束: 唯一約束: unique 外鍵約束:?CONSTRAINT 創建唯一約束(唯一索引可以促成唯一約束):
- 唯一約束是一種特殊的索引
- 唯一約束可以是一個或者多個字段
- 位于約束可以在建表的時候建好,也可以后面補上
- 主鍵也是一種唯一約束
?
索引有哪些:- 主鍵索引 ?ID
- 單鍵索引 ?orderid
- 單鍵索引 ?bookid
- 組合索引 (userid + orderid)
- 主鍵約束 ? ? ? ? ? ID
- 單鍵唯一索引 ? ? orderid
- 組合唯一索引 ? ? userid+orderid
| on delete cascade | insert | update | delete |
| parent | yes | 只能更改子表中約束字段沒有的值 | yes |
| child | 只能插入父表中約束字段有的值; | 只能更改父表中約束字段沒有的值? | yes |
| on update cascade | insert | update | delete |
| parent | yes | yes | 只能刪子表中約束字段沒有的值; |
| child | 只能插入父表中約束字段有的值; | 只能更新父表中約束字段沒有的值? | yes |
- 必須是innodb表,其他引擎不支持外鍵
- 相互約束的字段類型必須要一樣
- 主表的約束字段要求有索引(上面的例子中,user表就是主表,所以在user表中要userid要求加上索引 )
- 約束名稱必須要唯一,即使不在一張表上(constarint_uid 在整個庫中是唯一的)
?
視圖viewview作用:
- 視圖將一組查詢語句構成的結果集,是一種虛擬結構,并不是實際數據
- 視圖能簡化數據庫的訪問,能夠將多個查詢語句結構化為一個虛擬結構
- 視圖可以隱藏數據庫后端表結構,提高數據庫的安全性
- 視圖也是一種權限管理,只對用戶提供部分數據
?
觸發器觸發器 是什么: 觸發器是加在表上的特殊程序,當表上出現特定的事件 (insert/update/delete/alter table)時觸發該程序執行。 對一個表的一個事件mysql中只能定義一個觸發器 做什么:
- 數據訂正;
- 遷移表;
- 實現特定的業務邏輯;
- 執行者
- 調用者 ?
?
用 NEW,OLD來引用觸發器中發生變化的記錄內容 觸發觸發器的順序: before 觸發器,行操作,after 觸發器;其中任何一個步驟操作發生錯誤都不會繼續執行剩下的操作。 如果是對事務表進行的操作,那么會整個作為一個事務被回滾(rollback),但是如果是對非事務表進行的操作 ,那么已經更新的記錄將無法回滾,這也是設計觸發器的時候需要注意得問題。 觸發器的特點:- 觸發器對性能有損耗,應慎用
- 同一類事件在一個表中只能創建一次
- 對于事務表,觸發器執行失敗則整個語句回滾
- row格式主從復制,觸發器不會在從屬庫上執行
- 使用觸發器時應該防止遞歸執行
定義:存儲過程是存儲在數據庫端的一組SQL語句集,用戶可以通過存儲過程名和傳參多次調用的程序模塊。 特點:
- 使用靈活,可以使用流控制語句,自定義變量等完成復雜的業務邏輯
- 提高數據安全性,屏蔽應用程序直接對表的操作,易于進行審計
- 減少網絡傳輸
- 提高代碼維護的復雜度,實際使用中要評估場景是否適合
?
IN:輸入參數,表示該參數值在調用存儲過程中已經指定好了,在調用存儲過程中修改該參數不會返回 OUT:輸出參數,可以在存儲過程內部被改變,可以返回 INOUT:輸入輸出參數; characteristic: COMMENT 'string' ? ? ? ? ? ? ? ? ? ?--注釋 | [NOT] DETERMINISTIC ? ? ? ? ?--是否會返回確定值 routine_body: Valid SQL routine statement ? ?--與trigger類似?
? 重點:- 中間變量定義:DECLARE
- 流控制語句
- 參數傳入
?
存儲過程的使用: 1.設置參數值: mysql> set @total = 5; mysql> set @res = 0; 2.調用存儲過程: mysql> call proc_test1(@total,@res); 3.查看返回值: mysql> select @res 刪除存儲過程或者函數: DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name 查看存儲過程或者函數 SHOW {procedure | function} ?status like ‘file_in_stock’ 查看存儲過程或者函數的定義 show ?create {procedure | ?function} ?sp_name 存儲過程-流控制語言?
自定義函數- 自定義函數與存儲過程類似,但是必須帶有返回值
- 自定義函數與sum(),max(),等mysql原生函數使用方法類似: select func(val); select * from tbl where col = func(val)
- 由于自定義函數可能在遍歷數據中使用,要注意性能損耗
- 觸發器和存儲過程不利于水平擴展,多用于統計和運維操作中;
- 還有代碼管理維護成本比較高;
- 但是:
- 簡化應用開發,減少數據傳輸,提高處理效率;
- ?索引的創建于查看
- ?約束:
- 唯一約束,
- 外鍵約束:
- alter table order add CONSTRAINT constarint_uid FOREIGN KEY (userid) REFERENCES user(userid);
- 外鍵約束四種模式:restrict,no action,set null,cascade;
- ?VIEW
- ?TIGGER:
- 一個表的一個事件只能定義一個觸發器
- delimiter //
- NEW.age ?OLD.age
- ?PROCEDURE:
- DECLARE,
- 參數傳入返回
- 流控制語言
- 使用三步驟
- 初始化參數
- 調用存儲過程
- 查看放回值
- ?function:
- 必須帶有返回值
- 使用select func_test1(14);
- ?SUBSTRING( goods_name,1,5 ):從位置1截取goods_name5個字符
- ?A rigth join B on..:B顯示B中null字段;
轉載于:https://www.cnblogs.com/Aiapple/p/5686184.html
總結
- 上一篇: POJ2718【DFS】
- 下一篇: 手把手教你用nodejs+SQL Ser