一、更新數據
1、更新數據
### 更新全部數據: 使用UPDATE關鍵字。語法如下: UPDATE 表名 SET 字段名=新的值; 比如: 更新學生表中的所有學生性別為男: UPDATE student SET gender = '男'; ### 更新部分數據: 使用UPDATE關鍵字。語法如下: UPDATE 表名 SET 字段名=新的值 WHERE 限定條件; 比如: 更新學生方東美的性別為女: UPDATE student SET gender = '女' WHERE student_name = '方東美'; ### 更新部分數據的多個字段: 使用UPDATE關鍵字。語法如下: UPDATE 表名 SET 字段名1=新的值1,字段名2=新的值2,… WHERE 限定條件; 比如: 更新學生方東美的性別為女,分數為85.50: UPDATE student SET gender = '女',score = 85.50 WHERE student_name = '方東美'; 建議在更新、刪除數據時,加上where,避免更新或刪除全表數據; mysql中: mysql -U 可以限制update和delete必須加上where限制條件,如果更新和刪除數據不添加where限制條件,就會報錯; 可以設置別名,命令:alias mysql='mysql -U' 也可以開啟安全模式: set sql_safe_updates=1; //安全模式打開狀態 set sql_safe_updates=0; //安全模式關閉狀態
2、根據其他表更新數據
根據其他表更新數據: 使用UPDATE關鍵字。語法如下: UPDATE 表名 SET 字段名=(子查詢) [ WHERE 限定條件 ]; 比如: 在學生表中添加老師姓名字段,並使用老師表中的數據進行更新: alter table student add column teacher_name varchar(30); UPDATE student a SET teacher_name = ( SELECT b.teacher_name FROM teacher b WHERE a.teacher_id = b.teacher_id);
二、刪除數據
1、刪除全部表數據
刪除全部數據: 使用DELETE關鍵字。 語法如下: DELETE FROM 表名; 比如,刪除學生表中的數據,使用如下語句: DELETE FROM student;
2、刪除部分數據
刪除部分數據: 使用DELETE關鍵字。 語法如下: DELETE FROM 表名 WHERE 篩選條件; 比如,刪除學生表方東美的數據,使用如下語句: DELETE FROM student WHERE student_name = '方東美';
3、根據其他表刪除數據
根據其他表刪除數據: 使用DELETE關鍵字。 語法如下: DELETE FROM 表名 WHERE 子查詢; 比如,刪除學生表中老師姓名為NULL的數據,使用如下語句: DELETE FROM student WHERE teacher_id in ( SELECT teacher_id FROM teacher WHERE teacher_name IS NULL );
三、視圖
1、建表
### teacher表; CREATE TABLE `teacher` ( `teacher_id` varchar(255) DEFAULT NULL COMMENT '老師編號', `teacher_name` varchar(255) DEFAULT NULL COMMENT '老師姓名', `gender` varchar(255) DEFAULT NULL COMMENT '性別' ) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='老師'; INSERT INTO `teacher` VALUES ('T0001','高齊妍','男'),('T0002','李紅','女'), ('T0003','李一萱',NULL),('T0004','劉金霞','男'),('T0005','劉思哲','男'), ('T0006','劉兆祥','男'),('T0007','劉哲宇','男'),('T0008','梅藝涵','女'), ('T0009','梅姿君','女'),('T0010','牛雨','女'),('T0011','牛光瀅','女'), ('T0012','黃雅','女'),('T0013','任筱','女'),('T0014','吳靜婷','男'), ('T0015','習芸潁','女'),('T0016','葉惠燕','女'),('T0017','周純','男'), ('T0018','周聖傑','男'),('T0019','方焓','女'),('T0020','方傑萍','女'); ### student表: CREATE TABLE `student` ( `student_id` varchar(50) NOT NULL COMMENT '學生編號', `student_name` varchar(100) NOT NULL DEFAULT '' COMMENT '學生姓名', `gender` varchar(10) NOT NULL DEFAULT '' COMMENT '性別', `birth_day` date NOT NULL COMMENT '生日', `age` int(11) NOT NULL DEFAULT '0' COMMENT '年齡', `class_id` varchar(50) NOT NULL DEFAULT '' COMMENT '班級編號', `score` decimal(18,2) NOT NULL DEFAULT '0.00' COMMENT '數學成績', `teacher_id` varchar(20) DEFAULT NULL COMMENT '老師編號' ) ENGINE=MyISAM DEFAULT CHARSET=gbk COMMENT='學生'; INSERT INTO `student` VALUES ('S20180001','方東美','女','2006-02-04',12,'G0101',80.65,'T0003'), ('S20180002','方香','女','2008-09-28',10,'G0101',75.48,NULL), ('S20180003','高紫菡','男','2006-07-22',12,'G0101',74.46,'T0003'), ('S20180004','胡未遲','男','2007-07-25',11,'G0101',51.27,'T0003'), ('S20180005','李詠頤','男','2007-03-16',11,'G0101',88.84,'T0003'), ('S20180006','吳灝瀟','男','2008-04-19',10,'G0101',69.93,NULL), ('S20180007','吳明鴻','男','2007-11-18',11,'G0101',63.65,'T0003'), ('S20180008','吳鵬宇','男','2007-08-24',11,'G0101',84.69,'T0003'), ('S20180009','吳少雄','男','2007-08-04',11,'G0101',76.36,'T0003'), ('S20180010','習芬飄','女','2005-01-27',13,'G0101',83.42,'T0003'), ('S20180011','俞倚琳','女','2007-07-07',11,'G0101',97.38,'T0003'), ('S20180012','張瓊雪','女','2006-06-12',12,'G0101',81.01,'T0003'), ('S20180013','陳順軍','女','2006-09-12',12,'G0102',91.13,'T0004'), ('S20180014','方浩傑','男','2008-03-29',10,'G0102',79.46,NULL), ('S20180015','方靜雅','女','2007-01-27',11,'G0102',54.99,'T0004'), ('S20180016','胡博涵','男','2008-08-11',10,'G0102',50.32,NULL); student表數據很多,這里只寫出一部分;
2、視圖簡介
比如:查詢學生信息時,同時查詢出老師姓名: SELECT a.*,b.teacher_name FROM student a LEFT JOIN teacher b ON a.teacher_id = b.teacher_id; 思考:如果有很多地方都需要按上面的邏輯查詢,那LEFT JOIN的腳本就需要寫 很多遍,有沒有一種簡寫的方式? ---視圖
3、創建視圖
創建視圖: 使用CREATE VIEW關鍵字。 語法如下: CREATE VIEW 視圖名 AS SELECT子句; 比如,查詢學生信息時,同時查詢出老師姓名: CREATE VIEW v_student AS SELECT a.*,b.teacher_name FROM student a LEFT JOIN teacher b ON a.teacher_id = b.teacher_id; 查詢視圖: 與查詢表一樣,使用SELECT子句。 比如,查詢學生信息時,同時查詢出老師姓名: SELECT * FROM v_student; SELECT student_id,student_name,teacher_id,teacher_name from v_student; SELECT * FROM v_student WHERE teacher_id = 'T0003';
4、視圖的嵌套
比如: 查詢所有考試及格的學生信息 CREATE VIEW v_student_nesting AS SELECT * FROM v_student WHERE score >= 60; select * from v_student_score;
5、視圖與表的區別
1.視圖是已經編譯好了的sql,表不是 2.視圖沒有實際的物理存儲記錄,表有 3.視圖是邏輯概念,表可以進行修改 5.表是內模式,視圖是外模式 6.視圖是我們查看表的方法,視圖不讓用戶接觸數據表,用戶也就不知道表結構 7.表屬於全局模式中的表,是實表,視圖屬於局部模式的表,是虛表。 8.視圖建立、刪除只影響視圖本身,不影響表 9、視圖適合查詢,不適合增、刪、改,表可以增、刪、改、查;
6、視圖常見的使用場景
### 場景一:僅提供需要的數據; 比如:只想查詢學生編號、學生姓名、分數三個字段的信息: CREATE VIEW v_student1 AS SELECT a.student_id,a.student_name,a.score FROM student a; ### 場景二:對特定的用戶僅開放特定的數據,達到保護敏感數據的目的,提升了數據安全性; 比如:只想將學生編號、學生姓名、分數三個字段的信息暴露給用戶u_read: GRANT SELECT ON v_student1 TO u_read@localhost; ### 場景三:僅篩選需要的數據 比如:只查詢成績及格的學生信息: CREATE VIEW v_student3 AS SELECT * FROM student a WHERE a.score >= 60; ### 場景四:簡化復雜的操作 比如:在應用的多個地方,都需要查詢學生信息時,同時查詢出老師姓名: CREATE VIEW v_student4 AS SELECT a.*,b.teacher_name FROM student a LEFT JOIN teacher b ON a.teacher_id = b.teacher_id; SELECT * FROM v_student4; ### 場景五:重新格式化出新的字段 比如:查詢學生出生日期,年月日單獨一個字段展示: CREATE VIEW v_student5 AS SELECT a.student_id,a.student_name, year(a.birth_day) birth_year, month(a.birth_day) birth_month, day(a.birth_day) birth_day FROM student a; ### 場景六:使用計算表達式生成新的字段 必須要對新產生的字段給出字段名,否則可能會報錯。 比如:考試總分100分,查詢所有學生做錯的題目的分數: CREATE VIEW v_student6 AS SELECT a.student_id,a.student_name, a.score,100 - a.score as 'wrong_score' FROM student a; ### 場景七:屏蔽底層實現邏輯及頻繁的變更 比如:考試總分100分,查詢所有學生做錯的題目的分數: CREATE VIEW v_student7 AS SELECT a.student_id,a.student_name, a.score,100 - a.score as 'wrong_score' FROM student a; ### 場景八:合並多個分離的子表 比如:假如有3個學校,每個學校的學生數據在各自的表中,如何一次性查詢所有學生的信息: CREATE VIEW v_student8 AS SELECT * FROM student1 UNION ALL SELECT * FROM student2 UNION ALL SELECT * FROM student3;