SQL基础教程读书笔记-3
5 复杂查询
5.1 视图
1.表和视图的区别
表:保存的是实际的数据
视图:保存的是SELECT语句。从视图读取数据时,视图会在内部执行该SELECT语句并创建出一张临时表。
2.视图的优点
① 无需保存数据,因此可以节省存储设备的容量。
② 可以将频繁使用的SELECT语句保存成视图。
3.创建视图
CREATE VIEW 视图名称 (<视图列名1>,<视图列名2>,...)
AS <select语句 style="font-size: inherit; color: inherit; line-height: inherit; margin: 0px; padding: 0px;">;
CREATE VIEW ProductSum (product_type,cnt_product)
AS
SELECT product_type,COUNT(*) FROM Product
GROUP BY product_type;
4.删除视图
DROP VIEW 视图名称;
DROP VIEW ProductSum ;
5.多重视图
以视图为基础创建的视图;应避免使用,多重视图会降低SQL的性能。
6.视图的限制
①定义视图时不能使用ORDER BY子句
因为视图和表一样,数据行都是没有顺序的。
②对视图进行更新
必须满足一系列条件(既没有聚合又没有结合的SELECT子句),归根结底是对表的更新。
1)SELECT子句中未使用DISTINCT
2)FROM子句中只有一张表
3)未使用GROUP BY 子句
4)未使用HAVING 子句
5.2 子查询
子查询的特点概括起来就是一张一次性视图。
SELECT product_type,cnt_product
FROM
(SELECT product_type,COUNT(*) AS cnt_peoduct
FROM Product
GROUP BY product_type) AS ProductSum;
1.执行顺序
子查询作为内层查询会首先执行。
2.增加子查询的层数
子查询的层数原则上没有限制,但是,随着子查询嵌套层数的增加,SQL语句会变得越来越难读懂,性能也越来越差。因此,应避免使用多层嵌套的子查询。
3.子查询的名称
原则上子查询必须设定名称。
4.标量(单一)子查询:返回单一值的子查询
必须只能返回一行一列的结果
优点:标量子查询的返回值可以用=或<>这样需要单一值的比较运算符之中。
书写位置:能够使用常数或列名的地方,无论是SELECT子句,GROUP BY子句,HAVING子句,ORDER BY子句,几乎所有地方都可以使用。
--在WHERE子句中不能使用聚合函数
SELECT product_id,peoduct_name,sale_price
FROM Product
WHERE sale_price > AVG(sale_price);
筛选价格处于上游的商品时,看似上述Sql语句可以满足我们的需求,但是WHERE子句中不能使用聚合函数,因此这样的Sql语句是错误的;这个时候标量子查询就可以发挥它的功效了。
SELECT product_id,peoduct_name,sale_price
FROM Product
WHERE sale_price > (SELECT AVG(sale_price)
FROM Product);
5.3 关联子查询
- 关联子查询会在细分的组内进行比较时使用
- 关联子查询和GROUP BY子句一样,也可以对表中的数据进行切分
- 关联子查询的结合条件如果出现在子查询中就会发生错误
只通过语言描述可能难以理解,让我们看一下具体示例。按照商品种类与平均销售单价进行比较。
我们并不是要以全部商品为基础,而是要以细分的组为基础,对组内商品的平均价格和各商品的销售单价进行比较。
--发生错误的子查询
SELECT product_id,peoduct_name,sale_price
FROM Product
WHERE sale_price > (SELECT AVG(sale_price)
FROM Product
GROUP BY product_type);
上述Sql出错的原因是因为该子查询会返回多行结果,并不是标量子查询。轮到关联子查询登场了。
SELECT product_id,peoduct_name,sale_price
FROM Product AS p1
WHERE sale_price > (SELECT AVG(sale_price)
FROM Product p2
WHERE p1.product_type = p2.product_type
GROUP BY product_type);
这里起到关键作用的就是在子查询中添加的WHERE子句的条件,该条件的意思就是,在同一商品种类中对各商品的销售单价和平均单价进行比较。
组合条件一定要写在子查询中
--错误的关联子查询书写方式
SELECT product_id,peoduct_name,sale_price
FROM Product AS p1
WHERE p1.product_type = p2.product_type
WHERE sale_price > (SELECT AVG(sale_price)
FROM Product p2
GROUP BY product_type);
该书写方式究竟违反了什么规则呢?
SQL基础教程读书笔记-3的更多相关文章
- SQL基础教程读书笔记-1
查询基础 2.2 算数运算符和比较运算符 2.2.1算数运算符 + - * / 需要注意NULL 5 + NULL 10 - NULL 1 * NULL 4 / NULL NULL / 9 NULL ...
- SQL基础教程读书笔记-2
4 数据更新 4.1数据的插入 1.清单{①列清单 ②值清单列清单和值清单的数量必须保持一致.原则上,执行一次INSERT语句会插入一行数据对表进行全列INSERT时,可以省略表名后的列清单2.插入默 ...
- SQL Server2012 T-SQL基础教程--读书笔记(1-4章)
SQL Server2012 T-SQL基础教程--读书笔记(1-4章) SqlServer T-SQL 示例数据库:点我 Chapter 01 T-SQL 查询和编程背景 1.3 创建表和定义数据的 ...
- SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)
SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1 ...
- SQL Server2012 T-SQL基础教程--读书笔记(5-7章)
SQL Server2012 T-SQL基础教程--读书笔记(5-7章) SqlServer T-SQL 示例数据库:点我 Chapter 05 表表达式 5.1 派生表 5.1.1 分配列别名 5. ...
- 【索引】Objective-C基础教程-读书笔记
第1章 启程 http://www.cnblogs.com/duxiuxing/p/5492219.html 第2章 对C的扩展 第3章 面向对象编程的基础知识 第4章 继承 第5章 复合 第6章 ...
- 《Python基础教程读书笔记》
第1章 快速构造:基础知识 1.2交互式构造器 不强制分号,一行就是一行.可以加上分号 1.4数字和表达式 加.减.乘.除.整除.求余.指数.取反(-例如-2**2,**的优先级比-大) from _ ...
- 【Objective-C基础教程-读书笔记】第1章 启程
在第1章里面,作者主要以一种站在世界中心呼唤爱的姿态,给读者们打打鸡血洗洗脑,鼓励大家,投入时间学习Objective-C,值得啊! 首先,Objective-C既能用来开发OS X平台上的APP,又 ...
- Objective-C基础教程读书笔记(6)
第6章 源文件组织 到目前为止,我们讨论过的所有项目都是把源代码统统放入main.m文件中.类的main()函数,@interface和@implementation部分都被塞入同一个文件里.这种结构 ...
随机推荐
- VS2015 (C/C++) 生成的程序,不能在server2008上运行
项目本来是为Linux下运行做的,但是客户环境需要在windows下运行,幸好用的一些库是跨平台的. 于是用vs2015编译. 然后就发现在2008上却运行时库,装了2015的运行时库后, 在运行,就 ...
- 一个web应用的诞生(1)--初识flask
基于flask的web应用的诞生 Flask是一个非常优秀的web框架,它最大的特点就是保持一个简单而易于扩展的小核心,其他的都有用户自己掌握,并且方便替换,甚至,你可以在社区看到众多开源的,可直接用 ...
- python自动化--语言基础1--数据类型及类型转换
Python中核心的数据类型有哪些?变量(数字.字符串.元组.列表.字典) 什么是数据的不可变性?哪些数据类型具有不可变性数据的不可变是指数据不可更改,比如: a = ("abc" ...
- 使用maven搭建hibernate的pom文件配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- 浏览器输入URL到响应页面的全过程
B/S网络架构从前端到后端都得到了简化,都基于统一的应用层协议HTTP来交互数据,HTTP协议采用无状态的短链接的通信方式,通常情况下,一次请求就完成了一次数据交互,通常也对应一个业务逻辑,然后这次通 ...
- github的拉取、提交,创建分支与合并
前期准备: 1.安装git 官网地址:https://git-scm.com/(下载下来,直接下一步) 2.github账号(这有点废话) 3.配置github密钥 下载及安装好git后,右 ...
- POJ - 1182 食物链 并查集经典
思路:设r(x)表示节点x与根结点的关系,px表示x的根结点.记录每个节点与其父节点的关系,就能很方便知道每个节点以及和它的父节点的关系. struct node{ int par; //父亲节点 i ...
- Java--JDBC连接数据库(二)
本篇文章接着上篇文章,还剩下一个知识点是,可滚动的结果接集和可更新的结果集.一般默认情况之下,多结果集是不可以显式滚动,移动选择的.如果想要做到,需要指定一些参数,那么本篇就接着介绍如何操作可滚动的结 ...
- Oracle三层嵌套分页查询示例及rownum原理
eg:COMPONENT表数据如下 1.执行select * from (select com.*,rownum r_num from (select * from COMPONENT)com w ...
- caffe︱ImageData层、DummyData层作为原始数据导入的应用
Part1:caffe的ImageData层 ImageData是一个图像输入层,该层的好处是,直接输入原始图像信息就可以导入分析. 在案例中利用ImageData层进行数据转化,得到了一批数据. 但 ...