MySQL中Left Join用法

MySQL中Left Join用法MySQL 中 LeftJoin 用法 nbsp 例子 nbsp user 表 nbsp idname nbsp nbsp 1libk nbsp 2zyfon nbsp 3daodao nbsp user action 表 nbsp user idaction nbsp nbsp 1jump nbsp 1kick nbsp 1jump nbsp 2run nbsp 4swim nbsp sql nbsp selectid

MySQL中Left Join用法 
例子: 
user表: 
id name 
——— 
1 libk 
2 zyfon 
3 daodao 
user_action表: 
user_id action 
————— 
1 jump 
1 kick 
1 jump 
2 run 
4 swim 
sql: 
select id, name, action from user as u 
left join user_action a on u.id = a.user_id 
result: 
id name action 
——————————– 
1 libk jump ① 
1 libk kick ② 
1 libk jump ③ 
2 zyfon run ④ 
3 daodao null ⑤ 
分析: 
注意到user_action中还有一个user_id=4, action=swim的纪录,但是没有在结果中出现,而user表中的id=3, name=daodao的用户在user_action中没有相应的纪录,但是却出现在了结果集中因为现在是left join,所有的工作以left为准.结果1,2,3,4都是既在左表又在右表的纪录,5是只在左表,不在右表的纪录。 
结论: 
我们可以想象left join 是这样工作的从左表读出一条,选出所有与on匹配的右表纪录(n条)进行连接, 形成n条纪录(包括重复的行,如:结果1和结果3),如果右边没有与on条件匹配的表,那连接的字段都是null.然后继续读下一条。 
引申: 
我们可以用右表没有on匹配则显示null的规律, 来找出所有在左表,不在右表的纪录, 注意用来判断的那列必须声明为not null的。 
如: 
sql: 
select id, name, action from user as u 
left join user_action a on u.id = a.user_id 
where a.user_id is NULL 
(注意:1.列值为null应该用is null 而不能用=NULL 
2.这里a.user_id 列必须声明为 NOT NULL 的) 
result: 
id name action 
————————– 
3 daodao NULL 
Tips: 
1. on a.c1 = b.c1 等同于 using(c1) 
2. INNER JOIN 和 , (逗号) 在语义上是等同的 
3. 当 MySQL 在从一个表中检索信息时,你可以提示它选择了哪一个索引。 
如果 EXPLAIN 显示 MySQL 使用了可能的索引列表中错误的索引,这个特性将是很有用的。 
通过指定 USE INDEX (key_list),你可以告诉 MySQL 使用可能的索引中最合适的一个索引在表中查找记录行。 
可选的二选一句法 IGNORE INDEX (key_list) 可被用于告诉 MySQL 不使用特定的索引。 
4. 一些例子: 
mysql> SELECT * FROM table1,table2 WHERE table1.id=table2.id; 
mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id; 
mysql> SELECT * FROM table1 LEFT JOIN table2 USING (id); 
mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id 
-> LEFT JOIN table3 ON table2.id=table3.id; 
mysql> SELECT * FROM table1 USE INDEX (key1,key2) 
-> WHERE key1=1 AND key2=2 AND key3=3; 
mysql> SELECT * FROM table1 IGNORE INDEX (key3) 
-> WHERE key1=1 AND key2=2 AND key3=3; 
以下为mysql官方关于join的工作原理及注意事项的说明 
5.2.6 How MySQL Optimises LEFT JOIN and RIGHT JOIN 
A LEFT JOIN B in MySQL is implemented as follows: 
The table B is set to be dependent on table A and all tables that A is dependent on. 
The table A is set to be dependent on all tables (except B) that are used in the LEFT JOIN condition. 
All LEFT JOIN conditions are moved to the WHERE clause. 
All standard join optimisations are done, with the exception that a table is always read after all tables it is dependent on. If there is a circular dependence then MySQL will issue an error. 
All standard WHERE optimisations are done. 
If there is a row in A that matches the WHERE clause, but there wasn” 
If you use LEFT JOIN to find rows that don’t exist in some table and you have the following test: column_name IS NULL in the WHERE part, where column_name is a column that is declared as NOT NULL, then MySQL will stop searching after more rows (for a particular key combination) after it has found one row that matches the LEFT JOIN condition. 
RIGHT JOIN is implemented analogously as LEFT JOIN. 
The table read order forced by LEFT JOIN and STRAIGHT JOIN will help the join optimiser (which calculates in which order tables should be joined) to do its work much more quickly, as there are fewer table permutations to check. 
Note that the above means that if you do a query of type: 
SELECT * FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) 
WHERE b.key=d.key 
MySQL will do a full scan on b as the LEFT JOIN will force it to be read before d. 
The fix in this case is to change the query to: 
SELECT * FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d (d.key=a.key) 

WHERE b.key=d.key

原文地址:http://blog.163.com/jdxxf@126/blog/static/1/

















































































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223254.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午2:30
下一篇 2026年3月17日 下午2:30


相关推荐

  • 移动端触摸touchstart监听事件[通俗易懂]

    移动端触摸touchstart监听事件[通俗易懂]click、mousedown等事件适用于PC端,在移动端会有一定时间的延迟,所以更好的优化移动端体验,要用touch事件,1、首先要添加一个监听事件,监听移动端行为element.addEventListener(event,function,useCapture)我这里是针对浏览器行为,所以监听事件为//添加触摸监听事件,如果手指触摸到阴影…

    2022年6月19日
    74
  • kotlin数组和集合

    kotlin数组和集合一 Kotlin 数组 1 对象数组由 Kotlin 的 main 函数的写法 可以看出 Kotlin 中的对象数组写法与泛型的写法很像 funmain args Array lt String gt 声明对象数组的三种形式 1 使用 arrayOf 函数和指定的数组元素创建数组 Java 写法 String params1 str1 str2 str

    2026年3月17日
    2
  • java中数组转成list_java定义数组并赋值

    java中数组转成list_java定义数组并赋值Java数组转List的四种方式小结

    2022年8月23日
    11
  • navicat premium15生成手动激活码失败(注册激活)

    (navicat premium15生成手动激活码失败)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html40ZKSWCX8G-eyJsaWNlbnNlSWQi…

    2022年4月2日
    473
  • Win10命令提示符快捷键汇总

    Win10命令提示符快捷键汇总Win10 命令提示符快捷键汇总点这 电脑资源库 2016 09 01 即便你平时经常用到 Windows 命令提示符 可能也会对本文将提到的快捷键数量感到惊讶 其实我们可以使用快捷键来简化命令提示符中的选择操作 或对文本进行重复操作 下面我们会列出完整列表 大家都知道命令提示符是 Windows 中必不可少的一个系统管理的强有力工具 用户可以使用各种命令实现一些图形界面难以企及的管理方式

    2026年3月26日
    2
  • pycharm使用anaconda

    pycharm使用anaconda目录一 安装 anaconda 二 创建新的 env 三 配置 pycharm 已有项目切换已经建好的 anacondaenv 已有项目切换新建的 anacondaenv 需要新创建 env 新建项目时设置 anacondaenv 之前一直在 windows 环境使用 pycharm 加上 virtualenv 方式开发 最近由于本地多个 virtualenv 比较混乱 所以尝试切换 anaconda 一 安装 anaconda 下载地址 https www anaconda com products individual windows

    2026年3月27日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号