博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL基础-更新&删除&视图
阅读量:5220 次
发布时间:2019-06-14

本文共 6225 字,大约阅读时间需要 20 分钟。

一、更新数据

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_nameFROM student aLEFT JOIN teacher bON 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_nestingASSELECT * FROM v_studentWHERE 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;

转载于:https://www.cnblogs.com/weiyiming007/p/11445370.html

你可能感兴趣的文章
android smack MultiUserChat.getHostedRooms( NullPointerException)
查看>>
递归-下楼梯
查看>>
实用的VMware虚拟机使用技巧十一例
查看>>
监控工具之---Prometheus 安装详解(三)
查看>>
不错的MVC文章
查看>>
网络管理相关函数
查看>>
IOS Google语音识别更新啦!!!
查看>>
20190422 T-SQL 触发器
查看>>
[置顶] Linux终端中使用上一命令减少键盘输入
查看>>
poj1422_有向图最小路径覆盖数
查看>>
BootScrap
查看>>
[大牛翻译系列]Hadoop(16)MapReduce 性能调优:优化数据序列化
查看>>
WEB_点击一百万次
查看>>
CodeForces - 878A Short Program(位运算)
查看>>
路冉的JavaScript学习笔记-2015年1月23日
查看>>
Mysql出现(10061)错误提示的暴力解决办法
查看>>
2018-2019-2 网络对抗技术 20165202 Exp3 免杀原理与实践
查看>>
NPM慢怎么办 - nrm切换资源镜像
查看>>
CoreData 从入门到精通(四)并发操作
查看>>
Swift - UIView的常用属性和常用方法总结
查看>>