sql server 合并2个查询结果 sql合并查询结果生成新表_sql多行合并成一行


一.视图

  1. 什么是视图?


sql server 合并2个查询结果 sql合并查询结果生成新表_sql多行合并成一行_02


数据库里有很多表,表里存放的是实际数据。当我们通过客户端连接到数据库开始使用视图时视图会先运行它里面的SQL查询语句,从这个表里面查找出数据保存到一张临时表里。为什么叫临时表呢?这是因为当客户端与数据库的连接断开以后这个表会被自动删除,故它是临时的,不是保存在数据库中的表。所以,视图本身不存放数据,它存放的是SQL查询语句。

2. 如何创建视图?

sql server 合并2个查询结果 sql合并查询结果生成新表_sql多行合并成一行_03


creat view 视图名称(<视图列名1>,<视图列名2>,…)
as
<select查询语句>;


查询语句中列的顺序要与视图名称后括号里列的顺序要一一对应。

下面看一个例子:图中列的名称可以不一样,但是它们两个是有一一对应关系的。通过这个例子也可以看出视图中存放的不是数据而是SQL查询语句。


sql server 合并2个查询结果 sql合并查询结果生成新表_sql server 合并2个查询结果_04


下图展示的是在客户端里创建视图的步骤。


sql server 合并2个查询结果 sql合并查询结果生成新表_sql server 合并2个查询结果_05


  1. 运行写好创建视图的SQL语句
  2. 选择视图,鼠标右键选择刷新就可以看到创建好视图的名称。

练习:创建视图


sql server 合并2个查询结果 sql合并查询结果生成新表_sql删除某一行_06


3. 如何使用视图?

sql server 合并2个查询结果 sql合并查询结果生成新表_sql多行合并成一行_07


定义好的视图的使用方法:在from子句中用视图名称代替表名就可以了。

如果在工作中需要频繁的按性别去汇总,这样就不需要每次都重写SQL语句了。直接定义好视图后就可以使用了。

4.视图有什么用?

  1. 如果在工作中需要频繁的按性别去汇总,这样就不需要每次都重写SQL语句了。直接定义好视图后就可以使用了。有了视图以后我们就可以通过非常简单的SQL语句随时得到我们想要的汇总结果,特别是在进行汇总及复杂的查询条件导致SQL语句非常庞大时,使用视图可以帮助我们提高效率。
  2. 当原表里的数据更新之后视图也会更新,可以保证数据的最新状态,非常灵活方便。
  3. 视图不需要保存数据,可以节省存放数据设备的空间。

5.注意事项

  1. 避免在视图的基础上再去创建视图,多重视图会降低SQL的性能和效率
  2. 不能向视图中插入数据,否则会报错。

二. 子查询

之前查询条件都是具体的值,如成绩大于60分,如果现在查询条件需要从表里就获取如成绩大于平均成绩的学生有哪些,这就需要用到“子查询”。

  1. 什么是子查询?

子查询是一次性的视图。是在SQL查询子句中直接写定义视图的SQL查询语句,说白了就是在一个select查询语句中嵌套了另一个select查询语句。图片中as后的“按性别汇总”也即是子查询的名称。它的名称是一次性的,不会像视图的名称一样可以保存在硬盘中而是在SQL查询语句运行结束以后便立马消失,所以可以把它看作一个临时表。

当SQL语句中有子查询时会先运行子查询再运行外部的查询语句。

图片中的SQL查询语句第一步先运行子查询得到一个临时表,第二步将第一步的查询结果作为外部查询的一部分,也即是说from子句再从这个临时表中查找数据。

2. 如何使用子查询?

sql server 合并2个查询结果 sql合并查询结果生成新表_sql server 合并2个查询结果_08


图片中的子查询放到了from子句里面,它也可以放到where子句中与in、any、all一起使用从而构建出复杂的查询条件。使用方法是在in、any、all括号里面放入子查询。


sql server 合并2个查询结果 sql合并查询结果生成新表_sql多行合并成一行_09


下面我们通过一个例子学“in子查询”


sql server 合并2个查询结果 sql合并查询结果生成新表_sql删除某一行_10


sql server 合并2个查询结果 sql合并查询结果生成新表_sql删除某一行_11


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 子查询返回的值不止一个_12


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 多行数据合并一行_13


这道题目要用到后面将提到的关联子查询:


select  *
from score as a 
where 成绩=(
select min (成绩)
from score as b
where b.课程号=a.课程号 );


any子查询、all子查询

它们必须与比较运算符一起使用。

下面通过一个例子学习any子查询(与some子查询相同)

练习:那些学生的成绩比课程0002的全部成绩里的任意一个高呢?


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 多行数据合并一行_14


哪些学生的成绩比课程0002的全部成绩里的都高呢?


sql server 合并2个查询结果 sql合并查询结果生成新表_sql多行合并成一行_15


3. 子查询有什么用?

sql server 合并2个查询结果 sql合并查询结果生成新表_sql多行合并成一行_16


什么情况会使用子查询呢?在生活中如果你是偶尔用车那么打车比较方便,但是如果家里有老人小孩时需要频繁使用车那么买个汽车会比较方便,这是使用车的两种场景。同样地,根据你的使用目的,如果是偶尔使用查询语句,就相当于一个子查询,就没必要保存成一个视图,直接用就可以了;但是如果频繁使用某一个SQL查询语句,那么就可以保存成视图方便使用。

4. 注意事项

