用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > mysql教程

MySQL多表联合查询sql语句

时间:2015-01-23  来源:西部数据  作者:西部数据

本文章来给各位朋友介绍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.namecount(*) 
  3. FROM 
  4. unicom_record AS ur 
  5. Left Join sheet AS s ON ur.sheet_id = s.id 
  6. Left Join promotion_addr AS p ON s.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. GROUP BY 
  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. create table emp( 
  2. id int not null primary key
  3. name varchar(10) 
  4. ); 
  5. create table emp_dept( 
  6. dept_id varchar(4) not null
  7. emp_id int not null
  8. emp_name varchar(10), 
  9. primary key (dept_id,emp_id)); 
  10. insert into emp() 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. insert into emp_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. >> left join 
  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> select a.id,a.name,b.dept_id 
  2. -> from emp a left join emp_dept b on (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. select a.id,a.name,b.dept_id 
  2. from emp a left join emp_dept b on (a.id=b.emp_id) 
  3. where b.dept_id IS NULL
  4. mysql> select a.id,a.name,b.dept_id 
  5. -> from emp a left join emp_dept b on (a.id=b.emp_id) 
  6. -> where b.dept_id IS NULL
  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. select a.id,a.name,b.dept_id 
  2. from emp_dept b left join emp a on (a.id=b.emp_id); 
  3. mysql> select a.id,a.name,b.dept_id 
  4. -> from emp_dept b left join emp a on (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. >> right join 
  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> select a.id,a.name,b.dept_id 
  2. -> from emp a right join emp_dept b on (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. rows in set (0.00 sec) 

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

  1. select a.id,a.name,b.dept_id 
  2. from emp_dept b right join emp a on (a.id=b.emp_id); 
  3. mysql> select a.id,a.name,b.dept_id 
  4. -> from emp_dept b right join emp a on (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. select a.id,a.name,b.dept_id 
  2. from emp a ,emp_dept b 
  3. where a.id=b.emp_id; 
  4. mysql> select a.id,a.name,b.dept_id 
  5. -> from emp a ,emp_dept b 
  6. -> where a.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!

来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
    无相关信息
栏目更新
栏目热门