left join 左连接即以左表为基准,显示坐标所有的行,右表与左表关联的数据会显示,不关联的则不显示。关键字为left join on。
**基本用法如下:
select table a left join table b on a.id = b.ta_id**
注意:
其中on后面关联的字段应该是同一字段(两表关联的外键)
由于以左表为基准,左表一条记录如果对应右表多条记录,那查出的数据中右表的数据也只显示一条,如果要都显示,可以用group_contact()将字段用逗号隔开显示在一条记录上。所以右表不管有几张,如果和左表都是一对一关系,则没问题,存在一对多关系时,需要一定的处理。
1、内连接:将两个表中存在连结关系的字段符合连接条件的记录形成记录集
SELECTA. NAME,
B. NAMEFROMAINNER JOIN B ON A.id = B.id
和
SELECTA. NAME,
B. NAMEFROMA,
BWHEREA.id= B.id
结果是一样的(内连接的inner关键字可省略);
2、外连接:分为左外连接和右外连接
左连接A、B表结果包括A的全部记录和符合条件的B的记录。
右联结A、B表的结果和左联结B、A的结果是一样的,也就是说:
SELECTA. NAME,
B. NAMEFROMALEFT JOIN B ON A.id = B.id
和
SELECTA. NAME,
B. NAMEFROMBRIGHT JOIN A ON B.id - A.id
执行后的结果是一样的。
3、全联结
4、无联结
5、三表联结查询
SELECTusername,
psw,
gname,
telFROM(
t1LEFT JOIN t2 ON t1.t1_id =t2.t1_id
)LEFT JOIN t3 ON t1.t1_id = t3.t1_id
6、终极的三表联结查询
items:商品表,item_visit_stats:商品访问表,item_trade_stats:商品销售表
/*Source Server : localhost
Source Server Version : 50505
Source Host : localhost:3306
Source Database : test
Target Server Type : MYSQL
Target Server Version : 50505
File Encoding : 65001
Date: 2018-09-14 19:00:46*/
SET FOREIGN_KEY_CHECKS=0;--------------------------------Table structure for items------------------------------
DROP TABLE IF EXISTS`items`;CREATE TABLE`items` (
`id`bigint(20) unsigned NOT NULLAUTO_INCREMENT,
`title`varchar(255) DEFAULT '',
`price`varchar(255) DEFAULT '',
`nick`varchar(255) DEFAULT '',PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';--------------------------------Table structure for item_trade_stats------------------------------
DROP TABLE IF EXISTS`item_trade_stats`;CREATE TABLE`item_trade_stats` (
`id`bigint(20) unsigned NOT NULLAUTO_INCREMENT,
`buyer_num`int(11) unsigned DEFAULT '0',
`item_num`int(11) unsigned DEFAULT '0',
`seller_nick`varchar(255) DEFAULT '',
`business_day`datetime DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品销售表';--------------------------------Table structure for item_visit_stats------------------------------
DROP TABLE IF EXISTS`item_visit_stats`;CREATE TABLE`item_visit_stats` (
`id`bigint(20) unsigned NOT NULLAUTO_INCREMENT,
`user_visits`varchar(255) NOT NULL,
`business_day`datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品访问表';
SELECTi.id,
i.title,SUM(ivs.user_visits) ASuv,
its.item_num* i.price ASturnoverFROM(
itemsASiRIGHT JOIN item_visit_stats AS ivs ON i.id =ivs.id
)LEFT JOIN(SELECTid,SUM(item_num) ASitem_numFROMitem_trade_statsWHEREseller_nick="XXXX"GROUP BYid
)AS its ON its.id =ivs.idWHEREi.nick="XXXX"GROUP BYi.idORDER BYuvDESC
https://blog.csdn.net/chentaocba/article/details/7697825
写的时候从外层往里写,一层一层left join,才不容易出错。
http://www.cnblogs.com/amyStart/p/5965472.html