Mysql 内连接、左连接会出现笛卡尔积

    科技2025-04-20  23

    有两张表,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;

    结论:左连接非唯一字段,是局部笛卡尔积。

    右连接

      同左连接,这里就不赘述了

    Processed: 0.009, SQL: 8