DML数据操作语言之复杂查询
1.视图(View)
我们知道,在关系型数据库中,用来保存实际数据记录的是数据表。和表同等概念也是用来保存东西是:视图。
但是数据表是用来保存实际数据记录的,而视图是用来保存常用select语句的。
一个视图保存一条select语句。
使用视图的好处:
1.节省存储空间:
一般情况,如果我们希望将某条select语句的执行的结果表保存起来,我们就需要新建一张表,将结果表的数据记录保存在我们新建的这张表中。
这样,如果是少量数据还好,但是如果面对的大量的数据,这样势必会耗费去大量的存储空间。
如果选用视图,我们利用一个视图来保存这条select语句。当我们需要使用这条select语句执行之后的结果表的数据记录时,我们可以选取这个视图中
的select语句进行执行,执行之后就会形成一张保存了数据记录的临时表。
2.不用重新书写常用select语句
将常用的select语句保存为视图,我们在使用时,就可以不用每次都书写相同的select语句。其实这时候,就相当于我们将常用的select语句拷贝出来,
保存在我们本地的文本文件中,一个文本文件保存一个select语句,在使用的时候,找到相应的文本文件,进行执行。这个文本文件就是视图。
所以我们应该将常用的select语句保存在视图中。
创建视图的方法:
创建视图需要使用create view语句 ,基本语法格式:
create view <视图名> (<视图列名1>,<视图列名2>,......) as <select语句>;
(<视图列名1>,<视图列名2>,......)称为视图列名清单。
这里的视图列名相当于给后面的select语句中的列 起的别名。所以视图列名应该和select语句中的列名 进行一一对应。如果select语句中已经为列名指定了
别名,不需要再指定相同功能的视图列名,可以省略视图列名清单。
使用视图进行查询:
select <列名1>,<列名2>,...... from <视图名>;
这里from子句选择了视图,就相当于执行了该视图中的select语句,得到了一张保存了数据记录的结果表。
前面的select子句再在结果表中选出哪几列来进行显示,形成新的结果表。如果显示结果表的全部列,则使用 select * 。
由此可见,选取一条视图,至少执行了2次的select语句。
关于多重视图:
我们可以在一个视图保存的select语句,该select语句又选取了另一个视图。这样嵌套,形成了多重视图。
但是由于多重视图的可阅读性不好,建议不要使用。
视图的限制:
1.在视图保存的select语句中不能使用order by子句进行排序
该select语句可以使用 where子句,group by子句,having 子句。但是不能使用order by子句。
2.利用视图来增加,删除,更新原表数据记录
我们知道可以利用视图中保存的select语句,结合select语句来进行 使用视图进行查询。初次之外,我们还可以利用视图中保存的select语句,集合insert语句,
delete语句,update语句 ,来实现 利用视图来进行原表数据的增,删,改操作。
insert into <视图名> values (<值1>,<值2>,......);
但是 利用视图中保存的select语句 来实现增,删,改要保证 通过视图保存的select语句查询出来的结果表没有进行聚合操作(group by ,聚合函数等)。否则,
对于结果表的增,删,改操作,将无法与原表中的数据进行同步,破坏了数据的一致性。
比较有代表性的几个条件是:
select子句中不能使用distinct来去重;
from子句中只能有一张表;
不能使用group by子句;
不能使用having子句;
不能使用聚合函数;
删除视图:
删除视图需要用到drop view语句。基本语句格式是:
drop view <视图名>;
2.子查询
子查询就是将保存在视图中的select语句用于from子句中。如下格式:
select ...... from (select ..... from .....) as <子查询结果表的别名>;
其实子查询 和 视图的作用过程都是一样的 。 先通过写在后面的 select语句 进行查询得到一张子查询结果表,为该表起一个别名。
然后在通过前面的select语句对子查询结果表进行查询,形成最终的结果表。
需要注意的一点是:默认我们都需要为 查询出来的子查询结果表起一个别名。在其他数据库中需要使用as,在oracle数据库中为表起别名,
不能使用as。
select ...... from (select ..... from .....) <子查询结果表的别名>;
如果在子查询中再嵌套子查询,就形成了多层嵌套的子查询。 但是随着子查询嵌套层数的增加,SQL语句就变得越来越难读懂,而且执行
效率会下降。所以应该避免使用多层的嵌套子查询。
标量子查询:
标量子查询区别于普通子查询的是 :普通子查询 形成的结果表是保存有若干条记录的表。 标量子查询 形成的结果是一个数值。(也可看成是一行一列的一条记录)
标量子查询就是返回单一值的子查询。
由于标量子查询返回的是一个数值,所以在可以使用数值的子句中,均可以使用标量子查询。
select ..... from ...... where age <= (select avg(age) from tb_person);
select avg(age) from tb_person;子查询返回的是单一的数值,属于标量子查询。
3.关联子查询
关联子查询会在细分的组内进行比较时使用。
分析一种查询情况,根据学生的班级对学生进行分组,计算每个班级的平均总分,让后筛选出总分高于他所在班级平均总分的学生。
由于是分组内进行比较,需要使用关联子查询。
select t2.name , t2.score from tb_student as t2 where t2.score >= (select avg(score) from tb_student as t1 where t2.classId = t1.classId group by t1.classId);
可以看出通过
select avg(score) from tb_student as t1 group by t1.classId;
这个普通子查询,我们会得到N个班级的平均总分的一张表,表有N行记录。
但是这时前面的where子句 where t2.score >= ? 显然需要一个标量值进行比较,也就是需要一个标量子查询的结果。
这时在子查询中添加 的 where t2.classId = t1.classId 这样where子句 把每条记录的总分与 select子查询生成的结果表的总分 进行了一对一的关联。
也就是要比较一个学生的总分和平均总分的大小,先根据该学生的classId 在子查询生成的结果表中 找到这个班级的平均总分,然后再比较。
结合条件一定要写在子查询中。这是因为关联名称的作用域。
子查询中的可以使用 外层查询的关联名称 t1
但是外层查询不能使用 子查询的关联名称 t2
DML数据操作语言之复杂查询的更多相关文章
- 6.1课堂笔记—DML(数据操作语言),DQL查询语句
一.DML(数据操作语言) InnoDB MyISAM 支持事务 不支持事务 不支持全文索引 支持全文索引 支持外键约束 不支持 命令查看默认存储引擎 show variables like '%st ...
- DML数据操作语言
DML数据操作语言 用来对数据库中表的数据记录进行更新.(增删改) 插入insert -- insert into 表(列名1,列名2,列名3...) values (值1,值2,值3...):向表中 ...
- DML数据操作语言之增加,删除,更新
1.数据的增加 数据的增加要用到insert语句 ,基本格式是: insert into <表名> (列名1,列名2,列名3,......) values (值1,值2,值3,..... ...
- DML数据操作语言之查询(二)
当我们查询出了N条记录之后 ,我们知道一共是几条记录,或者这些记录某一字段(列值)的最大值,最小值,平均值等,就可以使用聚合函数. 1.聚合函数 聚合函数会将null 排除在外.但是count(*)例 ...
- DML数据操作语言之查询(一)
1.select语句基础 基本语句格式: select <列名>,.... from <表名>; select子句中列举出希望从表中查询出的列的名称,from子句则指定了选取 ...
- DML数据操作语言之谓词,case表达式
谓词:就是返回值是真值的函数. 前面接触到的“>” “<” “=”等称为比较运算符,它们的正式名称就是比较谓词.因为它们比较之后返回的结果是真值. 由于谓词 返回的结果是一个真值 ,即tr ...
- DML数据操作语言之常用函数
所谓函数,就是输入某一值,得到相应的输出结果的功能.相当于一个加工厂,给了原料,最终产出成品. 其中原料 就是参数(parameter). 产品 就是返回值. 函数大致可以分为以下五个种类: 算术函数 ...
- MySQL SQL DML (数据操作语言)
包括 SELECT, UPDATE, DELETE, INSERT SELECT 从数据库表中获取数据 用法 SELECT name FROM students; SELECT name,age FR ...
- DML数据操作语言练习
--创建表T_HQ_BM2 --create table t_hq_bm2 as select * from t_hq_bm; commit; --添加行内容 --insert into t_hq_b ...
随机推荐
- 安裝pycharm
一路按照這個教程走下來的.大體無誤. http://www.jianshu.com/p/042324342bf4 除了激活碼那裏,已經被cancel了,查找了很多辦法,最後發現衹要換成三個選項之一的 ...
- 【BZOJ1926】粟粟的书架(主席树,前缀和)
[BZOJ1926]粟粟的书架(主席树,前缀和) 题面 Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co ...
- PHP 接口 返回构造函数
我们写接口的时候,需要返回json数据,并且里面有错误码,错误信息 还有要返回的数据,这里我构造了一个函数 这里是针对TP5来写的,自己可以根据自己的框架来修改 这样就可以在返回的时候直接用info函 ...
- js和jquery设置disabled属性为true使按钮失效
设置disabled属性为true即为不可用状态. JS: document.getElementByIdx("btn").disabled=true; Jquery: $(& ...
- SQL Server将自己的查询结果作为待查询数据子列之二
嵌套子查询是SQL语句中比较常用的一种查询方法,开发过程中遇到查询需要将自己的某列作为待查询的数据,在参考别人的SQL语句的写法终于实现了自己需要的功能. 不太和谐查询语句如下: SELECT DIS ...
- Java实现mongodb原生增删改查语句
Java实现mongodb原生增删改查语句 2018-03-16 自动化测试时,需校验数据库数据,为了快速自动化,在代码中用原生增删改查语句操作mongodb 结构 代码 0 pom.xml < ...
- 移动端tab滑动和上下拉刷新加载
移动端tab滑动和上下拉刷新加载 查看demo(请在移动端模式下查看) 查看代码 开发该插件的初衷是,在做一个项目时发现现在实现移动端tab滑动的插件大多基于swiper,swiper的功能太强大而我 ...
- APNS IOS 消息推送
一.Apns简介: Apns是苹果推送通知服务. 二.原理: APNs会对用户进行物理连接认证,和设备令牌认证(简言之就是苹果的服务器检查设备里的证书以确定其为苹果设备):然后,将服务器的信息接收并且 ...
- java web需要好好掌握的一些东西
这是一些需要好好的复习的东西 本来存了个文档 怕整丢了 就在这里保存一下 java 基础 重点关注集合 如list hashmap等使用(有时间多看看hashmap的实现原理 问的比较多)多线程 ...
- 51ak带你看MYSQL5.7源码2:编译现有的代码
从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 目录: 51ak带你看MYSQL5.7源码1:main入口函数 51ak带你看MYSQL5.7源码2:编译 ...