zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    约瑟夫问题
    十点半
    鹊桥相会
    C语言实验——数日子
    汉诺塔
    读入字符串
    C语言实验——各位数字之和排序
    数据结构实验之链表五:单链表的拆分
    C语言实验——分割整数
    大一上学期
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/11445370.html
Copyright © 2011-2022 走看看