Inner join 基于连接谓词将两张表(A和B)的列组合在一起,产生新的结果表;
这是将两张表进行联合查询;
左外连接:又称左连接;左表中所有数据都会包含;
右连接:右表中的所有数据都包含;
注意后面的条件;
保留了B表中的数据;
mysql中并不支持Full Join
使用UNION ALL连接左连接和右连接;
实现;
这种不需要使用连接关键词(关联条件)的操作;
表中记录的更新:
关联查询加上分组查询;
子查询可以转换为join语句达到转换的效果;
行列转换
生成唯一序列号
删除重复数据
行转列的应用场景;
行显转换为列显,列显转换为行显;
使用case语句;
上表权限是逗号分隔的形式进行分开;
变成每个权限占一行;
alter table test add/drop column moblie varchar(100);
update test set moblie=’,,*’where id =1;
在字段后对表级进行设置主键;
在子查询中匹配两个值;
解决同属性多值过滤问题;
计算累进进税类问题;
子查询:本身是一个Select语句,实现镶嵌,当一个查询时另一个查询的条件时,称之为子查询;
子查询的的结果集不会重复;
select user_name from user1 where id in(select user_id from user_kills);
user_id 在user_kills表中是重复出现的。但是,在子查询结果中是没有重复的;
子查询该成连接:
select a.user_name from user1 a join user_kills b on a.id=b.user_id;
出现了数据重复;
select distinct a.user_name from user1 a join user_kills b on a.id=b.user_id;
加上这个关键词就避免出现数据重复;
注意把子查询转换成连接的时候,连接的关键字是不是一对多或者多对多的关系,记得对结果集进行去重;
sql语句是描述性语言,子查询符合这种描述的特点,但是使用join连接可以优化查询的结果;
以上是单列查询,如果是多列进行查询;
通常使用关联的形式进行查询;
select user_id,max(kills) as cnt from user_kills group by user_id;
select a.user_name,b.timestr,kills from user1 a join user_kills b on a.id = b.user_id join(select user_id )
解决同一属性多值过滤;
skill多值进行过滤
使用join来进行查询,满足需求;
这是同时取出了user_skills表中的三个数据;通过join进行连接,最后where加上查询的条件进行过滤;
select a.user_name,b.skill,d.skill,e.skill from user1 a
left join user1_skill b on a.id = b.user_id and b.skill = ‘念经’and
b.skill_level>0
left join user1_skill c on a.id = c.id and c.skill=’变化’and c.skill>0
left join user1_skill d on d.id = d.id and d.skill=’腾云’and d.skill>0
left join user1_skill e on e.id= e.id and e.skill=’浮水’and e.skill>0;
将唐僧这条数据过滤掉;
在上述sql语句后加上这个条件:
where(case when b.skill is not null then 1 else 0 end)
(case when c.skill is not null then 1 else 0 end)
(case when d.skils is not null then 1 else 0 end)
(case when e.skils is not null then 1 else 0 end)
使用更为简便的方法来实现需求;