MySQL多表联合查询sql语句

爱互踩 爱互踩流量交换~

本文章来给各位朋友介绍PHP MySQL多表联合查询sql语句总结,有需要了解的同学可参考.

最简的一种联合查询,代码如下:

SELECT * FROM table1 n, table2 i WHERE n.itemid = i.itemid

例:

推广地点表promotion_addr字段:name,id

电话报竣表unicom_record字段:date, sheet_id(关联sheet表id)

报单表sheet字段:id,promotion_addr_id(关联promotion_addr表id)

要求统计某个月已报竣各推广地点的推广个数,代码如下:

  1. SELECT
  2. p.name,count(*)
  3. FROM
  4. unicom_recordASur
  5. LeftJoinsheetASsONur.sheet_id=s.id
  6. LeftJoinpromotion_addrASpONs.promotion_addr_id=p.id
  7. WHERE
  8. ur.status=?‘COMPLETE’AND
  9. ur.`date`>=?’2010-03-01′AND
  10. ur.`date`<?’2010-04-01′
  11. GROUPBY
  12. p.id

或使用between and语句.

内连接INNER JOIN,代码如下:

join_table: table_reference [INNER | CROSS] JOIN table_factor [join_condition]

MySQL中的外连接,代码如下:

select id, name, action from user as u left join user_action a on u.id = a.user_id

还是先 Create table 吧,代码如下:

  1. createtableemp(
  2. idintnotnullprimarykey,
  3. namevarchar(10)
  4. );
  5. createtableemp_dept(
  6. dept_idvarchar(4)notnull,
  7. emp_idintnotnull,
  8. emp_namevarchar(10),
  9. primarykey(dept_id,emp_id));
  10. insertintoemp()values
  11. (1,”Dennis-1″),
  12. (2,”Dennis-2″),
  13. (3,”Dennis-3″),
  14. (4,”Dennis-4″),
  15. (5,”Dennis-5″),
  16. (6,”Dennis-6″),
  17. (7,”Dennis-7″),
  18. (8,”Dennis-8″),
  19. (9,”Dennis-9″),
  20. (10,”Dennis-10″);
  21. insertintoemp_dept()values
  22. (“R&D”,1,”Dennis-1″),
  23. (“DEv”,2,”Dennis-2″),
  24. (“R&D”,3,”Dennis-3″),
  25. (“Test”,4,”Dennis-4″),
  26. (“Test”,5,”Dennis-5″);
  27. >>leftjoin
  28. ————-

代码如下:

select a.id,a.name,b.dept_id from emp a left join emp_dept b on (a.id=b.emp_id);

挑出左边的 table emp 中的所有资料,即使 emp_dept 中没有的资料也挑出来,没有的就用 NULL来显示,也即显示资料是以左边的 table emp 中的资料为基础,代码如下:

  1. mysql>selecta.id,a.name,b.dept_id
  2. ->fromempaleftjoinemp_deptbon(a.id=b.emp_id);
  3. +—-+———–+———+
  4. |id|name|dept_id|
  5. +—-+———–+———+
  6. |1|Dennis-1|R&D|
  7. |2|Dennis-2|DEv|
  8. |3|Dennis-3|R&D|
  9. |4|Dennis-4|Test|
  10. |5|Dennis-5|Test|
  11. |6|Dennis-6|NULL|
  12. |7|Dennis-7|NULL|
  13. |8|Dennis-8|NULL|
  14. |9|Dennis-9|NULL|
  15. |10|Dennis-10|NULL|
  16. +—-+———–+———+

挑出 table emp 中有而 table emp_dept 中没有的人员资料,代码如下:

  1. selecta.id,a.name,b.dept_id
  2. fromempaleftjoinemp_deptbon(a.id=b.emp_id)
  3. whereb.dept_idISNULL;
  4. mysql>selecta.id,a.name,b.dept_id
  5. ->fromempaleftjoinemp_deptbon(a.id=b.emp_id)
  6. ->whereb.dept_idISNULL;
  7. +—-+———–+———+
  8. |id|name|dept_id|
  9. +—-+———–+———+
  10. |6|Dennis-6|NULL|
  11. |7|Dennis-7|NULL|
  12. |8|Dennis-8|NULL|
  13. |9|Dennis-9|NULL|
  14. |10|Dennis-10|NULL|
  15. +—-+———–+———+

