博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql join操作
阅读量:6846 次
发布时间:2019-06-26

本文共 2848 字,大约阅读时间需要 9 分钟。

join的类型

1.  内联结:将两个表中存在联结关系的字段符合联结关系的那些记录形成记录集的联结。

2.  外联结:分为外左联结和外右联结。

 

案例背景

create table java (name varchar(255));insert into java values ('java1'),('java2'),('blue'); create table mysql (name varchar(255));insert into mysql values ('mysql1'),('mysql2'),('blue');

 

内联结

select * from java,mysql where java.name=mysql.name;SELECT * FROM java  JOIN mysql ON java.name=mysql.name;SELECT * FROM java INNER JOIN mysql ON java.name=mysql.name;SELECT * FROM java CROSS JOIN mysql ON java.name=mysql.name;SELECT * FROM java  STRAIGHT_JOIN  mysql ON java.name=mysql.name;

这四个语句都是内联结,返回结果都是

+------+------+| name | name |+------+------+| blue | blue |+------+------+
  • table_reference条目中的每个逗号都看作相当于一个内部联合
  • 默认的JOIN都是INNER JOIN
  • CROSS JOIN从语法上说与INNER JOIN等同
  • STRAIGHT_JOIN与JOIN相同。除了有一点不一样,左表会在右表之前被读取。STRAIGH_JOIN可以被用于这样的情况,即联合优化符以错误的顺序排列表。

内联结的语法如下:

join_table:    table_reference [INNER | CROSS] JOIN table_factor [join_condition]  | table_reference STRAIGHT_JOIN table_factor  | table_reference STRAIGHT_JOIN table_factor ON condition

 

外联结

左联结

SELECT * FROM java LEFT JOIN mysql ON java.name=mysql.name;

结果是

+-------+------+| name  | name |+-------+------+| java1 | NULL || java2 | NULL || blue  | blue |+-------+------+

所以从上面结果看出,因为java表中的java1和java2记录的name没有在mysql表中有对应name,因此为空,但java 所有的列栏仍有java1和java2记录,mysql表所有列栏为NULL。而剩下的blue的那条记录就是java表和mysql表内连接的结果。

 

如果对于在LEFT JOIN中的ON或USING部分中的右表没有匹配的记录,则所有列被设置为NULL的一个行被用于右表。如果一个表在其它表中没有对应部分,您可以使用这种方法在这种表中查找记录:

SELECT * FROM java LEFT JOIN mysql ON java.name=mysql.name WHERE mysql.name IS NULL;

该sql找出在java的人,但是不在mysql里的人,这里明显是人员'java1'和'java2'符合要求。

 

右联结

SELECT * FROM java RIGHT JOIN mysql ON java.name=mysql.name;

返回结果是

+------+--------+| name | name   |+------+--------+| NULL | mysql1 || NULL | mysql2 || blue | blue   |+------+--------+

右联结和左联接结果类似,只是这次是mysql表保存所有的结果集。

外联结的语法

join_table:| table_reference LEFT [OUTER] JOIN table_reference join_condition  | table_reference NATURAL [LEFT [OUTER]] JOIN table_factor  | table_reference RIGHT [OUTER] JOIN table_reference join_condition  | table_reference NATURAL [RIGHT [OUTER]] JOIN table_factor

 

USING(column_list)子句

用于为一系列的列进行命名,这些列必须同时在两个表中存在

SELECT java.*,mysql.* FROM java LEFT JOIN mysql USING (name);

结果返回

+-------+------+| name  | name |+-------+------+| java1 | NULL || java2 | NULL || blue  | blue |+-------+------+

 

联结的运算顺序

SELECT * FROM t1 LEFT JOIN (t2, t3, t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c);--相当于SELECT * FROM t1 LEFT JOIN (t2 CROSS JOIN t3 CROSS JOIN t4) ON (t2.a=t1.a AND t3.b=t1.b AND t4.c=t1.c)

括号对于join的顺序的影响

SELECT t1.id,t2.id,t3.id FROM t1,t2 LEFT JOIN t3 ON (t3.id=t1.id) WHERE t1.id=t2.id;--实际上这么执行SELECT t1.id,t2.id,t3.id FROM t1,(  t2 LEFT JOIN t3 ON (t3.id=t1.id)  ) WHERE t1.id=t2.id;--应该这么写SELECT t1.id,t2.id,t3.id FROM (t1,t2) LEFT JOIN t3 ON (t3.id=t1.id) WHERE t1.id=t2.id;

在这里括号是相当重要的,因此以后在写这样的查询的时候我们不要忘记了多写几个括号,至少这样能避免很多错误

转载地址:http://vbsul.baihongyu.com/

你可能感兴趣的文章
IBM发布迄今最强的量子处理器,面向商业和科研用途
查看>>
AWS推出OpenJDK长期支持版本Amazon Corretto
查看>>
V8引擎内存消耗的分析和优化
查看>>
Go语言很好很强大,但我有几个问题想吐槽
查看>>
C# 8的Ranges和递归模式
查看>>
UCloud全年营收 11.9 亿元,净利润 7715 万元
查看>>
Java工程师的成长路线图是什么?
查看>>
前端大神用React刻了一个Windows XP
查看>>
gulp-eagle 一个可以快速使用gulp构建前端项目的工具
查看>>
Beaker:一个基于Electron的点对点Web浏览器
查看>>
单例中静态属性的额外作用
查看>>
具有可操作性的敏捷工具
查看>>
活在伟大的Scrum团队是什么感觉
查看>>
Apache Maven JDeps插件3.0.0版本发布
查看>>
360重磅开源性能监控平台ArgusAPM
查看>>
腾讯云DevOps技术揭秘:新时代运维重器Tencent Hub最佳实践
查看>>
在项目中引入领域驱动设计的经验
查看>>
Serverless应用现状调查结果出炉!
查看>>
试水区块链出版?纽约时报在招人了
查看>>
iOS开源项目周报0105
查看>>