首页 > 其他分享 >10. 视图

10. 视图

时间:2023-09-12 23:22:43浏览次数:38  
标签:10 -- 视图 mysqldb test root

 一. 创建视图

--
-- 创建视图
--
root@mysqldb 09:28:  [test]> create view view_t4 as select * from t4;
Query OK, 0 rows affected (0.00 sec)
-- 也可以对select结果增加条件进行过滤后,再创建视图

root@mysqldb 09:33:  [test]> show create table t4\G
*************************** 1. row ***************************
       Table: t4
Create Table: CREATE TABLE `t4` (  -- 得到的是表结构
  `a` int NOT NULL AUTO_INCREMENT,
  `b` int DEFAULT NULL,
  `c` varchar(20) DEFAULT 'test',
  PRIMARY KEY (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

root@mysqldb 09:36:  [test]> show create table view_t4\G  -- 他是以一张表的形式存在的,可通过show tables看到
*************************** 1. row ***************************
                View: view_t4
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_t4` AS select `t4`.`a` AS `a`,`t4`.`b` AS `b` from `t4`
                      -- 和真正的表不同的是,这里show出来的是视图的定义
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
1 row in set (0.01 sec)

root@mysqldb 09:36:  [test]> select * from view_t4;  -- 可以直接查询该视图得结果
+---+------+
| a | b    |
+---+------+
| 1 |    1 |
| 2 |   20 |
| 3 |   30 |
| 4 |   40 |
| 5 |   50 |
| 6 |  100 |
+---+------+
6 rows in set (0.00 sec)
-- 视图的作用是,对开发人员是透明的,可以隐藏部分关键的列
-- 视图在MySQL是虚拟表。根据视图的定义,还是取执行定义中的select语句。

-- 只开放部分列
root@mysqldb 09:39:  [test]> create view view_t5 as select a from t4;  -- 只开放a列
Query OK, 0 rows affected (0.00 sec)

root@mysqldb 09:39:  [test]> select * from view_t5;  -- 即使 select * ,也只能看到a列,具有隐藏原来表中部分列的功能
+---+
| a |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
+---+
6 rows in set (0.00 sec)

1. 不要取用select * from 去创建视图,因为mysql会把*逐个解析成列。

2. 当原来的表结构发生变化时,视图的表结构是不会发生变化的,视图在创建的瞬间,便确定了结构。比如,当你alter原来的表 增加列(add columns)时,再去查询该视图,新增加的列是不存在的。 

3. mysql中的视图都是虚拟表。不像Oracle可以物化成真实存在的表。

4. 每次查询视图,实际上还是去查询的原来的表,只是查询的规则是在视图创建时经过定义的。 

5. 修改视图的数据原表的数据也会跟着修改

6. 不能修改视图结构

 

二. 视图的算法

  • 视图的算法( ALGORITHM )有三种方式:
    • UNDEFINED 默认方式,由MySQL来判断使用下面的哪种算法
    • MERGE : 每次 通过 物理表 查询得到结果,把结果merge(合并)起来返回
    • TEMPTABLE : 产生一张 临时表 ,把数据放入临时表后,客户端再去临时表取数据( 不会缓存 )

TEMPTABLE 特点 :即使访问条件一样,第二次查询还是会去读取物理表中的内容,并重新生成一张临时表,并不会取缓存之前的表。(临时表是Memory存储引擎,默认放内存,超过配置大小放磁盘)当查询有一个较大的结果集时,使用 TEMPTABLE 可以快速的结束对该物理表的访问,从而可以快速

释放这张物理表上占用的资源。然后客户端可以对临时表上的数据做一些耗时的操作,而不影响原来的物理表。

所以一般我们使用 UNDEFINED ,由MySQL自己去判断

 

三. UNION

1. UNION 的作用是将两个查询的结果集进行合并。

2. UNION必须由 两条或两条以上 的SELECT语句组成,语句之间用关键字 UNION 分隔。

3. UNION中的每个查询必须包含相同的列( 类型相同或可以隐式转换 )、表达式或聚集函数。

root@mysqldb 10:14:  [test]> create table test_union_1( a int, b int );
Query OK, 0 rows affected (0.01 sec)

root@mysqldb 10:14:  [test]> create table test_union_2( a int, c int );
Query OK, 0 rows affected (0.01 sec)

root@mysqldb 10:15:  [test]> insert into test_union_1 values(1, 2), (3, 4), (5, 6), (10, 20);
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

root@mysqldb 10:15:  [test]> insert into test_union_2 values(10, 20), (30, 40), (50, 60);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

root@mysqldb 10:15:  [test]> select * from test_union_1;
+------+------+
| a    | b    |
+------+------+
|    1 |    2 |
|    3 |    4 |
|    5 |    6 |
|   10 |   20 |  -- test_union_1 中的10, 20
+------+------+
4 rows in set (0.00 sec)

root@mysqldb 10:15:  [test]> select * from test_union_2;
+------+------+
| a    | c    |
+------+------+
|   10 |   20 |   -- test_union_2 中的10, 20
|   30 |   40 |
|   50 |   60 |
+------+------+
3 rows in set (0.00 sec)

root@mysqldb 10:15:  [test]> select a, b from test_union_1 
    -> union 
    -> select a, c from test_union_2;
+------+------+
| a    | b    |
+------+------+
|    1 |    2 |
|    3 |    4 |
|    5 |    6 |
|   10 |   20 |  -- 只出现了一次 10, 20,union会去重
|   30 |   40 |
|   50 |   60 |
+------+------+
6 rows in set (0.00 sec)

root@mysqldb 10:18:  [test]> select a, b from test_union_1 
    -> union all   -- 使用 union all 可以不去重
    -> select a, c from test_union_2;
+------+------+
| a    | b    |
+------+------+
|    1 |    2 |
|    3 |    4 |
|    5 |    6 |
|   10 |   20 |  -- test_union_1 中的10, 20
|   10 |   20 |  -- test_union_2 中的10, 20
|   30 |   40 |
|   50 |   60 |
+------+------+
7 rows in set (0.00 sec)

 

四. 触发器

  • 定义
    • 触发器的对象是表,当表上出现特定的事件时触发该程序的执行
  • 触发器的类型
    • UPDATE
      • update 操作
    • DELETE
      • delete 操作
      • replace 操作
        • 注意:drop,truncate等DDL操作不会触发 DELETE
    • INSERT
      • insert 操作
      • load data 操作
      • replace 操作
        • 注意, replace 操作会触发两次,一次是 UPDATE 类型的触发器,一次是 INSERT 类型的触发器

MySQL 5.6版本同一个类型的触发器只能有一个(针对一个表)

MySQL 5.7允许多个同一类型的触发器

注意:触发器只触发DML(Data Manipulation Language)操作,不会触发DDL(Data Definition Language)操作(create,drop等操作)

 

  •  创建触发器 
CREATE
    [DEFINER = user]
    TRIGGER [IF NOT EXISTS] trigger_name  -- 触发器名字
    trigger_time trigger_event  -- 触发时间和事件
    ON tbl_name FOR EACH ROW
    [trigger_order]
    trigger_body

trigger_time: { BEFORE | AFTER }  -- 事件之前还是之后触发

trigger_event: { INSERT | UPDATE | DELETE }  -- 三个类型

trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

root@mysqldb 10:44:  [test]> create table test_trigger_1(
    -> name varchar(20), 
    -> score int,
    -> primary key(name)
    -> );
Query OK, 0 rows affected (0.01 sec)

root@mysqldb 10:58:  [test]> delimiter // -- 将语句分隔符定义成 // (原来是';')
root@mysqldb 10:59:  [test]> create trigger trg_upd_score_1  -- 定义触发器名字
    -> before update on test_trigger_1  -- 作用在test_trigger_1 更新(update)之前(before)
    -> for each row -- 每行
    -> begin  -- 开始定义
    -> if new.score < 0 then -- 如果新值小于0
    -> set new.score=0;  -- 则设置成0
    -> elseif new.score > 100 then  -- 如果新值大于100
    -> set new.score = 100;  -- 则设置成100
    -> end if;  -- begin对应的 结束
    -> end;//  -- 结束,使用新定义的 '//' 结尾
Query OK, 0 rows affected (0.01 sec)

root@mysqldb 11:03:  [test]> delimiter ;  -- 恢复 ';' 结束符

-- new.col : 表示更新以后的值
-- old.col : 表示更新以前的值(只读)

root@mysqldb 11:00:  [test]>  insert into test_trigger_1 values ("tom", 200); -- 插入新值
Query OK, 1 row affected (0.00 sec)

root@mysqldb 11:03:  [test]> select * from test_trigger_1;
+------+-------+
| name | score |
+------+-------+
| tom  |   200 |  -- 没改成100,因为定义的是update,而执行的是insert
+------+-------+
1 row in set (0.00 sec)

root@mysqldb 11:03:  [test]> update test_trigger_1 set score=300 where name='tom';  -- 改成300
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

root@mysqldb 11:03:  [test]> select * from test_trigger_1;
+------+-------+
| name | score |
+------+-------+
| tom  |   100 |  -- 通过触发器的设置,大于100的值被修改成100
+------+-------+
1 row in set (0.00 sec)

 

标签:10,--,视图,mysqldb,test,root
From: https://www.cnblogs.com/gavin-zheng/p/17698136.html

相关文章

  • win10安装pyqt5
     安装pipinstallPyQt5-ihttps://pypi.douban.com/simplepipinstallPyQt5-tools-ihttps://pypi.douban.com/simple测试designer验证importsysfromPyQt5.QtWidgetsimportQWidget,QApplicationapp=QApplication(sys.argv)widget=QWidget()widget.resize(......
  • Redis7 10大数据类型(Redis字符串)
    一、常用二、单值单value三、案例1、常用setkeyvalue[NX|XX][GET][EXseconds|PXmilliseconds|EXATunix-time-seconds|PXATunix-time-milliseconds|KEEPTTL]getvaluekeepttlset重置value时,ttl不重置2、同时设置/获取多个键值MSETkeyvalue[keyvalue...]MGETkey[k......
  • 蓝牛复制粘贴助手v6.10 免费软件
    你还在为重复输入重复的文本信息烦恼吗?当你经常输入的文本信息是重复的你是一个一个慢慢打字或是一个一个复制吗?蓝牛复制粘贴助手可以设置无限组文本 还可以用快捷键Ctrl+K和Ctrl+L左右切换分组,每组9个文本内容软件同时也有强大的剪贴板记录功能,Ctrl+Q可以快速分组与剪......
  • Sol.CF1037B
    又是随机跳题跳到的,再来写一篇题解。不难发现又是一道用贪心解决的问题。首先先对序列进行排序。然后发现题目分为以下三种情况(\(mid\)为中位数,当前中位数为\(s\))\(s=mid\)输出特判即可。\(s>mid\)在序列的左边只要找到比\(s\)大的就累加他们的差进答案。\(s<......
  • CF510C
    其实是一道板子题,建议评黄。题意求一种满足让\(n\)个字符串合法排列的字典序。思路不难想到使用拓扑排序。具体地说,我们可以把字符串当作点,若有两个字符串\(s1,s2\)且满足\(s1\)的字典序小于\(s2\),则建一条从\(s1\)到\(s2\)的边。注意到如果有两个字符串\(s2\)......
  • Sol.UVA10127
    题意:给定\(n\),找到形如\(1111...1111\)的数\(y\),使得\(y\equiv1\modx\),最终输出\(y\)的位数。思路:形如\(1111...1111\)的数可以拆分成\(10...00\times1+10...0\times1+...+10\times1+1\),因此我们可以每次让$y=y\times10+y$,每次判断是否能整除\(......
  • QOJ # 7106. Infinite Parenthesis Sequence
    题面传送门为什么全场切我不会?为什么全场切我不会?为什么全场切我不会?首先因为题目中要求左括号个数,我们就来关注一下左括号。对于一个左括号,假设它右边是右括号,那么这个左括号就会往右走,否则不会往右走。随便选个左括号开始标号,往左为负,往右为正,设\(p(k,i)\)表示第\(i\)个......
  • Databend 开源周报第 110 期
    Databend是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn。What'sOnInDatabend探索Databend本周新进展,遇到更贴近你心意的Databend。使用BendSQL管理Stage中的文件Databend推荐使用P......
  • 外汇110网:曝光宣称多个监管的SSIM阳光市场已跑路
    近期,有多位投资者向我站爆料称SSIM阳光市场跑路了,平台官网无法打开,MT4登录不了,投资者们出金无门。其中一位投资者表示,SSIM阳光市场从今年三月份开始就直接不给出金了,也没有负责人出来说明情况。SSIM虚假宣传多个监管,FX110网一年多前已警示SSIM阳光市场平台域名成立时间为2022年3月2......
  • USB适配器应用芯片 国产GP232RL软硬件兼容替代FT232RL DPU02直接替代CP2102
    USB适配器,是英文UniversalSerialBus(通用串行总线)的缩写,而其中文简称为“通串线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术,移动PC由于没有电池,电源适配器对其尤为重要。今天来讲讲USB适配器的国产适用芯片。一、GP232RL,直接软硬件......