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) ,前提是两个表都有相同字段c1

2. 内连接[表1 inner JOIN 表2 on 过滤条件]和 , (逗号[表1,表2 where 过滤条件]) 在语义上是等同的

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;

7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN

在MySQL中,A LEFT JOIN B join_condition执行过程如下:

· 根据表A和A依赖的所有表设置表B。

· 根据LEFT JOIN条件中使用的所有表(除了B)设置表A。

· LEFT JOIN条件用于确定如何从表B搜索行。(换句话说,不使用WHERE子句中的任何条件)。

· 可以对所有标准联接进行优化,只是只有从它所依赖的所有表读取的表例外。如果出现循环依赖关系,MySQL提示出现一个错误。

· 进行所有标准WHERE优化。

· 如果A中有一行匹配WHERE子句,但B中没有一行匹配ON条件,则生成另一个B行,其中所有列设置为NULL。

· 如果使用LEFT JOIN找出在某些表中不存在的行,并且进行了下面的测试:WHERE部分的col_name IS NULL,其中col_name是一个声明为 NOT NULL的列,MySQL找到匹配LEFT JOIN条件的一个行后停止(为具体的关键字组合)搜索其它行。

RIGHT JOIN的执行类似LEFT JOIN,只是表的角色反过来。

联接优化器计算表应联接的顺序。LEFT JOIN和STRAIGHT_JOIN强制的表读顺序可以帮助联接优化器更快地工作,因为检查的表交换更少。请注意这说明如果执行下面类型的查询,MySQL进行全扫描b,因为LEFT JOIN强制它在d之前读取:

SELECT *

FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)

WHERE b.key=d.key;

在这种情况下修复时用a的相反顺序,b列于FROM子句中:

SELECT *

FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)

WHERE b.key=d.key;

MySQL可以进行下面的LEFT JOIN优化:如果对于产生的NULL行,WHERE条件总为假,LEFT JOIN变为普通联接。

例如,在下面的查询中如果t2.column1为NULL,WHERE 子句将为false:

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

因此,可以安全地将查询转换为普通联接:

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1; 这样可以更快,因为如果可以使查询更佳,MySQL可以在表t1之前使用表t2。为了强制使用表顺序,使用STRAIGHT_JOIN。

mysql数据库做关联查询_mysql 数据库join关联查询using(xxx)的作用相关推荐

  1. mysql怎么做排名并列_MySQL实现排名并查询指定用户排名功能,并列排名功能

    MySQL实现排名并查询指定用户排名功能,并列排名功能 表结构: CREATE TABLE test.testsort ( id int(11) NOT NULL AUTO_INCREMENT, ui ...

  2. linux mysql 实战_Linux平台MySQL多实例项目实施_MySQL数据库基础与项目实战06

    Linux平台MySQL多实例项目实施_MySQL数据库基础与项目实战06 视频教程学习地址 Oracle/MySQL数据库学习专用QQ群:336282998.189070296 学完风哥本课程能熟悉 ...

  3. mysql 关联查询_mysql数据库调优(二)

    第五.查询优化 1.查询慢的原因:网络因素.CPU.IO.上下文切换.系统调用.生成统计信息.锁等待时间等 2.优化数据库访问:查询性能地下的原因是访问的数据太多,某些查询不可避免的需要筛选大量的数据 ...

  4. mysql数据库实验3查询_mysql数据库(3)-查询

    数据库设计规范 查询 创建数据库.数据表 -- 创建数据库 create database python_test_1 charset=utf8; -- 使用数据库 use python_test_1 ...

  5. mysql数据库操作多表查询_MySQL数据库查询操作进阶——多表查询

    多表查询 在大部分情况下,我们用到的表都是彼此相关联的,所以我们会有相当大的需求用到跨表的查询,这个时候我们就需要将相关联的表连起来做多表查询. 多表查询分为连表查询和子查询,连表查询即将相关联的表连 ...

  6. mysql 脏数据查询_MySQL数据库02

    MySQL数据库 前言: 前面我们了解了什么是数据库,什么是MySQL数据库以及如何运用,接下来我们接着深入学习MySQL. (提前声明,以下所提供的事例不标准,仅供参考) 数据库的备份与还原: 备份 ...

  7. mysql数据库的查询_mysql数据库查询

    查询数据指从数据库中获取所需要的数据.查询数据是数据库操作中最常用,也是最重要的操作.用户可以根据自己对数据的需求,使用不同的查询方式.通过不同的查询方式,可以获得不同的数据.MySQL中是使用SEL ...

  8. MySQL数据库应用 多表查询_mysql数据库-多表查询

    今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建及多表的查询 掌握MYSQL中的表关系分析并能正确建表 昨天内容回顾: ​ 数据库的创建 : create ...

  9. MySQL实验四数据库的查询_MySQL数据库查询(实验四)

    MySQL数据库查询 准备工作:脚本文件xkgl.sql下载:xkgl脚本.sql 1.执行脚本xkgl.sql (创建xkgl库.表及插入数据),观察有无错误,如有记录错误信息,并解决. (1) 执 ...

  10. mysql数据库缓存为多久_mysql数据库查询缓存总结

    概述 查询缓存(Query Cache,简称QC),存储SELECT语句及其产生的数据结果.闲来无事,做一下这块的总结,也做个备忘! 工作原理 查询缓存工作原理如下: 缓存SELECT操作的结果集和S ...

最新文章

  1. 史上第二走心的 iOS11-Drag Drop 教程
  2. 图论 ---- E. Minimum Path(分层图最短路 用分层图对边权操作进行选择)
  3. Oracle数据字典
  4. cf英文名字格式好看的_cf英文名字大全_Michael、
  5. jqgrid定义多选操作
  6. Oracle 通过字段名查询其所在的表
  7. 简单的五子棋游戏(C语言)
  8. Axure RP 9(附授权码+安装教程)
  9. 修好了一个罗技鼠标,鼠标左键单击变双击问题解决了。
  10. syncthing同步慢_使用Syncthing在多个设备上同步文件
  11. android手机连不上wifi密码,修改wifi密码后手机连不上_修改wifi密码后手机不能上网-192路由网...
  12. STL学习之路(一)
  13. 高通使用/system/bin/r读取msm8916的gpio配置
  14. Check service:platformservice is now critical 原因分析
  15. springboot实现微信模板消息推送
  16. 淘宝卖家店铺订单API接口同步方案
  17. [CTF]Rabbit加密
  18. 图像分辨率、像素总数、文件大小之间的详细区别
  19. cometd: Bayeux Protocol
  20. java自动化测试语言高级之序列化

热门文章

  1. 40-400-044-运维-优化-MySQL order by 优化
  2. 【MySQL】MySQL 管理员必备技能 用户 权限 管理
  3. 【Kafka】Kafka BrokerEndPointNotAvailableException: End point with security protocol PLAINTEXT not
  4. Spark:java.io.IOException: Connection reset by peer
  5. 【Spark】扩展Spark Catalyst,打造自定义的Spark SQL引擎
  6. Spring : @Value注解
  7. Kudu : tablet=null, server=null, status=Timed out: can not complete before timeout: Batch
  8. 【Sentry】Sentry安装
  9. Java多线程学习十六:读写锁 ReadWriteLock 获取锁有哪些规则
  10. ORA-00257 archiver error. 错误的处理方法