有两张表,user表和job表,表数据如下
交叉连接
SELECT
*
FROM
`user` CROSS JOIN job;
这种等同于(交叉查询等于不加on的内连接)
SELECT
*
FROM
`user` , job;
sql执行结果:
结论:交叉连接,会产生笛卡尔积。
内连接
内连接唯一字段
SELECT
*
FROM
`user` u JOIN job j ON u.JOB_ID=j.ID;
结论:假如,内连接查询,on条件是A表或者B表的唯一字段,则结果集是两表的交集,不是笛卡尔积。
内连接非唯一字段
如果A表有m条记录,m1条符合on条件,B表有n条记录,有n1条符合on条件,则结果集是m1*n1
SELECT
*
FROM
`user` u JOIN job j ON u.valid=j.valid;
结论:假如,on条件是表中非唯一字段,则结果集是两表匹配到的结果集的笛卡尔积(局部笛卡尔积) 。
外连接
左连接
左连接唯一字段
假如A表有m条记录,B表有n条记录,则结果集是m条
SELECT
*
FROMuser
u LEFT JOIN job j ON u.JOB_ID=j.id;
结论:on条件是唯一字段,则结果集是左表记录的数量。
左连接非唯一字段
如果A表有m条记录,m1条符合on条件,B表有n条记录,有n1条符合on条件,则结果集是 (m-m1) + m1*n1
SELECT
*
FROM
`user` u LEFT JOIN job j ON u.VALID=j.VALID;
结论:左连接非唯一字段,是局部笛卡尔积。
右连接
同左连接,这里就不赘述了