修改mysql视图可以采用关键字_mysql视图详细笔记

1 #视图2 /*

3 含义:虚拟表,和普通表一样使用4 mysql5.1版本出现的新特性,是通过表动态生成的数据5

6 比如:舞蹈班和普通班级的对比7 创建语法的关键字 是否实际占用物理空间 使用8

9 视图 create view 只是保存了sql逻辑 增删改查,只是一般不能增删改10

11 表 create table 保存了数据 增删改查12

13

14 */

15

16 #案例:查询姓张的学生名和专业名17 SELECTstuname,majorname18 FROMstuinfo s19 INNER JOIN major m ON s.`majorid`=m.`id`20 WHERE s.`stuname` LIKE '张%';21

22 CREATE VIEWv123 AS

24 SELECTstuname,majorname25 FROMstuinfo s26 INNER JOIN major m ON s.`majorid`=m.`id`;27

28 SELECT * FROM v1 WHERE stuname LIKE '张%';29

30

31 #一、创建视图32 /*

33 语法:34 create view 视图名35 as36 查询语句;37

38 */

39 USEmyemployees;40

41 #1.查询姓名中包含a字符的员工名、部门名和工种信息42 #①创建43 CREATE VIEWmyv144 AS

45

46 SELECTlast_name,department_name,job_title47 FROMemployees e48 JOIN departments d ON e.department_id =d.department_id49 JOIN jobs j ON j.job_id =e.job_id;50

51

52 #②使用53 SELECT * FROM myv1 WHERE last_name LIKE '%a%';54

55

56

57

58

59

60 #2.查询各部门的平均工资级别61

62 #①创建视图查看每个部门的平均工资63 CREATE VIEWmyv264 AS

65 SELECT AVG(salary) ag,department_id66 FROMemployees67 GROUP BYdepartment_id;68

69 #②使用70 SELECTmyv2.`ag`,g.grade_level71 FROMmyv272 JOINjob_grades g73 ON myv2.`ag` BETWEEN g.`lowest_sal` ANDg.`highest_sal`;74

75

76

77 #3.查询平均工资最低的部门信息78

79 SELECT * FROM myv2 ORDER BY ag LIMIT 1;80

81 #4.查询平均工资最低的部门名和工资82

83 CREATE VIEWmyv384 AS

85 SELECT * FROM myv2 ORDER BY ag LIMIT 1;86

87

88 SELECT d.*,m.ag89 FROMmyv3 m90 JOINdepartments d91 ON m.`department_id`=d.`department_id`;92

93

94

95

96 #二、视图的修改97

98 #方式一:99 /*

100 create or replace view 视图名101 as102 查询语句;103

104 */

105 SELECT * FROMmyv3106

107 CREATE OR REPLACE VIEWmyv3108 AS

109 SELECT AVG(salary),job_id110 FROMemployees111 GROUP BYjob_id;112

113 #方式二:114 /*

115 语法:116 alter view 视图名117 as118 查询语句;119

120 */

121 ALTER VIEWmyv3122 AS

123 SELECT * FROMemployees;124

125 #三、删除视图126

127 /*

128

129 语法:drop view 视图名,视图名,...;130 */

131

132 DROP VIEWemp_v1,emp_v2,myv3;133

134

135 #四、查看视图136

137 DESCmyv3;138

139 SHOW CREATE VIEWmyv3;140

141

142 #五、视图的更新143

144 CREATE OR REPLACE VIEWmyv1145 AS

146 SELECT last_name,email,salary*12*(1+IFNULL(commission_pct,0)) "annual salary"147 FROMemployees;148

149 CREATE OR REPLACE VIEWmyv1150 AS

151 SELECTlast_name,email152 FROMemployees;153

154

155 SELECT * FROMmyv1;156 SELECT * FROMemployees;157 #1.插入158

159 INSERT INTO myv1 VALUES('张飞','zf@qq.com');160

161 #2.修改162 UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞';163

164 #3.删除165 DELETE FROM myv1 WHERE last_name = '张无忌';166

167 #具备以下特点的视图不允许更新168

169

170 #①包含以下关键字的sql语句:分组函数、distinct、group by、having、union或者union all

171

172 CREATE OR REPLACE VIEWmyv1173 AS

174 SELECT MAX(salary) m,department_id175 FROMemployees176 GROUP BYdepartment_id;177

178 SELECT * FROMmyv1;179

180 #更新181 UPDATE myv1 SET m=9000 WHERE department_id=10;182

183 #②常量视图184 CREATE OR REPLACE VIEWmyv2185 AS

