MySQL左连接查询是连接查询中的一种方式,下面就为您介绍MySQL左连接查询中的一些问题谈论,如果您感兴趣的话,不妨一看。
我这里所说的主表是指在连接查询里MySQL以哪个表为主进行查询。比如说在MySQL左连接查询里,一般来说左表就是主表,但这只是经验之谈,很多时候经验主义是靠不住的,为了说明问题,先来个例子,建两个演示用的表categories和posts:
先注意一下每个表的索引情况,以后会用到,记得随便插入一点测试数据,不用太多,但怎么也得两行以上,然后执行以下
结果如下所示:
在join查询的explain的结果中,第一行表示的表就是主表。所以说在此查询里categories是主表,而在我们的经验里,LEFT JOIN查询里,左表(posts表)才应该是主表,这产生一个根本的矛盾,MySQL之所以这样处理,是因为在我们的WHERE部分,查询条件是按照categories表的字段来进行筛选的,且categories表刚好存在合适的索引,所以在查询时把categories表作为主表更有利于缩小结果集。
那explain结果中的Using temporary; Using filesort又是为什么呢,为什么created或category_id_created索引无效呢?这是因为主表是categories表,从表是posts表,而我们使用从表的字段去Order BY,这通常不是一个好选择,最好改成主表字段。不过很多时候改不了,那就没招了。
再看一个比较怪异的例子:
这个例子里posts表仍然是从表,但是按照从表排序的结果却没有出现文件排序和临时表,这是因为已经确定了categories.id,所以主表相当于一个只有一行数据的常量表了,从表根据category_id_created索引在连接的同时自然就得到排序后的结果。但换个角度看,既然categories.id都是确定的了,那类似这样的需求,我们一般就不会再使用LEFT JOIN查询了,而会分成两个独立的查询去检索categories和posts才对。
主观上一旦搞错了主表,可能怎么调整索引都得不到高效的SQL,所以在写SQL时,比如说在写MySQL左连接查询时,如果希望左表是主表,那么就要保证在WHERE语句里的查询条件尽可能多的使用左表字段,进而,一旦确定了主表,也最好只通过主表字段去ORDER BY。
注意:大多数情况下,使用从表字段去排序都是低效的,我最初的例子误导了大家,已更正。
【编辑推荐】
mysql修改表结构的实现方法
MySQL内存表heap使用总结归纳
实例讲解MySQL连接查询
教您如何实现MySQL多表插入
MySQL修复表的两个小技巧
已知F是双曲线x^2/4-y^2/12=1的左焦点,A(1,4),P是双曲线右支上的动点,则PF+PA的最小值为?
a=2 b=2*3^1/2 c=(4+12)^1/2=4
F1是右焦点(4,0)
PF+PA=PF1+2a+PA (双曲线的一种定义方法)
=(PF1+PA)+4
<=AF1+4 (APF三点共线取等号,即P取P时)
=[(1-4)^2+(4-0)^2]^1/2+4
=(3^2+4^2)^1/2+4
咏春拳的心法有哪些?
咏春拳心法理论: (1)中线理论:中线者由人体头顶至尾闾(尾龙骨)之线。 若将敌我之中线连接使成一个中线平面。 若配合“朝面追形”我们在进攻和防守方面是绝对的有利.在进攻方面,我们沿着中线配合“朝面追形”向敌方中线攻击,这是敌我最短之距离;同等拳速拳轨、近者自然较快击中。 再看我们若向敌方左或右攻击、对方很容易卸去我们之力.但若我们向敌方中线攻击。 对方则甚难卸力,而且受力较重。 在防守方面,我们守中线配合“朝面追形”及沿着中线平面以分水方法去消解,这也是消法之最短行轨。 (2)朝面追形:与对方朝正面对面者为“朝面”。 若不能“朝面”(如对方面向其他方向)我们之面沿着中线平面追望对方中线之形者是为“追形”。 咏春对敌时尽可能是正面朝敌的。 无论敌方环绕着我走向任何方向我们必定朝面追形向着敌方。 其好处如下:①防守方面:简化敌人向我们进攻的来向。 因为正面之攻击,敌人向我们进攻之来向只限于九路。 九路者即左上、左中、左下、中上、中中、中下、右上、右中、右下。 因此我们对敌人来势较易捉摸。 ②进攻方面:配合中线理论。 我们较易击中目标及敌人受力较重。 ②出手快而影少;仅手美同时到达敌人,所以出手时不用转。 动勃颈。 因此出手之影(先兆)会很少。 而且左右手很易相互兼顾。 (3)埋踩理论:咏春出手或防守大多数是手踩紧贴着中线平面的、好处如下:①巧方面:可抢中线以达最短距离和最重之攻击。 ②守方面:一方面埋踩本身已保护身体若干重要部分,另方面守中线以达最短距离之防守; (4)收踩理论:永春出手后(不论是攻或守)手和手臂均不再蓄力,手踩微曲是为收踩。 这样除了有利自己同一双手能立刻再作攻击外,在防守方面使敌方难以取我们之关节并守位方面亦会较紧密。 (5)“来留去送”心法.“来留”者对方向我们击来之手法,我们除了消外最好尽可能将其留住,以便利用咏春桥手相接之感觉将其控制。 “去送”者当敌方发强力向我们去来,我们利用手法把击来之方向改变,令其攻击不能击中我们,若可能我们应再加力顺其势向那改变后的方向送去,令敌失势或把式用老。 (6)“甩手直冲”心法:“甩手”者是指当对方突然将与我相接之桥手撤去(不论何任何方面)。 每当对方“甩手”,我们应以第一时间发招冲出直攻敌方为之“直冲”。 “朱留去送”和“甩手直冲”心法,是从离手练习锻炼出来的。 (7)攻守同期;当我们消对方之攻击时,在可能范围内我们应同一时期发招攻向对手。 这样将会由被动变主动而达到后发制。

sql表连接查询的区别`inner join、left join、rightjoin、outer join举例说明·
inner join(等值连接) 只返回两个表中联结字段相等的行 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 INNER JOIN 语法: INNER JOIN 连接两个数据表的用法: SELECT * from 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号 INNER JOIN 连接三个数据表的用法: SELECT * FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号 INNER JOIN 连接四个数据表的用法: SELECT * FROM ((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号 INNER JOIN 连接五个数据表的用法: SELECT * FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表5 ON Member.字段号=表5.字段号 连接六个数据表的用法:略,与上述联接方法类似,大家举一反三吧:) 注意事项: 在输入字母过程中,一定要用英文半角标点符号,单词之间留一半角空格; 在建立数据表时,如果一个表与多个表联接,那么这一个表中的字段必须是“数字”数据类型,而多个表中的相同字段必须是主键,而且是“自动编号”数据类型。 否则,很难联接成功。 代码嵌套快速方法:如,想连接五个表,则只要在连接四个表的代码上加一个前后括号(前括号加在FROM的后面,后括号加在代码的末尾即可),然后在后括号后面继续添加“INNER JOIN 表名X ON 表1.字段号=表X.字段号”代码即可,这样就可以无限联接数据表了:)
发表评论