MySQL 之视图、 触发器、事务、存储过程、内置函数、流程控制、索引(一)
閱讀目錄
本文內容:
- 視圖
- 觸發器
- 事務
- 存儲過程
- 內置函數
- 流程控制
- 索引
一、視圖
視圖就是通過查詢得到一張虛擬表,然后保存下來,下次直接使用即可。
如果要頻繁使用一張虛擬表,可以不用重復查詢
視圖使用方法:
--------------------------------------------------------------------注:如果你對python感興趣,我這有個學習Python基地,里面有很多學習資料,感興趣的+Q群:895817687 --------------------------------------------------------------------- 將表1與表2通過on后面的條件進行內連接,產生的新表 就是我們創建的視圖表 create view 視圖表名 asselect * from 表1 inner join 表2on 內連接條件具體示例:
先建基礎數據表及其記錄(由于博客園暫找不到上傳文件的地方,所以只能插入創建表的sql語句,將其復制粘貼到txt文檔里面,最好是notpad++里面,然后存為sql文件,在Navicat里面導入就行了)
View Code
/*Navicat Premium Data TransferSource Server : sgt'mysqlSource Server Type : MySQLSource Server Version : 50726Source Host : localhost:3306Source Schema : day41Target Server Type : MySQLTarget Server Version : 50726File Encoding : 65001Date: 17/05/2019 14:54:11 */SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;-- ---------------------------- -- Table structure for class -- ---------------------------- DROP TABLE IF EXISTS `class`; CREATE TABLE `class` (`cid` int(11) NOT NULL AUTO_INCREMENT,`caption` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,PRIMARY KEY (`cid`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ---------------------------- -- Records of class -- ---------------------------- INSERT INTO `class` VALUES (1, '三年二班'); INSERT INTO `class` VALUES (2, '三年三班'); INSERT INTO `class` VALUES (3, '一年二班'); INSERT INTO `class` VALUES (4, '二年九班');-- ---------------------------- -- Table structure for course -- ---------------------------- DROP TABLE IF EXISTS `course`; CREATE TABLE `course` (`cid` int(11) NOT NULL AUTO_INCREMENT,`cname` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`teacher_id` int(11) NOT NULL,PRIMARY KEY (`cid`) USING BTREE,INDEX `fk_course_teacher`(`teacher_id`) USING BTREE,CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ---------------------------- -- Records of course -- ---------------------------- INSERT INTO `course` VALUES (1, '生物', 1); INSERT INTO `course` VALUES (2, '物理', 2); INSERT INTO `course` VALUES (3, '體育', 3); INSERT INTO `course` VALUES (4, '美術', 2);-- ---------------------------- -- Table structure for score -- ---------------------------- DROP TABLE IF EXISTS `score`; CREATE TABLE `score` (`sid` int(11) NOT NULL AUTO_INCREMENT,`student_id` int(11) NOT NULL,`course_id` int(11) NOT NULL,`num` int(11) NOT NULL,PRIMARY KEY (`sid`) USING BTREE,INDEX `fk_score_student`(`student_id`) USING BTREE,INDEX `fk_score_course`(`course_id`) USING BTREE,CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`) ON DELETE RESTRICT ON UPDATE RESTRICT,CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB AUTO_INCREMENT = 53 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ---------------------------- -- Records of score -- ---------------------------- INSERT INTO `score` VALUES (1, 1, 1, 10); INSERT INTO `score` VALUES (2, 1, 2, 9); INSERT INTO `score` VALUES (5, 1, 4, 66); INSERT INTO `score` VALUES (6, 2, 1, 8); INSERT INTO `score` VALUES (8, 2, 3, 68); INSERT INTO `score` VALUES (9, 2, 4, 99); INSERT INTO `score` VALUES (10, 3, 1, 77); INSERT INTO `score` VALUES (11, 3, 2, 66); INSERT INTO `score` VALUES (12, 3, 3, 87); INSERT INTO `score` VALUES (13, 3, 4, 99); INSERT INTO `score` VALUES (14, 4, 1, 79); INSERT INTO `score` VALUES (15, 4, 2, 11); INSERT INTO `score` VALUES (16, 4, 3, 67); INSERT INTO `score` VALUES (17, 4, 4, 100); INSERT INTO `score` VALUES (18, 5, 1, 79); INSERT INTO `score` VALUES (19, 5, 2, 11); INSERT INTO `score` VALUES (20, 5, 3, 67); INSERT INTO `score` VALUES (21, 5, 4, 100); INSERT INTO `score` VALUES (22, 6, 1, 9); INSERT INTO `score` VALUES (23, 6, 2, 100); INSERT INTO `score` VALUES (24, 6, 3, 67); INSERT INTO `score` VALUES (25, 6, 4, 100); INSERT INTO `score` VALUES (26, 7, 1, 9); INSERT INTO `score` VALUES (27, 7, 2, 100); INSERT INTO `score` VALUES (28, 7, 3, 67); INSERT INTO `score` VALUES (29, 7, 4, 88); INSERT INTO `score` VALUES (30, 8, 1, 9); INSERT INTO `score` VALUES (31, 8, 2, 100); INSERT INTO `score` VALUES (32, 8, 3, 67); INSERT INTO `score` VALUES (33, 8, 4, 88); INSERT INTO `score` VALUES (34, 9, 1, 91); INSERT INTO `score` VALUES (35, 9, 2, 88); INSERT INTO `score` VALUES (36, 9, 3, 67); INSERT INTO `score` VALUES (37, 9, 4, 22); INSERT INTO `score` VALUES (38, 10, 1, 90); INSERT INTO `score` VALUES (39, 10, 2, 77); INSERT INTO `score` VALUES (40, 10, 3, 43); INSERT INTO `score` VALUES (41, 10, 4, 87); INSERT INTO `score` VALUES (42, 11, 1, 90); INSERT INTO `score` VALUES (43, 11, 2, 77); INSERT INTO `score` VALUES (44, 11, 3, 43); INSERT INTO `score` VALUES (45, 11, 4, 87); INSERT INTO `score` VALUES (46, 12, 1, 90); INSERT INTO `score` VALUES (47, 12, 2, 77); INSERT INTO `score` VALUES (48, 12, 3, 43); INSERT INTO `score` VALUES (49, 12, 4, 87); INSERT INTO `score` VALUES (52, 13, 3, 87);-- ---------------------------- -- Table structure for student -- ---------------------------- DROP TABLE IF EXISTS `student`; CREATE TABLE `student` (`sid` int(11) NOT NULL AUTO_INCREMENT,`gender` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,`class_id` int(11) NOT NULL,`sname` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,PRIMARY KEY (`sid`) USING BTREE,INDEX `fk_class`(`class_id`) USING BTREE,CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`) ON DELETE RESTRICT ON UPDATE RESTRICT ) ENGINE = InnoDB AUTO_INCREMENT = 17 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ---------------------------- -- Records of student -- ---------------------------- INSERT INTO `student` VALUES (1, '男', 1, '理解'); INSERT INTO `student` VALUES (2, '女', 1, '鋼蛋'); INSERT INTO `student` VALUES (3, '男', 1, '張三'); INSERT INTO `student` VALUES (4, '男', 1, '張一'); INSERT INTO `student` VALUES (5, '女', 1, '張二'); INSERT INTO `student` VALUES (6, '男', 1, '張四'); INSERT INTO `student` VALUES (7, '女', 2, '鐵錘'); INSERT INTO `student` VALUES (8, '男', 2, '李三'); INSERT INTO `student` VALUES (9, '男', 2, '李一'); INSERT INTO `student` VALUES (10, '女', 2, '李二'); INSERT INTO `student` VALUES (11, '男', 2, '李四'); INSERT INTO `student` VALUES (12, '女', 3, '如花'); INSERT INTO `student` VALUES (13, '男', 3, '劉三'); INSERT INTO `student` VALUES (14, '男', 3, '劉一'); INSERT INTO `student` VALUES (15, '女', 3, '劉二'); INSERT INTO `student` VALUES (16, '男', 3, '劉四');-- ---------------------------- -- Table structure for teacher -- ---------------------------- DROP TABLE IF EXISTS `teacher`; CREATE TABLE `teacher` (`tid` int(11) NOT NULL AUTO_INCREMENT,`tname` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,PRIMARY KEY (`tid`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;-- ---------------------------- -- Records of teacher -- ---------------------------- INSERT INTO `teacher` VALUES (1, '張磊老師'); INSERT INTO `teacher` VALUES (2, '李平老師'); INSERT INTO `teacher` VALUES (3, '劉海燕老師'); INSERT INTO `teacher` VALUES (4, '朱云海老師'); INSERT INTO `teacher` VALUES (5, '李杰老師');-- ---------------------------- -- View structure for teacher2course -- ---------------------------- DROP VIEW IF EXISTS `teacher2course`; CREATE ALGORITHM = UNDEFINED SQL SECURITY DEFINER VIEW `teacher2course` AS select `teacher`.`tid` AS `tid`,`teacher`.`tname` AS `tname`,`course`.`cid` AS `cid`,`course`.`cname` AS `cname`,`course`.`teacher_id` AS `teacher_id` from (`teacher` join `course` on((`teacher`.`tid` = `course`.`teacher_id`)));SET FOREIGN_KEY_CHECKS = 1; -- 創建視圖 create view teacher2course as select * from teacher inner join course on teacher.tid=course.teacher_id-- 查看創建的視圖 select * from teacher2course tid tname cid cname teacher_id 1 張磊老師 1 生物 1 2 李平老師 2 物理 2 3 劉海燕老師 3 體育 3 2 李平老師 4 美術 2這里需要強調幾點:
- 在硬盤中,視圖只有表結構文件,沒有表數據文件
- 視圖通常是用于查詢,盡量不要修改視圖中的數據
- 刪除視圖代碼:drop view teacher2course
思考:真實開發過程中是否會使用視圖?
我們已經說過,視圖是mysql的功能,這個功能主要用于查詢,但是如果一個項目中使用了很多視圖,那么如果項目某個功能需要修改的時候,就會需要對視圖進行修改,這時候就需要在mysql端將視圖進行修改,然后再去應用程序修改對應的sql語句,其實這就會導致一個跨部門溝通問題,部門與部門溝通并不是不可以,但是我們應該在軟件代碼層面上盡量減少這么溝通次數,因為一方面人與人之間的交往問題,另一方面也是項目擴展高效性的一方面考慮。一般程序擴展功能都是通過修改sql語句來完成的。(以上僅個人意見,歡迎交流)
二、觸發器
- 定義:當對某張表的記錄進行增、刪、改的行為下,會滿足這一行為條件后自動觸發某一設定功能稱之為觸發器。
- 目的:觸發器主要是專門針對我們隊某一張表記錄進行新增insert、刪delete、改update的行為,這類行為一旦執行,就會滿足觸發器觸發條件,即自動運行觸發器設定的另一段sql語句。
- 如何創建觸發器:
- 下面通過一個案例來進一步認識觸發器:
三、事務
- 簡言之:多個sql語句執行生效的狀態必須同步進行
也就是說開啟事務后,事務里的所有sql語句,要么全部生效成功,只要有一個失敗,就全部不生效不成功。(應用場景可以想象銀行轉賬,雙方必須都完成應該有的過程才能算轉賬成功,否則轉賬不成功。) - 作用:保證事務內數據處理的同步性,讓數據操作更具安全性。
- 事務四大屬性:(需要重點記憶)
原子性:一個事務是不可分割的集合,其中包括的操作必須都成功,否則視為不成功
一致性:事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態,與原子性密切相關的
隔離性:多個事務直接互不干擾,也就是說事務內數據操作與另一事務內的數據操作是相互隔離的,并發執行的各個事務之間互不干擾。
4.持久性:永久性,事務如果提交,對數據庫的改變是永久性的,接下來的其他操作貨故障不會對其有任何影響。
- 使用實例:
四、存儲過程
優點:開發效率高,執行效率高(因為我只需要負責應用程序邏輯層的問題,數據庫層的有人幫我封裝好了存儲過程,我直接調用就行。)
缺點:將開發應用分為2個部門,如果涉及到擴展情況,相關的存儲過程需要修改的話,就需要與數據庫部門產生溝通過程,考慮到人為因素,跨部門溝通等問題,綜合性來說會導致擴展性變差。
缺點:開發效率和執行效率都不方第一種模型低,因為一個人2個方面的事都他干了,開發效率和執行效率能高嗎!同時考慮到編寫sql語句的復雜性,同時也要考慮到sql語句的優化問題,這些都涉及到術業有專攻的問題,最終還是會導致開發效率低的問題。
優點:不用像模型2那樣編寫sql,開發效率肯定比模型2高,同時兼容了2的擴展性高得好處 缺點:執行效率上面比較低,比2低。
創建存儲過程:
delimiter // create procedure p1(in m int, -- in表示這個參數必須只能是傳入不能被返回出去in n int,out res int) -- out表示這個參數可以被返回出去,還有一個inout表示傳入傳出可返回出去beginselect tname from teacher where tid > m and tid < n;set res = 0; end // delimiter ;- 使用存儲過程:
未完待續
總結
以上是生活随笔為你收集整理的MySQL 之视图、 触发器、事务、存储过程、内置函数、流程控制、索引(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 之Navicat Premi
- 下一篇: MySQL 之视图、 触发器、事务、存储