all得到的不是数字而是一个集合,故“a>3*all(b)”这种写法是不正确的。


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 子查询返回的值不止一个_17


  1. 避免使用多层嵌套子查询。由于子查询的层数是没有限制的,随着子查询嵌套越来越多,整个SQL语句会变得很难看懂,后面维护也不好维护,性能会变得很差。
  2. 子查询的as关键字和子查询的名称都是可以省略的。但我们平时练习时尽量不要省略,养成良好的书写习惯。

最后,我们看下子查询的查询语句及运行顺序。


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 多行数据合并一行_18


三.标量子查询

  1. 什么是标量子查询?

下面我们看一个例子。要取出大于平均成绩学生的学号和成绩,虽然图中的SQL查询语句也满足我们的查询条件,但是由于在where子句中不能使用汇总函数,因此这样的SQL语句运行以后会报错。那究竟什么样的SQL查询语句会满足上述查询条件呢?这时标量子查询就可以发挥它的作用了。


sql server 合并2个查询结果 sql合并查询结果生成新表_sql删除某一行_19


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 子查询返回的值不止一个_20


之前学到的子查询是返回多行结果也有可能返回一行数据。而标量子查询是在子查询基础上做了特殊限制,即必须且只能返回一行一列的查询寻结果也就是返回的是一个单一的值。由于标量子查询返回的是一个单一的值,故它的返回值可以与比较运算符一起使用。

sql server 合并2个查询结果 sql合并查询结果生成新表_sql多行合并成一行_21


只要用到单一值,都可以通过标量子查询获取到

2. 如何使用标量子查询?

标量子查询的书写位置并不局限于上例的where子句中,通常使用但某一值的地方都可以使用标量子查询。在图片中把标量子查询放到select子句里做查询结果的这一列都是平均值81.125分。


sql server 合并2个查询结果 sql合并查询结果生成新表_sql删除某一行_22


3. 标量子查询有什么用呢?

标量子查询是子查询的一种,普通子查询是返回多行结果也有可能返回一行数据。而标量子查询是在子查询基础上做了特殊限制,即必须且只能返回一行一列的查询寻结果也就是返回的是一个单一的值。由于标量子查询返回的是一个单一的值,故它的返回值可以与比较运算符及in、all、between等一起使用从而实现复杂的查询条件。


sql server 合并2个查询结果 sql合并查询结果生成新表_sql多行合并成一行_21


4. 注意事项

图片中的错误是该子查询会返回多行,在一行select子句中不能返回多行数据,故会报错。


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 子查询返回的值不止一个_24


练习:大于平均成绩学生的学号和成绩


sql server 合并2个查询结果 sql合并查询结果生成新表_sql删除某一行_25


四. 关联子查询

  1. 什么是关联子查询?如何使用?

以下图为例:


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 子查询返回的值不止一个_26


这里起到关键作用的就是where子句的关联条件,它的含义是按课程号对成绩表分组,同一组里的数据和这一组的平均成绩去比较。由于作为比较对象的都是同一张成绩表,为了进行区别分别使用了s1和s2两个别名,在使用关联子查询时需要像红框里那样使用表的别名去使用表里的列名。

根据下面图片看一下关联子查询是如何起作用的:


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 多行数据合并一行_27


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 多行数据合并一行_28


第一步,运行子查询,子查询是查出每个组的平均成绩。因为子查询里关联条件的存在,子查询只返回与s1.课程号同一组的平均成绩,所以这里的子查询每次只返回一行结果。

所以子查询这个关联条件保证了只返回当前组的数据。

第二步,将第一行的数据的成绩与子查询得到的平均成绩比较,这样就是同一组数据在比较。

3. 关联子查询有什么用?

当每个组里进行比较时要用到关联子查询。关联子查询是在子查询里有了一个关联条件。


sql server 合并2个查询结果 sql合并查询结果生成新表_sql server 合并2个查询结果_29


练习:


sql server 合并2个查询结果 sql合并查询结果生成新表_sql server 合并2个查询结果_30


五.如何用SQL解决业务问题


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 多行数据合并一行_31


六.各种函数

下图为一些常用函数,用的时候查即可~


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 子查询返回的值不止一个_32


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 子查询返回的值不止一个_33


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 子查询返回的值不止一个_34


sql server 合并2个查询结果 sql合并查询结果生成新表_sql server 合并2个查询结果_35


下面为该篇文章总结~


sql server 合并2个查询结果 sql合并查询结果生成新表_sql server 合并2个查询结果_36


七.sqlzoo题目练习


sql server 合并2个查询结果 sql合并查询结果生成新表_sql删除某一行_37


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 多行数据合并一行_38


sql server 合并2个查询结果 sql合并查询结果生成新表_sql server 合并2个查询结果_39


sql server 合并2个查询结果 sql合并查询结果生成新表_sql 多行数据合并一行_40


sql server 合并2个查询结果 sql合并查询结果生成新表_sql server 合并2个查询结果_41


sql server 合并2个查询结果 sql合并查询结果生成新表_sql server 合并2个查询结果_42


sql server 合并2个查询结果 sql合并查询结果生成新表_sql删除某一行_43


sql server 合并2个查询结果 sql合并查询结果生成新表_sql server 合并2个查询结果_44


sql server 合并2个查询结果 sql合并查询结果生成新表_sql server 合并2个查询结果_45


sql server 合并2个查询结果 sql合并查询结果生成新表_sql删除某一行_46