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

Posted weiyiming007

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.50UPDATE 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;

以上是关于SQL基础-更新&删除&视图的主要内容,如果未能解决你的问题,请参考以下文章

使用快照隔离防止 SQL 视图被冗长的删除/插入事务阻塞

数据库演练外键SQL语句的编写&分组和聚合函数的组合使用

SQL视图&触发器

MySQL阶段二——sql语句基础

sql 插入或更新行&&返回ID

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