navicat保存查询语句_SQL复杂查询
摘要
视图#1
⼦查询#2
标量⼦查询#3
关联⼦查询#4
如何使⽤SQL解决业务问题#5
各种函数#6
视图#1
什么是视图?⽤⼀句话概述的话,就是“从SQL的⾓度来看视图就是⼀张表”。但是使⽤视图时并不会将数据保存到存储设备之中,⽽且什么是视图?
也不会将数据保存到其他任何地⽅。实际上视图保存的是SELECT语句,我们从视图中读取数据时,视图会在内部执⾏该SELECT语句并创建出⼀张临时表。
视图有什么⽤?视图的优点⼤体有两点:
视图有什么⽤?
第⼀:由于视图⽆需保存数据,因此可以节省存储设备的容量。。
第⼆:可以将频繁使⽤的SELECT语句保存成视图,这样就不⽤每次都重新书写了。创建好视图之后,只需在SELECT语句中进⾏调⽤,就可以⽅便地得到想要的结果了。特别是在进⾏汇总以及复杂的查询条件导致SELECT语句⾮常庞⼤时,使⽤视图可以⼤⼤提⾼效率。⽽且,视图中的数据会随着原表的变化⾃动更新。视图归根到底就是SELECT语句,所谓“参照视图”也就是“执⾏SELECT语句”的
意思,因此可以保证数据的最新状态。这也是将数据保存在表中所不具备的优势。
本⽂内的⼤部分代码将以下⾯表的数据进⾏演练,分别是student、score。
student表
sql中select是什么意思
score表
如何创建视图?
通过数据库管理⼯具Navicat输⼊查询语句:
create view 视图名称(<;视图列名1>,<;视图列名2>,...)
as
<select 查询语句>;
练习:创建 按性别汇总 视图。
create view 按性别汇总(性别,⼈数)
as
select 性别,count(*)
from student
group by 性别;
创建完成后,在Navicat对应的数据库下刷新视图,就能显“按性别汇总的视图。
有哪些注意事项?
注意事项1:避免在视图下再创建视图,对多数DBMS来说,多重视图会降低SQL的性能。
注意事项2:不能往视图⾥插⼊数据,不然会报错。
⼦查询#2
什么是⼦查询?⼦查询以视图为基础。⼦查询的特点概括起来就是“⼀张⼀次性视图”,⼦查询将⽤来定义视图的SELECT语句直接⽤于FROM⼦句当中。
在FROM⼦句中直接写定义视图的SQL查询语句,运⾏顺序是先运⾏括号⾥⾯的再运⾏括号外⾯的。
练习:⽤⼦查询实现查询student表中各个性别的⼈数。
select 性别,⼈数
from(
select 性别,count(*) as ⼈数
from student
group by 性别
) as 按性别汇总;
如何使⽤⼦查询?
常见的⼦查询搭配有:...in(⼦查询)、...any(⼦查询)、...all(⼦查询)
练习:出每个课程⾥ 成绩最低的 学号。
当⽤select语句直接查每个课程⾥ 成绩最低的学号,这⾥select语句识别的 学号 会随机出现。
正确的⽅法是分解成两个步骤(分析思路):
-- 第1步:查出每门课程的最低成绩有哪些值
select 课程号,min(成绩)
from score
group by 课程号
-- 第2步:在成绩表⾥查这些值
select 学号,成绩
from score
where 成绩 in(80,60,80);
-- 合并后的SQL,括号⾥⾯的语句为⼦查询
select 学号,成绩
from score
where 成绩 in(
select min(成绩)
from score
group by 课程号
);
在使⽤any时需要与⽐较运算符⼀起使⽤
...any(⼦查询)与some(⼦查询)相同,⼀般表达式为:
select <;列名1>
from <;表名1>
where <;列名1> > any(⼦查询);
练习:哪些学⽣的成绩⽐课程0002的全部成绩⾥的任意⼀个⾼呢?
(分析思路)
第1步:课程0002的全部成绩,⽐如是(10,30)——any括号⾥⾯的语句
select 成绩
from score
where 课程号 = '0002';
第2步:某个学⽣的成绩⼤于任意⼀个第1步⾥的成绩,就符合条件——任意⼀个⾼any(⼦查询)select 学号,成绩
from score
where 成绩 > any(⼦查询);
完整代码:
select 学号,成绩
from score
where 成绩 > any(
select 成绩
from score
where 课程号='0002'
);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论