MySQL链接的种类,JOIN左边(前边)的表是左边,右边(后边)的是右表html
注:mysql
多表查询的过程:sql
假设对表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的缘由