相关文章推荐
逼格高的抽屉  ·  FileNotFoundException ...·  1 年前    · 

在这里插入图片描述
这是一个简单的左连接,左表的数据都会查询在结果中。

在这里插入图片描述
左连接,on后面跟了2个条件,其中第二个条件对左表进行筛选,可以看到在结果中并没有起作用。因为on的条件筛选是对2张表生成的全连接(笛卡尔积)临时表进行的筛选,这时a.id=4的数据实际上是被去除掉了,因为没有a.id=4且a.id=b.id的数据。但是由于是left join,所以在结果中没有的左表数据a.id=4又被加了上去。
由此可见left join 的时候,on后面对左表的数据加筛选条件是没有用的。

在这里插入图片描述
将上一个on的条件放到where里面之后就生效了。因为对on执行过后的临时表(此时该临时表还是有a.id=4的数据的,因为左连接),进一步筛选的时候,将a.id=4的数据去掉了。

在这里插入图片描述
on后面的条件筛选过后将a.id=3且b.id=3(因为条件b.id != 3)和a.id=4且a.id=b.id(因为条件a.id=b.id)的数据都去除掉了,由于左连接,左表的数据又被加上了。

在这里插入图片描述
inner join 的时候由于的内连接,on后的条件对2账表的临时表(笛卡尔积)筛选去除了左表的a.id=3且右表的b.id=3的数据以及不满足条件a.id=b.id的数据。

在这里插入图片描述
inner join时将左表的筛选放到on或者where后面会生效。只是执行的先后顺序有所不同,on后面的是在执行join的时候筛选,where的是对join执行之后的临时表筛选。
具体执行顺序参考:https://blog.csdn.net/weixin_44457814/article/details/106715422

在连表操作的时候,其实是先进行了2表的全连接(笛卡尔积,也就是所有能组合的情况a.rowCount*b.rowCount),然后根据on后面的条件进行筛选,最后如果是左连接或者右连接,再补全左表或者右表的数据。

