第四关 复杂查询

1、视图

2、子查询

3、标量子查询

4、关联子查询

5、如何用SQL解决业务问题

6、各种函数

是什么?--如何用?---有什么用?--注意事项

  • 视图:存放SQL查询语句--临时表(不存放数据)

创建视图:create view 视图名称 as <select 查询语句>;

性别,人数)as select 性别,count(*) from student group by 性别;对应




sql server 不等于多个值写法 sql不等于多个条件_sql大于某个时间


sql server 不等于多个值写法 sql不等于多个条件_sql不等于_02


使用视图: 在from 子句中使用视图名称代替表名称

select 性别,人数 from 按性别汇总;


sql server 不等于多个值写法 sql不等于多个条件_sql server 不等于多个值写法_03


数据更新后,视图也会更新

有什么用:频繁使用的SQL保存为视图,或者繁琐的SQL方便使用

注意事项:不能往视图里面插入数据,不要在视图里面创建视图

自己创建了个视图:


sql server 不等于多个值写法 sql不等于多个条件_sql不等于_04


sql server 不等于多个值写法 sql不等于多个条件_sql不等于_05


使用视图:


sql server 不等于多个值写法 sql不等于多个条件_sql大于某个时间_06


  • 子查询(嵌套查询)

什么是:在from 字句中直接写定义视图中的SQL查询语句

Select 性别,人数 from (select 性别,count(*) as 人数 from student group by 性别 )as 按性别汇总;(先运行)

先运行子查询

使用子查询:in、any、all(子查询)

In(子查询): 找出每个课程里成绩最低的学号

第一步:查找出每门课程的最低成绩有哪些值

Select 课程号,min(成绩) from score group by 课程号;

第二步:在成绩表里查找这些值对应的学号

Select 学号,成绩 from score where 成绩 in ( 刚刚找的最低值)


sql server 不等于多个值写法 sql不等于多个条件_sql大于某个时间_07


...any(子查询) 任意一个

...all(子查询)=some(子查询) 所有数据

必须与比较运算符一起使用---等于、不等于、小于、大于、小于等于、大于等于

Select 列名1 from 表名1 where 列名1 >any (子查询);

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

第一步:找出课程0002的全部成绩,

第二步:某个学生的成绩 大于 任意一个第1步里的成绩,就符合条件

Select 成绩 from score where 课程号=‘0002’;

Select 学号,成绩 from score where 成绩 > any (Select 成绩 from score where 课程号=‘0002’);


sql server 不等于多个值写法 sql不等于多个条件_sql server 不等于多个值写法_08


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

Select 学号,成绩 from score where 成绩 > all (Select 成绩 from score where 课程号=‘0002’);


sql server 不等于多个值写法 sql不等于多个条件_sql不等于_09


偶尔使用:子查询

频繁使用:视图

子查询注意事项:

1、a>3*all(b)❌------a/3>all(b);√ all(b)得到的是集合,是多行数据

2、避免使用多层嵌套子查询

3、As 子查询名称 可省略

  • 标量子查询--只能返回一行、一列的值,单一值,可以和比较运算符使用

什么是标量子查询:

大于平均成绩学生的学号和成绩

Select 学号,成绩 from score where 成绩 >(select avg(成绩) from score);


sql server 不等于多个值写法 sql不等于多个条件_子查询_10


差生:成绩<=60

优等生 :成绩>80

介于这两个之间


sql server 不等于多个值写法 sql不等于多个条件_子查询_11


标量子查询不一定在where字句后,使用单一值就可以


sql server 不等于多个值写法 sql不等于多个条件_sql大于某个时间_12


注意事项:标量子查询不能返回多个行

  • 关联子查询--在每个组里进行比较

查找出每个课程中 大于对应课程平均成绩的学生

Select 学号,课程号,成绩 from score as s1 where 成绩 >(select avg(成绩)from score as s2 where s1.课程号=s2.课程号 group by 课程号);

S2仅在子查询里有效


sql server 不等于多个值写法 sql不等于多个条件_sql不等于_13


  • 如何用SQL解决业务问题

如何排错:先运行子查询,看是哪里问题

  • 函数(了解)


sql server 不等于多个值写法 sql不等于多个条件_sql server 不等于多个值写法_14


sql server 不等于多个值写法 sql不等于多个条件_子查询_15


sql server 不等于多个值写法 sql不等于多个条件_sql 不等于_16


sql server 不等于多个值写法 sql不等于多个条件_sql 不等于_17


sql server 不等于多个值写法 sql不等于多个条件_sql不等于_18