Mysql join连接
来源:互联网 发布:csgo淘宝买激活码 编辑:程序博客网 时间:2024/05/22 00:45
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);
结果返回
按 Ctrl+C 复制代码
按 Ctrl+C 复制代码
联结的运算顺序
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;
在这里括号是相当重要的,因此以后在写这样的查询的时候我们不要忘记了多写几个括号,至少这样能避免很多错误
0 0
- Mysql join连接
- MySQL JOIN 多表连接
- django mysql 连接查询join
- 【MySQL】 join连接使用基本知识
- MySQL JOIN 多表连接
- Mysql 连接JOIN的使用
- Mysql的join(连接查询)
- MySQL CROSS JOIN 交叉连接
- mysql表连接 left join
- mysql join 内连接和外连接
- mysql多表连接查询inner join, left join , right join ,full join ,cross join
- Mysql 连接(inner join,默认的就是内连接)、外连接(left join,right join)
- mysql左连接left join右连接 right join 内连接 inner join笔记
- Mysql 的内外连接 (inner join,默认内连接) 外连接(left join,right join)
- MySQL的几种连接 join/inner join/cross join/逗号/left join/right join/natural join
- MySQL的几种连接 join/inner join/cross join/逗号/left join/right join/natural join
- MySQL多表连接查询Left Join,Right Join
- MySQL多表连接查询Left Join,Right Join
- 如何获得腾讯FLASH视频链接或下载到本地
- 【POJ1819】Disks——几何工具
- wust 1599弗洛伊德
- ListView工作原理以及优化
- 快速排序讲解(粗略)
- Mysql join连接
- 官网 Mysql Installing MySQL on Linux Using RPM Packages from Oracle
- EditText限制不能输入空格,汉字和字符不超过28
- 【BZOJ 4517】排列计数 - 排列组合+乘法逆元
- zoj--3946--Highway Project(SPFA)
- H.264(MPEG-4 AVC)级别(Level)、DPB 与 MaxDpbMbs 详解
- python编码问题
- [Lintcode] Unique Paths I,II
- 算法与数据结构(JAVA)-排序算法总结