前言:
基础篇,大牛请绕行
今天用推进项目的时候,看到一条有点诡异的SQL语句,(SELECT…..) pic , 中间又没加as??
SELECT
course_base.*,
(SELECT pic FROM course_pic WHERE courseid = course_base.id) pic
FROM
course_base
先贴一下两张表
course_base表
course_pic表
查询条件:course_base.id = pic.courseid
结果:第一章表的基础上添加了第二章表的pic字段
一开始弄不懂那个SQL语句,对UNION查询也不熟悉,以为是UNION查询,于是折腾学习了一番。
UNION查询
描述
MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。是结果集进行上下合并,select后面的expression个数要一致,且类型要相近。
语法
MySQL UNION 操作符语法格式:
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT]
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];
DISTINCT: 可选,删除结果集中重复的数据。默认情况下 UNION 操作符已经删除了重复数据,所以 DISTINCT 修饰符对结果没啥影响。
ALL: 可选,返回所有结果集,包含重复数据。
示例
用上面的course_pic表为例
SELECT * FROM course_pic
union all
SELECT * FROM course_pic;
结果,courseid为297e7c……出现了两次,确实是上下整合了。去掉all就会把重复数据去掉。
回到那条有点个性的SQL,通过上面的学习表明UNION是上下连接,不是这种左右连接。后来想到了join(这才想到)
join查询
join常用的就是left join & [inner] join,笔者写join的思路是采用连线,举个例子。
a表(左表)name字段拼接b表(右表)vip字段
1、 让course_base 左连接到 course_pic, 两张表(a表和b表)拼在一起
2、 按条件 a.id = b.id 连线
- left join查询,左边的全部保留,右边的有联系的才保留,其余空隙为NULL
- join查询,左右两边有联系的保留
那么,回到那个挺有个性的SQL,改造一下
SELECT
course_base.*, pic
SELECT
course_base.*, pic
FROM
course_base
left join course_pic
on course_base.id = course_pic.courseid;
结果一样,,不过,以后还是用常规的join就好了,搞那么多花里胡哨的
希望对你有帮助!!