sql select 输出多行_SQL复杂查询入门

本文介绍了SQL查询中的视图、子查询和标量子查询概念,包括创建视图的注意事项、子查询的运行顺序、标量子查询的应用,并通过实例讲解了如何使用这些技巧解决业务问题。同时,还提到了如何理解和处理SQL报错信息,以及建议进行sqlzoo练习来提升技能。
摘要由CSDN通过智能技术生成

bfd550b89e1d11fba0b46f8ac7b9907c.png

1.视图

什么是视图?

视图中存放的是SQL查询语句,使用视图时,会运行视图里的SQL查询语句创建出一张临时表

如何创建视图

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

注意事项

(1)避免在视图的基础上再创建视图

(2)不能往视图里插入数据

练习

10d5389fa87004f065a2efc7fcef39ae.png

92071eb0f90ddb370e6047c1b81a3a64.png

2.子查询

什么是子查询?

in(子查询),any(子查询),all(子查询),在SQL中嵌套另一个SQL。

SQL运行顺序

1.先运行子查询

2.再运行查询语句的运作顺序

注意事项

(1)

  • a>3*all(b) 错误
  • a/3>all(b) 正确

all(b)是一堆数据的集合

(2)子查询避免多层嵌套

(3)select from 子查询可以省略as子查询名称

练习

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

#第一步:查找出每门课程的最低成绩有哪些值
select min(成绩) 
from course as b 
where b.课程号 = a.课程号;
#第二步:在成绩表里查找这些值对应的学号
select * 
from course as a 
where 成绩 =(80,60,80);
#最终SQL语句
select * 
from course as a 
where 成绩 = (
select min(成绩) 
from course as b 
where b.课程号 = a.课程号);

c3000f28e80e816c861bb5f5df4f41b2.png

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

#第一步:查找出课程0002的全部成绩
select 成绩
from course
where 课程号=0002;
#第二步比任意一个高any(子查询)
select 学号,成绩
from course
where 成绩 > any (子查询);
#最终SQL语句
select 学号,成绩
from course
where 成绩 > any (
select 成绩
from course
where 课程号=0002
);

f218cc6606612b00e5fb93de5db00e8b.png

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

#第一步:查找出课程0002的全部成绩
select 成绩
from course
where 课程号=0002;
#第二步比全部都高 all(子查询)
select 学号,成绩
from course
where 成绩 > all (子查询);
#最终SQL语句
select 学号,成绩
from course
where 成绩 > all (
select 成绩
from course
where 课程号=0002
);

534ecdff05781f76775d2f153054c415.png

3.标量子查询

什么是标量子查询?

返回的是单一值的子查询

注意事项

标量子查询不能返回多行结果,多行结果不能用在比较运算符

练习

例一:大于平均成绩学生的学号和成绩

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

aa13e0628660529e11975d0146fe8359.png

例二:处于差生和优等生之间的学生的学号和成绩

select 学号,成绩
from course
where 成绩 BETWEEN  (
select avg(成绩)
from course
where 成绩 <=60) and
(select avg(成绩)
from course
where 成绩 >=80)
;

805cc975b9841c812bb68544ae45a2d5.png

例三:标量子查询不一定用在where,还可以用在select

8c2839a7d0b33ee2d1af184c6112f20c.png

关联子查询

用于每个组里进行比较

练习

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

select 学号,课程号,成绩
from course as s1
where 成绩 >(select avg(成绩)
from course as s2
where s1.`课程号` =s2.`课程号`          #关联条件 s2仅在子查询里有效
GROUP BY 课程号
);

f22da7fe179cf2194c37152dbbc67807.png

如何用SQL解决业务问题

1.翻译成大白话

2.写出分析思路

3.写出对应SQL子句

如何看懂SQL报错信息

先看子查询然后逐一排查

各种函数

a4bfd3c19615d7cdde555bccaaaa6cfe.png

49db489815841ed511ee9aa336612f0d.png

034f2bb69b7c95a5e46e6d6f4360b62f.png

sqlzoo练习

088803f410d9753932e6b7caff5131f0.png

bd8ba921f50e9e96d7fb0001c480ab46.png

09e7b618037e3d2567c00a0443711e61.png

5ec153c77f1d0be6dcf949f33d5fb5f1.png

98778707d1b68e106b73c368eb81466a.png

a76a6f10c2ccf9b57db6b9c96914aeb9.png

5841d48d8fac26dc9330728efbeefec1.png

66a6e84973b574b640b71b51f46b39d5.png

37933dd22e48d8f303e1bedb8621ab1a.png

8d81b1af256420b1037a22b8ff9f60fc.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值