平时大多是执行单表查询,通常你把索引建好,让他尽可能走索引,性能都没问题。但其实也有不少的多表关联语句,因为有时查找目标数据,不得不借助多表关联的语法,才能实现你想要但使用多表关联的时候,你的SQL性能就可能会遇到一些问题。最基础的多表关联查询selectfromt1,t2wheret1。x1xxxandt1。x2t2。x2andt2。x3xxx 若在FROM字句后直接来两个表名,就是要针对两个表进行查询,而且会把两个表的数据给关联,假设你未限定多表连接条件,可能会搞出一个笛卡尔积。所以通常都会在多表关联语句中的WHERE子句里引入一些关联条件:wheret1。x1xxxandt1。x2t2。x2andt2。x3xxxt1。x1xxx明确绝对不是多表关联的连接条件,而是针对t1表的数据筛选条件,从t1筛选一波数据再和t2表关联然后t2。x3xxx,也不是关联条件,他也是针对t2表的筛选条件真正的关联条件t1。x2t2。x2必须要t1表里的每条数据根据自己的x2字段值关联t2表里的某条记录,要求t1表里这条数据的x2值t2表里的那条数据的x2字段值 假设:t1表里有1条数据x2265t2有2条数据x2265就会把t1表里的那条数据和t2表的2条数据分别关联,最终返你两条关联后数据。 所以该SQL执行过程可能是:首先根据t1。x1xxx筛选条件,去t1查出一批数据,此时可能是const、ref,也可能index或all,具体看你的索引如何建的假设从t1按t1。x1xxx条件筛选出2条数据接着对这两条数据,根据每条数据的x2字段值及t2。x3xxx条件,去t2表里找x2、x3字段值都匹配的数据。比如t1表第一条数据的x2265,就根据t2。x2265和t2。x3xxx这俩条件,找出一波数据,比如找出来2条吧此时就把t1表里x2265的那个数据和t2表里t2。x2265和t2。x3xxx的两条数据关联,t1表里另外一条数据如法炮制 他可能是先从一个表里查一波数据:驱动表 再根据这波数据去另外一个表里查一波数据进行关联,另外一个表叫:被驱动表内连接 员工表包含id(主键)、name(姓名)、department(部门) 产品销售业绩表里包含id(主键)、employeeid(员工id)、产品名称(productname)、销售业绩(saledamount)。 现在要看每个员工对每个产品的销售业绩:selecte。name,e。department,ps。productname,ps。saledamountfromemployeee,productsaledpawheree。idpa。employeeid 此时看到的数据: 执行原理 全表扫描员工表,找出每个员工,然后针对每个员工的id去业绩表找employeeid跟员工id相等的数据,可能每个员工的id在业绩表里都会找到多条数据,因为他可能有多个产品的销售业绩。 然后把每个员工数据跟他在业绩表里找到的所有业绩数据都关联,比如:张三关联了业绩表里的三条数据李四关联了业绩表里的两条数据 内连接,innerjoin,要求两个表里的数据必须完全能关联上,才能返回。 假设员工表里有个人是新员工,入职到现在无销售业绩,此时还是希望能够查出来该员工的数据,只不过他的销售业绩那块可以给个NULL,表示无业绩。但若仅使用上述SQL语法,似乎搞不定,因为必须要两个表能关联上的数据才查得出来。 此时就需要外连接 outerjoin,分为:左外连接在左侧的表里的某条数据,如果在右侧的表里关联不到任何数据,也得把左侧表这个数据给返回出来右外连接右外连接反之,在右侧的表里如果关联不到左侧表里的任何数据,得把右侧表的数据返回出来 还有个语法限制,如果你是内连接,那连接条件可以放在where语句,但外连接一般是把连接条件放在ON语句:SELECTe。name,e。department,ps。productname,ps。saledamountFROMemployeeeLEFTOUTERJOINproductsaledpaONe。idpa。employeeid 一般写多表关联,主要就是内连接和外连接。