SQL基础-更新&删除&视图

一、更新数据

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;

原文地址:https://www.cnblogs.com/weiyiming007/p/11445370.html

时间: 2024-10-11 04:37:05

SQL基础-更新&删除&视图的相关文章

SQL基础学习_04_视图

视图 1. 视图的创建 ? ? 视图就是保存好的SELECT语句,这些SELECT语句执行之后会产生新的表,所以在SQL中,视图和表是不做差别对待的,也就是SQL也可以对视图做一些操作: ? ? 由于视图并不实际保存数据,只是保存了执行的SELECT语句,可以节约存储空间,但是对于大数据量的存储,使用视图来频繁操作的话,势必会占用较大的计算时间,也算是一种用时间换空间的方案. ? ? 通过以下语句创建视图: ? ? CREATE VIEW 视图名称 (<视图列1>,<视图列2>,&

15、SQL基础整理(视图)

视图 即虚拟表 系统-右键-新建视图 编辑前200行 select *from studentscore 代码创建法: create view studentscore as select student.sno,sname,ssex,sbirthday,class,cno,degree from student join score on student.Sno=score.sno 删除视图: drop view studentscore 修改视图: alter view cts as sel

ASP.NET WEBAPI 简单CURD综合测试(asp.net MVC,json.net,sql基础存储过程和视图,sqlhelper,json解析)

草图 真正的后端是不管前端是什么平台,用什么语言的,JSON格式的数据应该可以应对.用ASP.NET WEBAPI尝试做一个后端,实现最基本的CURD,业务逻辑和数据库操作都放在后端,前端只需要正确访问和提供必要的数据就行. 个人习惯 我喜欢先意淫一下需求,然后找出需要的实体和逻辑,而不是先设计数据库,现在EF那么牛逼,完全可以在代码上生成表和表之间的关系,各种查询语句效率并不一定比你写sql语句差.所以我在做东西的时候从来不先考虑数据的.但是今天主要是练习api和复习一下ado.net的CUR

Oracle实践--PL/SQL基础之视图和索引

PL/SQL基础入门之视图和索引         PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. -----------------------------------

sas中的sql(7)创建视图,更新视图,删除视图

什么是视图? 视图是一系列的查询语句,在使用时被执行,用来从其他的数据集或视图中获取想要的子集(subset)或者超集(superset). The view contains only the logic for accessing the data, not the data itself 视图能用在哪些地方? 几乎在sas程序中任何真实表用的地方(不能用的地方暂未列出). 使用视图的好处? 1:节约空间,视图往往比真实表要小很多. 2:防止用户经常进行表查询而忽略默写列,视图写好后每次调用

oracle sql 基础(四):数据定义语言(创建和管理表、视图)

数据定义语言 (Data Definition Language, DDL) 是SQL语言集中负责数据结构定义与数据库对象定义的语言,由CREATE.ALTER与DROP三个语法所组成.数据库对象包括表.视图.索引.同义词.序列等(TABLE/VIEW/INDEX/SYN/SEQUENCE).我们先对创建和管理表和视图进行一个介绍. 一.创建和管理表 数据表是数据库中一个非常重要的对象,是其他对象的基础.可分为用户表和数据字典两类. 1.创建表(CREATE TABLE) CREATE TABL

SQL Server基础之《视图的概述和基本操作》

阅读目录 一:视图的概述 二:视图的分类 三:视图的优点和作用 四:视图的基本操作和语法 五:视图和表的区别  数据库中的视图是一个虚拟表.同真实的表一样,视图包含一系列带有名称的列和行数据,行和列数据用来自由定义视图和查询所引用的表,并且在引用视图时动态产生.本篇将通过一些实例来介绍视图的概念,视图的作用,创建视图,查看视图,修改视图,更新和删除视图等SQL Server的数据库知识. 回到顶部 一:视图的概述  视图是从一个或者多个表导出的,它的行为与表非常相似,但视图是一个虚拟表,在视图中

SQL 级联更新,级联删除的概念

SQL级联更新,级联删除 今天做了个测试,搞清楚了级联更新,级联删除级联删除:当我们没有对键加级联删除的时候,删除主键表中的数据(外键表有引用的数据)时,会报错,不能删除,必须先把相关联的外键数据            删除了,才能删除主键表的数据,但如果新建外键的时候设置了级联删除,那么当我们删除主键表的数据时,数据库就会自动帮我们把相            关联的外键表数据删除掉,这个好理解级联更新:一直困扰我,级联更新有什么用,是更新什么东西呢,今天做了个测试(mssql),终于搞清楚了一

在生产环境中安全执行更新删除SQL脚本的技巧

今天在生产环境上解决问题,由于广发银行的管理制度是开发公司是不允许确生产环境的,所以我们只能把要更新的语句发给运营中心,由运营中心的投产人员执行,我们则在旁边看着:在他执行的时候发现了一个很有趣的技巧,现在分享出来. 我们知道每一次在生产环境中执行中执行更新删除语句的时候都要格外小心,要做好数据备份,但是即便这样对于一个做了分库分表设计,有十几个G的库来说更新一句SQL后发现忘记写WHERE语句或是语句写错了,恢复备份的成本都是相当高的. 我注意到运营中心的人在拿到我的SQL语句后,把它放到MS