a表b表查询1:这是一个简单的左连接,左表的数据都会查询在结果中。查询2:左连接,on后面跟了2个条件,其中第二个条件对左表进行刷选,可以看到在结果中并没有起作用。因为on的条件筛选是对2张表生成的全连接(笛卡尔积)临时表进行的筛选,这时a.id=4的数据实际上是被去除掉了,因为没有a.id=4且a.id=b.id的数据。但是由于是left join,所以在结果中没有的左表数据a.id=4又被加了上去。由此可见left join 的时候,on后面对左表的数据加筛选条件是没有用的。查询3
Join on/inner join on/full join on/full outer join on/left join on/right join on/cross join on; 在使用jion时,on和where 条件 的区别;
本篇以hive sql 解析器来讨论问题,spark sql 的处理方法类似,大家可自行测试。 本篇不分析各种会造成数据倾斜的原因,数据倾斜形成的原因也只是简单提及。本篇主要分析在 sql 中进行 join 操作时,会造成数据倾斜的常见两大原因,以及解决方法。我认为这两种情况,在工作中出现的几率较高,所以单独拿出来讨论。 数据倾斜造成的原因(懂的可以跳过不看): 这个问题简单来说,就是分布式处理中,每个节点处理的数据量差距较大,而导致单节点负担过重,处理时间过长,而拖慢整个作业的执行时间。在hive中,常见的处理引擎
多语⾔系统的数据库设计 多语⾔系统的数据库设计 之前做的项⽬涉及到中国⼤陆和纽伦新港的⽤户使⽤,也就需要做成⼀个多语⾔的系统,现在总结下其中⼀些经验和思考。 ⾸先我们需要确认我们要做的系统,多语⾔到底是要做多少种语⾔,以后会不会要求增加更多的语⾔。⽐如我们做⼀个给中国⼤陆和纽伦新 港使⽤的系统,可以确定的语⾔就是简体中⽂、繁体中⽂和英语,⽽且可以确定以后也不会增加语⾔。确定以后是否需要增加语⾔这⼀点很 重要,决定了我们在数据库设计时,是否需要考虑多语上的扩展性。 先说下在数据库设计时,可以有以下⽅案实现多语: ⼀、为每个多语字段建⽴对应语⾔的字段列。 ⽐如我们有⼀个客户表,记录了客户Id、客户名称、客户地址、客户电话等,其中客户名称和客户地址是多语的,⽽且需要⽀持简体中⽂、 繁体中⽂和英语,于是我们可以将客户表设计如下: create table Client ( ClientId int primary key, NameChs nvarchar(50), NameCht nvarchar(50), NameEng varchar(200), AddressChs nvarchar(50), AddressCht nvarchar(50), AddressEng varchar(200), TelephoneNumber varchar(50) ) 这样做的优点是容易 理解 ,容易查询,⼀个客户实例对应的就是数据库中的⼀条数据,与普通的⾮多语数据库⽆异,⽽且由于没有形成新的 表,所以也不需要额外的 Join ,所以查询效率很⾼: insert into Client values(1,'⼯商银⾏','⼯商銀⾏','ICBC','中国北京','中國北京','China,Beijing','13811255555'); select * from Client c where c.ClientId=1 ⼆、建⽴统⼀的翻译表,在翻译表中使⽤多列存储多语⾔,然后在实体表中外键引⽤翻译表。 create table Translation ( TranslationId int primary key, TextChs nvarchar(200), TextCht nvarchar(200), TextEng varchar(200), ) create table Client ( ClientId int primary key, NameTranId int references Translation(TranslationId), AddressTranId int references Translation(TranslationId), TelephoneNumber varchar(200) ) 这样要查询数据时,需要将Translation表 JOIN 2次,获得对应的Name和Address的多语。 insert into Translation values(10,'⼯商银⾏','⼯商銀⾏','ICBC'); insert into Translation values(20,'中国北京','中國北京','China,Beijing'); insert into Client values(1,10,20,'13811255555'); select c.ClientId,c.TelephoneNumber, tn.TextChs as NameChs,tn.TextCht as NameCht,tn.TextEng as NameEng, ta.TextChs as AddressChs,ta.TextCht as AddressCht,ta.TextEng as AddressEng from Client c inner join Translation tn on c.NameTranId=tn.TranslationId inner join Translation ta on c.AddressTranId=ta.TranslationIdwhere where c.ClientId=1 以上介绍的⽅法都是将多语作为列输出,也就是说有多少种语⾔就会有多少对于的列,不利于语⾔的增加下⾯再介绍将语⾔以数据⾏的形式保 存的设计⽅法,这种⽅法可以在后期任意增加语⾔⽽不改动数据库Schema. 三、将每个表中需要多语的字段独⽴出来,形成⼀个对应的多语表。 多语表外键关联原表,每个需要多语的字段在多语表中对应⼀列,多语表中增加"语⾔"字段。同样以Client表为例,那么对应的表结构是: create table Client ( ClientId int primary key, TelephoneNumber varch
select * from user left join order as o on o.userId = o.id 会查询出主表的所有数据 on 后 多 条件 主表 条件 例子 ,该条 sql 执行后发现,还是会查询主表的所有数据(相当于没起作用) select * from user 以上语句表示table1左连接table2,连接 条件 为table1.column = table2.column 且table1.column2 = table2.column2 在使用 多个 条件 时,还可以使用其他运算符,如 OR 或 NOT ,来创建复杂的连接 条件 。 SELECT column1, column2, ... FROM table1 LEFT JOIN table2 ON table1.column = table2.column AND (table1.column2 = table2.column2 OR table1.column3 = table2.column3); 上面语句表示table1左连接table2,连接 条件 为table1.column = table2.column 且(table1.column2 = table2.column2 或 table1.column3 = table2.column3)