Mysql数据库—高阶语句二(连接查询、交集、case)
一、连接查询
1.1 内连接-inner join
1.MySQL中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合
2.通常在from子句中使用关键字inner join来连接多张表,并使用 on 子句设置连接条件
3.只返回两个表中连接字段相等的行
select 字段 from 表1 inner join 表2 on 表1.字段=表2.字段
1.2 左连接-left join
1.返回包括左表中的所有记录和右表中连接字段相等的记录
2.左连接中,左表的记录会全部表示出来,而右表只会显示符合搜索条件的记录,不足的地方均为null
select 字段 from 表1 left join 表2 on 表1.字段=表2.字段
1.3 右连接-right join
1.返回包括右表中的所有记录和左表中连接字段相等的记录
2.右连接中,右表的记录会全部表示出来,而左表只会显示符合搜索条件的记录,不足的地方均为null
select 字段 from 表1 right join 表2 on 表1.字段=表2.字段
二、视图-create view
1.可以被当做虚拟表或存储查询
2.视图与表格不同,视图是建立在表格之上的一个架构,本身并不实际存储资料
3.试图与临时表不同,用户退出或者与数据库连接断开不会消失
4.视图不含有数据,只存储定义,可以简化复杂的查询,如果对几个表进行查询,还要进行统计排序等操作时,写sql语句很麻烦,我们可以通用视图简化查询
create view 视图表名 as 'select 语句';
三、联集-union
3.1 作用
将两个sql语句的结果合并,两个sql语句所产生的的字段需要相同的数据
3.2 语法
1.union:生成的结果数据将没有重复,且按照字段的顺序的进行排序
select 字段 from 表格1 union select 字段 from 表格2
2.union all:将生成的结果数据都列出来,无论重复
select 字段 from 表格1 union all select 字段 from 表格2
四、交集值-取两个sql语句结果的交集
4.1 方法1:distinct inner join on.../using(...)
select distinct 相同字段 from 表格1 inner join 表格2 on 表格1.相同字段=表格2.相同字段 #可以用别名代替
4.2 方法2:union all + group by + having count(../*) > 1
select 别名.相同字段 from
(select 相同字段 from 表格1 union all select 相同字段 from 表格2) 别名 group by 别名.相同字段 having count(*) > 1;
我们进行这样的拆分:
1.select 相同字段 from 表格1 union all select 相同字段 from 表格2;
2.用group by进行分组汇总:select 别名.相同字段 from (select 相同字段 from 表格1 union all select 相同字段 from 表格2)别名 group by 别名.相同字段;
3.再加having条件语句判断:如果大于1,表示两张表内的相同字段出现过多次,则是交集
4.3 方法三:外查询 in (内查询 另一张表查询的结果)
select distinct 相同字段 from 表格1 where 相同字段 in (select 相同字段 from 表格2);
4.4 方法四:left join where ... is not null
select distinct 别名1.相同字段 from 表格1 别名1 left join 表格2 别名2 on 表格1.相同字段=表格2.相同字段 where 别名1.相同字段 is not null;
我们可以这样拆分:
1.先左连接把数据全联集起来:select * from 表格1 别名1 left join 表格2 别名2 on 表格1.相同字段=表格2.相同字段;
2.再加where语句判断值不为空的就是交集:select * from 表格1 别名1 left join 表格2 别名2 on 表格1.相同字段=表格2.相同字段 where 别名1.相同字段 is not null;
3.再最后distinct去重
同理用right join 也可以达到,这边我就不多加阐述了,直接看图即可
五、取无交集值
#只能取到一个表内的无交集数据
1.select distinct 相同字段 from 表格1 where 相同字段 not in (select 相同字段 from 表格2);
#只能取到一个表内的无交集数据
2.select distinct 别名1.相同字段 from 表格1 别名1 left join 表格2 别名2 on 表格1.相同字段=表格2.相同字段 where 别名1.相同字段 is null;
#能取到所有无交集的数据在同一表内
3.select 别名.相同字段 from
(select 相同字段 from 表格1 union all select 相同字段 from 表格2) 别名 group by 别名.相同字段 having count(*) = 1;
六、case-用作if-then-else逻辑
select 字段1,case 字段1
when '条件1' then 结果1
when '条件2' then 结果2
...
else 结果n
end '新字段2',字段3 from 表格;