把 table emp_dept 放在左边的情形(当然以 emp_dept 中的数据为基础来显示资料,emp 中比emp_dept 中多的资料也就不会显示出来了),代码如下:

  1. selecta.id,a.name,b.dept_id
  2. fromemp_deptbleftjoinempaon(a.id=b.emp_id);
  3. mysql>selecta.id,a.name,b.dept_id
  4. ->fromemp_deptbleftjoinempaon(a.id=b.emp_id);
  5. +——+———-+———+--phpfensi.com
  6. |id|name|dept_id|
  7. +——+———-+———+
  8. |2|Dennis-2|DEv|
  9. |1|Dennis-1|R&D|
  10. |3|Dennis-3|R&D|
  11. |4|Dennis-4|Test|
  12. |5|Dennis-5|Test|
  13. +——+———-+———+
  14. >>rightjoin
  15. —————

代码如下:

select a.id,a.name,b.dept_id from emp a right join emp_dept b on (a.id=b.emp_id);

挑资料时以右边 table emp_dept 中的资料为基础来显示资料,代码如下:

  1. mysql>selecta.id,a.name,b.dept_id
  2. ->fromemparightjoinemp_deptbon(a.id=b.emp_id);
  3. +——+———-+———+
  4. |id|name|dept_id|
  5. +——+———-+———+
  6. |2|Dennis-2|DEv|
  7. |1|Dennis-1|R&D|
  8. |3|Dennis-3|R&D|
  9. |4|Dennis-4|Test|
  10. |5|Dennis-5|Test|
  11. +——+———-+———+
  12. 5rowsinset(0.00sec)

我们再把 table 的位置交换一下,再用 right join 试试,代码如下:

  1. selecta.id,a.name,b.dept_id
  2. fromemp_deptbrightjoinempaon(a.id=b.emp_id);
  3. mysql>selecta.id,a.name,b.dept_id
  4. ->fromemp_deptbrightjoinempaon(a.id=b.emp_id);
  5. +—-+———–+———+
  6. |id|name|dept_id|
  7. +—-+———–+———+
  8. |1|Dennis-1|R&D|
  9. |2|Dennis-2|DEv|
  10. |3|Dennis-3|R&D|
  11. |4|Dennis-4|Test|
  12. |5|Dennis-5|Test|
  13. |6|Dennis-6|NULL|
  14. |7|Dennis-7|NULL|
  15. |8|Dennis-8|NULL|
  16. |9|Dennis-9|NULL|
  17. |10|Dennis-10|NULL|
  18. +—-+———–+———+

是不是和 left join 一样了?

>> direct join

如果用right join 同不用 Join 直接挑资料是相同的,它等介於以下的指令,代码如下:

  1. selecta.id,a.name,b.dept_id
  2. fromempa,emp_deptb
  3. wherea.id=b.emp_id;
  4. mysql>selecta.id,a.name,b.dept_id
  5. ->fromempa,emp_deptb
  6. ->wherea.id=b.emp_id;
  7. +—-+———-+———+
  8. |id|name|dept_id|
  9. +—-+———-+———+
  10. |2|Dennis-2|DEv|
  11. |1|Dennis-1|R&D|
  12. |3|Dennis-3|R&D|
  13. |4|Dennis-4|Test|
  14. |5|Dennis-5|Test|
  15. +—-+———-+———+

怎样,弄明白了吗?Enjoy it!

相关广告
  • MySQL多表联合查询sql语句 MySQL多表联合查询sql语句 MySQL多表联合查询sql语句
相关阅读

MySQL多表联合查询sql语句

2019/10/10 17:35:20 | 谷歌SEO算法 | 自媒体