Mysql多表查询笔记

MySQL链接的种类,JOIN左边(前边)的表是左边,右边(后边)的是右表html

  • 逗号:作笛卡尔集链接
  • INNER JOIN: 若是表中有至少一个匹配,则返回行
  • LEFT JOIN: 即便右表中没有匹配,也从左表返回全部的行
  • RIGHT JOIN: 即便左表中没有匹配,也从右表返回全部的行
  • NATURAL  JOIN
  • NATURAL LEFT JOIN
  • NATURAL RIGHT JOIN
  • CROSS JOIN

mysql

  • MySQL不支持FULL JOIN(只要其中一个表中存在匹配,就返回行),能够结合使用UNION、LEFT/RIGHT JOIN来实现;
  • MySQL中LEFT/INNER JOIN还能够写成LEFT/INNER OUTER JOIN;
  • CROSS JOIN在标准SQL中是不带ON子句的,做用是生成笛卡尔积,在MySQL中CROSS JOIN后带ON子句时,CROSS会被忽略,就至关于JOIN;
  • 不使用ON子句时,JOIN和INNER JOIN和CROSS JOIN和逗号是等价的,作笛卡尔积;
  • 使用ON子句时,INNER/LEFT/RIGHT JOIN不会生成笛卡尔集,直接根据条件生成临时表
  • 逗号操做符和其余几种链接操做符的优先级不一样,尽可能不要同时使用避免出错。
  • 使用逗号链接加where子句和使用INNER JOIN加ON子句效果同样
  • join、inner join、cross join支持on和using语法,逗号不支持on和using语法

多表查询的过程sql

  1. 由多张表生成一张临时表(有on子句时由on子句中的条件生成)
  2. 使用JOIN的方式以及ON子句后面的条件进行筛选
  3. 使用使用WHERE子句后面的条件筛选
  4. 使用GROUP BY条件分组
  5. 使用HAVING+聚合函数筛选
  6. 使用ORDER BY排序
  7. 使用LIMIT筛选

 

假设对表a、b、c进行联合查询yii

提示错误:Unknown column 'xxx' in 'on clause'函数

缘由是FROM后面的两张表没有使用括号包裹起来oop

--错误的写法
select * from a,b left join c on 条件 where  条件

--正确的写法
select * from (a,b) left join c on 条件 where 条件

若是左链接时某个字段为空,就让他等于另一个字段,使用IFNULL()优化

SELECT
	h.id AS id,
	h.goods_id AS goodsId,
	g.goods_advert AS goodsAdvert,
	IFNULL(aos.activity_price,g.sell_price) AS sellPrice,--注意g.sell_price不能用别名price代替
	g.goods_name AS goodsName,
	g.logo_url AS logoUrl,
	g.is_delivery AS isDelivery,
	g.sell_price AS price
FROM
	(tb_house h,
	tb_goods g)
 LEFT JOIN tb_aos_goods_rt aos ON h.goods_id = aos.goods_id
WHERE
	1 = 1
AND h.member_id = 107
AND h.goods_id = g.id
AND h. STATUS = 1
ORDER BY
	h.create_date DESC

若是某条数据的aos.activity_price为null,最后的结果集要以sellPrice排序,ORDER by后面应该写别名sellPrice而不是写aos.activity_priceurl

CROSS JOIN的用法:http://www.yiibai.com/mysql/cross-join.htmlspa

左右链接可否同时使用code

SQL 定义了两种不一样语法方式去表示"链接"。首先是"显式链接符号",它显式地使用关键字 JOIN,其次是"隐式链接符号",它使用所谓的"隐式链接符号"。隐式链接符号把须要链接的表放到 SELECT 语句的 FROM 部分,并用逗号隔开。这样就构成了一个"交叉链接",WHERE 语句可能放置一些过滤谓词(过滤条件)。那些过滤谓词在功能上等价于显式链接符号. SQL 89标准只支持内部链接与交叉链接,所以只有隐式链接这种表达方式;SQL 92标准增长了对外部链接的支持,这才有了JOIN表达式。

 

逗号链接加where子句和inner join加on子句的异同

在查询条件相同时它们的查询结果是相同的,可是查询的过程不彻底相同;

使用逗号操做符加where子句:首先生成笛卡尔积,由于在没有on子句时,逗号和CROSS JOIN是相同的,而后经过条件去过滤。

使用inner join加on子句:直接经过条件去过滤生成临时表,不会生成笛卡尔集,速度更快

开启优化参数后MySQL会自动优化,一般使用,不会形成资源浪费;不使用逗号,所有使用JOIN是最好的,这样既不会由于运算符优先级不一样而出错,也不会由于没有开启优化参数而形成资源浪费。

 

join的方式不一样,cross join生成的是先生成笛卡尔集,而后on链接条件被视为了filter用于数据过滤,inner join是直接基于join condition作链接,生成的join集合就是最终的输出结果,产生的中间数据更小。实际上MySQL优化器会将这两条查询都优化成同一种join方式,好比merge join或者nested loop join,若是你没有开启对应的优化参数,那么MySQL只有傻傻的去按指定的方式去作join

查询条件放在ON后面和放在WHERE后面有什么差别

有上可知,在没有ON时,INNER JOIN和CROSS JOIN是同样的 ,因此推荐使用INNER JOIN ON代替逗号加WHERE;

ON条件是生成临时表时使用的条件,与JOIN的类型有关,不一样类型产生的临时表也不一样,WHERE条件时在临时表生成以后进行筛选的条件,在LEFT或RIGHT JOIN中条件是不能随便放的

在where后面有多个条件时使用加个1=1的缘由

相关文章
相关标签/搜索