高级查询(1)
1. 行转列的概念
2. CASE WHENTHEN ELSE应用(重点)
3. 聚合函数SUM实现行转列(重点)
4. 行转列的分组筛选(重点)
5. 行转列的除NULL查询(难点)
一:CASE WHEN THEN ELSE END 的应用:
目的: 根据不同的列值进行判断,输出我们指定的值
使用场景: 可以实现类似JAVA中的if条件结构的用法,根据不同的值进行
流转。
语法:
select 列名,CASE 列名1 WHEN ‘值1’ THEN ‘输出值’end
from 表名
实际代码应用:
select *,CASE items WHEN '苹果7' THEN ‘iphone 7’end
from 表名
ELSE:
加在 THEN 输出的值后面,END结束之前
实际代码应用:
select *,CASE items WHEN '苹果7' THEN 'iphone7' ELSE
END from 表名
好处: 可以过滤非指定输出的结果(处理NULL)
二:SUM()函数:
目的: 对列进行 求和并返回一个值。
使用场景:可以在数据库中将我们需要累计统计的列进行累加,并最终发挥
一个值。
语法:select sum(列名) from 表名
实际代码应用: select sum(id) fromsalecounts
三: Group By( )函数:
目的:对已经查询出的数据进行划分区域,划分区域的目的就是为了保证,
相同的值只出现一次。保证数据在统计时的唯一性。
使用场景:对已经查询的数据进行2次筛选,去掉重复部分。
语法: select * from 表名 group by date
实际代码应用: selectdate,items,sum(CASE items WHEN '苹果7'
THEN counts end ) as '日销量数'
from salecounts groupby date
四:ELSE 对结果进行除NULL
目的:对已经查询出的结果,进行处理,达到我们想要的效果。
使用场景: 查询结果中有NULL 就可以使用
实际代码: select date,items,sum(
CASE items '苹果7' THEN counts ELSE 0
)END AS '输出'
from salecounts
五: 使用IFNULL对结果进行处理
目的:对已经查询出的结果,进行处理,达到我们想要的效果。
使用场景: 查询结果中有NULL 就可以使用
实际代码:select date,
IFNULL(sum(CASEitems WHEN '苹果7' THEN counts
end),0)as '苹果7',
IFNULL(sum(CASE items WHEN '苹果鼠标' THEN
counts end),0) as '苹果鼠标'
from salecounts group by date
注意:
使用IFNULL的时候中间不能有空格,必须保证两个单词是连贯的
高级查询(2)
目标:
1.表连接
(1)内连接
(2)左外连接
(3)自连接
2.高级子查询
(1)单行子查询
(2)多行子查询
(3)EXISTS子查询
一:表连接
目的:在已经符合主外键关系的基础上,进行联合查询,得到多张表的
数据。
使用场景:需要涉及到多表联合查询数据时使用。
语法:select 表名1.列名1,表名1.列名2,表名2.列名1
from 表名 1 ,表名2
where 表名1.相关列=表名2.相关列
二:左外连接|右外连接
目的:表结构特殊,两张表中各有对方没有关系的数据,需要将没有相关
主外键关系的列内容进行输出。
使用场景:
需要将左表或右表的内容全部输出。
语法:
SELECT 别名1.列名1,别名2.列名1
FROM 表1 as 别名1
[LEFT | RIGHT] JOIN 表2 as 别名2
ON 别名1.条件列名 = 别名2.条件列名
注意点:
left join right join 都可以代表from的意思。
on 可以代表我们的where
left join: 将左侧表作为主表全部显示。
right join: 将右侧表作为主表全部显示。
某些表中有一些独立列值,是必须要输出的,那么根据实际开发情况
选择其输出在左边或者右边。
左边|右边: 主表
主表概念:谁是主表谁全部输出,如果输出的内容没有对应的,则是
NULL。
三:子查询
错误解答:
错误代码:[Err] 1242 - Subquery returns more than 1 row
解决方案: 查看是不是内部子查询返回了多个值,并且外部使用的是‘=’
错误代码:[Err] 1241 - Operand should contain 1 column(s)
解决方案: 查看外部子查询的列需要接受几个结果,如果内部子查询返回
了多列,在使用时就会出现这个错误。
单行子查询: 返回 一个结果 用‘=’接受结果。
多行子查询: 返回 多个结果 用 ’in‘ 接受结果。
相关子查询: 返回true 或者 false ,如果返回true则执行外部SQL,否则不执行
exists: 如果有结果返回true 否则 false
not exists: 在exists结果的基础上取反。寻找非exists结果的其他值。