186

187 SELECT 'john'NAME;188

189 SELECT * FROMmyv2;190

191 #更新192 UPDATE myv2 SET NAME='lucy';193

194

195

196

197

198 #③Select中包含子查询199

200 CREATE OR REPLACE VIEWmyv3201 AS

202

203 SELECT department_id,(SELECT MAX(salary) FROMemployees) 最高工资204 FROMdepartments;205

206 #更新207 SELECT * FROMmyv3;208 UPDATE myv3 SET 最高工资=100000;209

210

211 #④join

212 CREATE OR REPLACE VIEWmyv4213 AS

214

215 SELECTlast_name,department_name216 FROMemployees e217 JOINdepartments d218 ON e.department_id =d.department_id;219

220 #更新221

222 SELECT * FROMmyv4;223 UPDATE myv4 SET last_name = '张飞' WHERE last_name='Whalen';224 INSERT INTO myv4 VALUES('陈真','xxxx');225

226

227

228 #⑤from一个不能更新的视图229 CREATE OR REPLACE VIEWmyv5230 AS

231

232 SELECT * FROMmyv3;233

234 #更新235

236 SELECT * FROMmyv5;237

238 UPDATE myv5 SET 最高工资=10000 WHERE department_id=60;239

240

241

242 #⑥where子句的子查询引用了from子句中的表243

244 CREATE OR REPLACE VIEWmyv6245 AS

246

247 SELECTlast_name,email,salary248 FROMemployees249 WHERE employee_id IN(250 SELECTmanager_id251 FROMemployees252 WHERE manager_id IS NOT NULL

253 );254

255 #更新256 SELECT * FROMmyv6;257 UPDATE myv6 SET salary=10000 WHERE last_name = 'k_ing';

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL 视图的限制包括: 1. 视图不能使用临时表 2. 视图不能包含 ORDER BY 子句,除非同时使用了 TOP 或 LIMIT 子句 3. 视图不能包含 INTO OUTFILE 或 INTO DUMPFILE 子句 4. 视图不能被索引,也不能被视为基表 5. 视图不能修改基表的数据,除非使用了特定的 WITH CHECK OPTION 子句 下面是一个 MySQL 视图限制的实例: 假设有一个名为 `orders` 的表,包含以下字段:`order_id`、`customer_id`、`order_date` 和 `total_amount`。 我们可以创建一个名为 `orders_view` 的视图,它只包含 `customer_id` 和 `total_amount` 这两个字段,如下所示: ``` CREATE VIEW orders_view AS SELECT customer_id, total_amount FROM orders; ``` 然而,我们不能在这个视图中包含 ORDER BY 子句,否则会收到以下错误消息: ``` ERROR 1351 (HY000): View's SELECT contains a subquery in the FROM clause ``` 因此,我们应该在使用 ORDER BY 子句时,同时使用 TOP 或 LIMIT 子句来限制结果集的大小,如下所示: ``` CREATE VIEW orders_view AS SELECT customer_id, total_amount FROM orders ORDER BY total_amount DESC LIMIT 10; ``` 这样就可以避免上述错误。 ### 回答2: MySQL视图是虚拟的表,它是根据定义视图时指定的查询语句动态生成的,可以简化复杂的查询操作。然而,MySQL视图也有一些限制。 首先,MySQL视图不支持带有全局或本地临时表的查询。这意味着如果查询需要使用临时表,无法将其放在视图中进行处理。 其次,MySQL视图不能索引。因为视图是根据查询结果动态生成的,而不是实际存储数据,所以无法为视图创建索引。这可能会导致在对视图进行复杂查询时性能下降。 此外,MySQL视图还有许多使用限制。例如,视图不能引用临时表、不能使用存储函数、不能使用用户变量,并且定义视图的SELECT语句不能包含DISTINCT关键字。 下面是一个关于MySQL视图限制的示例: 假设有一个名为"employees"的表,包含员工的姓名、年龄和工资信息。我们希望创建一个名为"young_employees"的视图,只包含年龄小于30岁的员工信息。 创建视图的语句可以是: CREATE VIEW young_employees AS SELECT * FROM employees WHERE age < 30; 然而,如果我们尝试在这个视图上使用DISTINCT关键字进行查询,就会遇到限制: SELECT DISTINCT * FROM young_employees; 会报错,因为MySQL不允许在视图的查询中使用DISTINCT关键字。 综上所述,MySQL视图不支持临时表、无法索引、存在许多其他使用限制。在使用MySQL视图时,我们应该遵守这些限制并考虑它们可能带来的性能问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值