spark sql 查询的数据保存_运用SQL对数据进行复杂查询

da28b4918df2a4ffd7b7ef16bbc0b7eb.png

一、视图

1.1 定义

从 SQL的角度来看,视图就是一张表。实际上,在SQL语句中并不需要区分哪些是表, 哪些是视图,只需要知道在更新时它们之间存在一些不同就可以了。视图和表的区别只有一个,那就是“是否保存了实际的数据”。 通常,我们在创建表时,会通过INSERT语句将数据保存到数据库之中,而数据库中的数据实际上会被保存到计算机的存储设备(通常是硬盘)中。因此,我们通过SELECT语句查询数据时,实际上就是从存储设备(硬盘)中读取数据,进行各种计算之后,再将结果返回给用户这样一个过程。 但是使用视图时并不会将数据保存到存储设备中,而且也不会将数据保存到其他任何地方。实际上视图保存的是 SELECT 语句。我们从视图中读取数据时,视图会在内部执行该 SELECT 语句并创建出一张临时表。

因此,视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。此外,视图中存放的不是数据,而是SQL查询语句。

1.2 创建视图

方法一:使用语句创建视图
CREATE VIEW [view name]([column name1], [column name2],... [column nameN])
AS
SELECT [column name1], [column name2],... [column nameN]
FROM [table name]
...;
方法二:在客户端中创建视图

进入数据库实例管理界面,展开要增加视图的数据库实例 -> 右击【Views】 -> 点击【Create View】-> 进入视图编辑界面,输入查询语句,点击【Apply】-> 右击【Views】 -> 点击【Refresh All】。

9662875d565ef36e969f3cc8392f24f1.png

1.3 使用创建好的视图

在FROM子句中使用视图名称代替表名称即可。

举例:以下查询用来检索订购了某种产品的顾客。

SELECT cust_name, cust_contact
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_id
AND OrderItems.order_num = Orders.order_num;

现在,把整个查询包装成一个名为ProductCustomers的虚拟表,则可以如下轻松地检索出相同的数据:

SELECT cust_name, cust_contact FROM ProductCustomers
WHERE prod_id = 'RGAN01';

这条语句通过WHERE子句从视图中检索特定数据。当MySQL处理此查询时,它将指定的WHERE子句添加到视图查询中已有的WHERE 子句中,以便正确过滤数据。 可以看出,视图极大地简化了复杂SQL语句的使用。利用视图,可一次性编写基础的SQL,然后根据需要多次使用。

1.4 删除视图

方法一:使用语句删除视图
DROP VIEW [view name];
方法二:在客户端中删除视图

选中想要删除的视图 -> 右击选择【Drop View...】

27e868e85a52b466e4ee9e4a48db84a0.png

1.5 视图的好处

  • 视图无需保存数据,因此可以节省存储设备的容量。
  • 重复使用SQL语句,简化复杂的SQL操作。
  • 视图中的数据可以随原数据表的改变而更新,因为视图存放的不是视图,而是查询语句。因此,每次使用视图时,视图都需要从原数据表中调用数据。
  • 可节省存放数据的空间,因为视图不需要保存数据。
  • 保护数据。因为视图使用的是表的一部分而不是整个表,因此可授予用户访问表的特定部分权限,而不是整个表的访问权限。

1.6 注意事项

  • 定义视图时不能使用ORDER BY子句,因为视图和表一样,数据行都是没有顺序的
  • 避免在视图的基础上再去创建视图,因为多重视图会降低SQL的性能和效率
  • 不能往视图中插入数据
  • 必须唯一命名,即不能给视图取与别的视图或表相同的名字
  • 创建视图必须具有足够的访问权限。这些权限通常由数据库管理人员授予。

二、子查询

2.1 定义

子查询可以看作是一次性的视图,即在SQL中直接写定义视图的查询语,也可以理解为在一个SELECT查询语句中嵌套了另一个SELECT查询语句。

SQL运行顺序:先运行子查询,再运行外部的查询语句。

2.2 子查询的使用

(1) 利用子查询进行过滤:在WHERE语句后使用IN(子查询)、 ANY(子查询)、 ALL(子查询)或者SOME(子查询)。

(2) 作为计算字段使用子查询。假如需要显示学生信息及每个学生的选课数:

SELECT *, (
SELECT COUNT(*) AS 'number_of_classes' FROM scores
WHERE students.id = scores.id) AS counts
FROM students;

2.3 练习

练习一:哪些学生的成绩比课程0002的任意成绩都高呢?

SELECT * FROM scores 
WHERE score > 
ANY(SELECT score FROM scores WHERE c_id = '0002');

练习二:哪些学生的成绩比课程0002的所有成绩都高呢ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值