SQL_STUDY:13.SQL VIEW(视图)

摘要:

  1. 视图的简单操作
  2. 视图每次查询都会更新数据
  3. 建立视图索引(未实现)

SQL VIEW(视图)

视图是可视化的表。

SQL CREATE VIEW 语句

什么是视图?
在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表。

视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据,就像这些来自于某个单一的表。

注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句的影响。

SQL CREATE VIEW 语法

CREATE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

注释:视图总是显示最近的数据。每当用户查询视图时,数据库引擎通过使用 SQL 语句来重建数据。


SQL CREATE VIEW 实例

可以从某个查询内部、某个存储过程内部,或者从另一个视图内部来使用视图。通过向视图添加函数、join 等等,我们可以向用户精确地提交我们希望提交的数据。

样本数据库 Northwind 拥有一些被默认安装的视图。视图 “Current Product List” 会从 Products 表列出所有正在使用的产品。这个视图使用下列 SQL 创建:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName
FROM Products
WHERE Discontinued=No

我们可以查询上面这个视图:

SELECT * FROM [Current Product List]

Northwind 样本数据库的另一个视图会选取 Products 表中所有单位价格高于平均单位价格的产品:

CREATE VIEW [Products Above Average Price] AS
SELECT ProductName,UnitPrice
FROM Products
WHERE UnitPrice>(SELECT AVG(UnitPrice) FROM Products) 

我们可以像这样查询上面这个视图:

SELECT * FROM [Products Above Average Price]

另一个来自 Northwind 数据库的视图实例会计算在 1997 年每个种类的销售总数。请注意,这个视图会从另一个名为 “Product Sales for 1997” 的视图那里选取数据:

CREATE VIEW [Category Sales For 1997] AS
SELECT DISTINCT CategoryName,Sum(ProductSales) AS CategorySales
FROM [Product Sales for 1997]
GROUP BY CategoryName 

我们可以像这样查询上面这个视图:

SELECT * FROM [Category Sales For 1997]
我们也可以向查询添加条件。现在,我们仅仅需要查看 “Beverages” 类的全部销量:

SELECT * FROM [Category Sales For 1997]
WHERE CategoryName='Beverages'

SQL 更新视图

您可以使用下面的语法来更新视图:

SQL CREATE OR REPLACE VIEW Syntax
CREATE OR REPLACE VIEW view_name AS
SELECT column_name(s)
FROM table_name
WHERE condition

现在,我们希望向 “Current Product List” 视图添加 “Category” 列。我们将通过下列 SQL 更新视图:

CREATE VIEW [Current Product List] AS
SELECT ProductID,ProductName,Category
FROM Products
WHERE Discontinued=No

SQL 撤销视图

您可以通过 DROP VIEW 命令来删除视图。

SQL DROP VIEW Syntax
DROP VIEW view_name

视图的查询:

ORACLE视图在数据库中是没有存储空间的。你可以把普通视图想成一个复杂SQL语句的别名,所以你查询视图的时候,当然是执行里面的SQL语句了,也就是查询的基础表。基础表的数据更改了,视图的结果当然也跟着改变。

如果视图查询的效率低,首先应该优化里面的SQL语句。如果实在没有优化的空间可以考虑做成物化视图,物化视图在数据库中是需要存储空间的,而且需要手工刷新。物化视图也就相当把你内在的SQL语句全部查询出来做成一个表的形式存在,你可以基于物化视图做索引或者分区等优化。如果你们查询的视图要求实时性不高的话可以考虑物化视图,如果要求实时性就需要优化SQL,甚至考虑是否重新设计表结构。

改正优化下面的from urllib import request import mysql from flask import Flask, render_template, request, redirect, url_for, render_template, redirect, jsonify coding="utf-8" # 正确连接示例(参考引用[3]) from flask import Flask from mysql.connector import Error, errorcode app = Flask(__name__) def get_db_connection(): try: return mysql.connector.connect( user='study', password='root', # 使用环境变量更安全 host='localhost', database='one', auth_plugin='mysql_native_password' # 解决认证协议问题 ) except Error as err: if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: app.logger.error("数据库凭证无效") elif err.errno == errorcode.CR_CONN_HOST_ERROR: app.logger.error("数据库服务未启动") raise RuntimeError("数据库连接失败") from err @app.route('/') def index(): try: db = get_db_connection() # 数据库操作... except RuntimeError as e: return str(e), 500 app = Flask(__name__) students = [ {'name': '张小明', 'chinese': 92, 'math': 88, 'english': 85, 'physics': 90, 'chemistry': 87}, {'name': '李小红', 'chinese': 88, 'math': 95, 'english': 92, 'physics': 86, 'chemistry': 90}, {'name': '王大华', 'chinese': 78, 'math': 82, 'english': 75, 'physics': 80, 'chemistry': 77}, {'name': '刘美丽', 'chinese': 95, 'math': 90, 'english': 93, 'physics': 91, 'chemistry': 94}, {'name': '陈志强', 'chinese': 65, 'math': 70, 'english': 68, 'physics': 72, 'chemistry': 66}, {'name': '赵晓燕', 'chinese': 85, 'math': 78, 'english': 82, 'physics': 79, 'chemistry': 83}, {'name': '孙建国', 'chinese': 72, 'math': 75, 'english': 70, 'physics': 74, 'chemistry': 71}, {'name': '周雨桐', 'chinese': 98, 'math': 96, 'english': 94, 'physics': 97, 'chemistry': 95}, ] name = 'admin' password = '123456' @app.route('/', methods=['GET', 'POST']) def hello_world(): error= None if request.method == 'POST': newname = request.form['username'] newwd = request.form['password'] if newname == name and newwd == password: return redirect(url_for('admin_view')) else: error = '用户名或密码错误!' return render_template("index.html", error=error) @app.route('/admin') def admin_view(): return render_template('admin.html', students=students) # 删除 @app.route('/admin', methods=['POST']) def delete_student(student_id, db=None, student=None): try: # 在这里执行删除操作 db.session.delete(student) db.session.commit() return jsonify({'success': True}) except: return jsonify({'success': False, 'message': '删除失败'}) #增加 @app.route('/add', methods=['GET','POST']) def add(): if request.method == 'POST': name = request.form['name'] chinese = request.form['chinese'] math = request.form['math'] english = request.form['english'] physics = request.form['physics'] chemistry = request.form['chemistry'] students.append({ 'name': name, 'chinese':chinese, 'math':math, 'english': english, 'physics':physics, 'chemistry': chemistry }) return render_template('admin.html') else: return "添加失败" return render_template('add.html') if __name__ == '__main__': app.run(debug=True)
最新发布
11-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值