sql联表查询常用

有三个表:T_USER,sql联表查询常用

 t_group, sql联表查询常用

T_USER_GROUP,sql联表查询常用

求分组某个平均数:

[html] view plain copy
  1. 3./*各部门平均奖金*/  
  2. select t_group.groupname as "部门", AVG(T_USER.bonus) AS "平均奖金"   
  3. from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid  
  4. left join T_USER on T_USER_GROUP.userid = T_USER.userid group by t_group.groupname;  

sql联表查询常用

[html] view plain copy
  1. 4./*各部门里面奖金大于平均值的职员*/  
  2.   
  3. select a.groupid, a.groupname,a.username,a.bonus from  
  4.  (select t_group.groupid, t_group.groupname,T_USER.username,T_USER.bonus   
  5. from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid   
  6. left join T_USER on  T_USER.userid = T_USER_GROUP.userid) a   
  7.   
  8. left join   
  9. (select t_group.groupid,t_group.groupname, AVG(T_USER.bonus) AS avgbonus   
  10. from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid  
  11. left join T_USER on T_USER_GROUP.userid = T_USER.userid group by t_group.groupid,t_group.groupname) b on a.groupid=b.groupid  
  12.   
  13. where a.bonus>b.avgbonus  

sql联表查询常用



[html] view plain copy
  1. 5./*各部门里奖金最高(低)的面前三名*/  
  2. SELECT  t1.*  
  3. FROM    (select t_group.groupid,T_USER.userid,T_USER.username,t_group.groupname,T_USER.bonus from   
  4. T_USER_GROUP LEFT JOIN T_USER ON T_USER.userid = T_USER_GROUP.userid LEFT JOIN t_group   
  5. ON t_group.groupid = T_USER_GROUP.groupid) t1  
  6. WHERE   t1.userid IN ( SELECT TOP 3  
  7.                             t2.userid  
  8.                      FROM   (select t_group.groupid,T_USER.username,T_USER.userid,t_group.groupname,T_USER.bonus from   
  9. T_USER_GROUP LEFT JOIN T_USER ON T_USER.userid = T_USER_GROUP.userid LEFT JOIN t_group   
  10. ON t_group.groupid = T_USER_GROUP.groupid) t2  
  11.                      WHERE  t2.groupid = t1.groupid  
  12.                      ORDER BY t2.bonus ASC )  
  13.                      ORDER BY t1.groupid DESC ,t1.bonus asc  

sql联表查询常用


[html] view plain copy
  1. 6./*部门平均奖金<400*/  
  2.  select *  
  3.  from  
  4.  (select t_group.groupid as "部门编号",t_group.groupname as "部门名字", AVG(T_USER.bonus) AS "平均奖金"   
  5. from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid  
  6. left join T_USER on T_USER_GROUP.userid = T_USER.userid group by t_group.groupid,t_group.groupname) b  
  7. where  "平均奖金"<400  

sql联表查询常用



[html] view plain copy
  1. 7./*部门平均奖金小于所有人的平均奖金*/    
  2. select b.*  
  3. from (select t_group.groupname as "部门", AVG(T_USER.bonus) AS "平均奖金"   
  4. from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid  
  5. left join T_USER on T_USER_GROUP.userid = T_USER.userid group by t_group.groupname) b  
  6.   
  7.  join   
  8. (select t_group.groupname as "部门",AVG(T_USER.bonus) as "所有人平均奖金" from T_USER,t_group  group by t_group.groupid,t_group.groupname) a on b.部门=a.部门  
  9. where b.平均奖金<a.所有人平均奖金  

sql联表查询常用



8.

[html] view plain copy
  1. /*求平均奖金小于总平均奖金的部门里面的最高和最低奖金步骤*/   
  2.   
  3. /*第一步所有员工的平均奖金*/  
  4. select AVG(bonus) from T_USER  
  5.   
  6. /*第二步求各部门的平均奖金*/  
  7. select b.groupid,AVG(a.bonus) as avgbonus from T_USER a   
  8. left join T_USER_GROUP b on a.userid=b.userid  
  9. group by groupid  
  10.   
  11. /*第三步求平均值小于总平均值的部门*/  
  12. select s.groupid from(  
  13. select b.groupid,AVG(a.bonus) as avgbonus from T_USER a   
  14. left join T_USER_GROUP b on a.userid=b.userid  
  15. group by groupid  
  16. )s  
  17. where s.avgbonus<(select AVG(bonus) from T_USER)  
  18.   
  19.   
  20. /*第四步求平均值小于总平均值的部门里面的人员的groupid,userid,username,bonus*/  
  21. select tug.groupid,tu.userid,tu.username,tu.bonus from  
  22. (  
  23. select s.groupid from(  
  24. select b.groupid,AVG(a.bonus) as avgbonus from T_USER a   
  25. left join T_USER_GROUP b on a.userid=b.userid  
  26. group by groupid  
  27. )s  
  28. where s.avgbonus<(select AVG(bonus) from T_USER)) p   
  29. inner join T_USER_GROUP tug on tug.groupid=p.groupid  
  30. inner join T_USER tu on tu.userid=tug.userid   
  31.   
  32. /*第五步将第三步得到表的信息存储到虚拟表w中*/  
  33. select f.groupid,f.userid,f.username,f.bonus  into w from  
  34.   
  35. (select tug.groupid,tu.userid,tu.username,tu.bonus from  
  36. (  
  37. select s.groupid from(  
  38. select b.groupid,AVG(a.bonus) as avgbonus from T_USER a   
  39. left join T_USER_GROUP b on a.userid=b.userid  
  40. group by groupid  
  41. )s  
  42. where s.avgbonus<(select AVG(bonus) from T_USER)) p   
  43. inner join T_USER_GROUP tug on tug.groupid=p.groupid  
  44. inner join T_USER tu on tu.userid=tug.userid )f  
  45.   
  46. /*最后查询平均奖金小于总平均值的部门里面的最高和最低奖金获得者的信息*/  
  47. select tr.userid,tr.username,k.maxbonus from (  
  48. select groupid,min(bonus) as maxbonus from w  
  49. group by groupid)k  
  50. inner join T_USER_GROUP tup on tup.groupid=k.groupid  
  51. inner join T_USER tr on tr.userid=tup.userid and tr.bonus=k.maxbonus  

sql联表查询常用


9.

[html] view plain copy
  1. /*查询姓名id为1的职工所在的部门和奖金*/  
  2. select T_USER.userid, t_group.groupid,groupname,bonus   
  3. from T_USER  
  4. inner join T_USER_GROUP on T_USER.userid=T_USER_GROUP.userid  
  5. inner join t_group on T_USER_GROUP.groupid=t_group.groupid  
  6. where T_USER.userid=1  

sql联表查询常用


10.

[html] view plain copy
  1. /*查询生产部门里面奖金大于500的人员的信息,并按照高到低排序*/  
  2.   
  3. select a.groupid,b.userid,username,groupname,bonus   
  4. from t_group a  
  5. left join T_USER_GROUP b on a.groupid=b.groupid  
  6. left join T_USER c on b.userid=c.userid  
  7. where groupname='生产部' and bonus>500  
  8. order by bonus desc  

sql联表查询常用

11.

[html] view plain copy
  1. /*查询id号在8-25之间的职员的所有信息*/  
  2. select groupname,username,bonus  
  3.  from T_USER  
  4. inner join T_USER_GROUP on T_USER.userid=T_USER_GROUP.userid  
  5. inner join t_group on t_group.groupid=T_USER_GROUP.groupid  
  6. where T_USER.userid>8 and T_USER.userid<25  

sql联表查询常用


 将min换成max就是求最高奖金,本例子上午关键之处是派生表的灵活运用,例子中的a,b,f,t up ,tr,w,k等都是派生表,灵活使用派生表是数据库中很重要的一个技能,我也还在学习阶段




[html] view plain copy
  1. 5./*各部门里奖金最高(低)的面前三名*/  
  2. SELECT  t1.*  
  3. FROM    (select t_group.groupid,T_USER.userid,T_USER.username,t_group.groupname,T_USER.bonus from   
  4. T_USER_GROUP LEFT JOIN T_USER ON T_USER.userid = T_USER_GROUP.userid LEFT JOIN t_group   
  5. ON t_group.groupid = T_USER_GROUP.groupid) t1  
  6. WHERE   t1.userid IN ( SELECT TOP 3  
  7.                             t2.userid  
  8.                      FROM   (select t_group.groupid,T_USER.username,T_USER.userid,t_group.groupname,T_USER.bonus from   
  9. T_USER_GROUP LEFT JOIN T_USER ON T_USER.userid = T_USER_GROUP.userid LEFT JOIN t_group   
  10. ON t_group.groupid = T_USER_GROUP.groupid) t2  
  11.                      WHERE  t2.groupid = t1.groupid  
  12.                      ORDER BY t2.bonus ASC )  
  13.                      ORDER BY t1.groupid DESC ,t1.bonus asc  

sql联表查询常用


[html] view plain copy
  1. 6./*部门平均奖金<400*/  
  2.  select *  
  3.  from  
  4.  (select t_group.groupid as "部门编号",t_group.groupname as "部门名字", AVG(T_USER.bonus) AS "平均奖金"   
  5. from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid  
  6. left join T_USER on T_USER_GROUP.userid = T_USER.userid group by t_group.groupid,t_group.groupname) b  
  7. where  "平均奖金"<400  

sql联表查询常用



[html] view plain copy
  1. 7./*部门平均奖金小于所有人的平均奖金*/    
  2. select b.*  
  3. from (select t_group.groupname as "部门", AVG(T_USER.bonus) AS "平均奖金"   
  4. from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid  
  5. left join T_USER on T_USER_GROUP.userid = T_USER.userid group by t_group.groupname) b  
  6.   
  7.  join   
  8. (select t_group.groupname as "部门",AVG(T_USER.bonus) as "所有人平均奖金" from T_USER,t_group  group by t_group.groupid,t_group.groupname) a on b.部门=a.部门  
  9. where b.平均奖金<a.所有人平均奖金  

sql联表查询常用



8.

[html] view plain copy
  1. /*求平均奖金小于总平均奖金的部门里面的最高和最低奖金步骤*/   
  2.   
  3. /*第一步所有员工的平均奖金*/  
  4. select AVG(bonus) from T_USER  
  5.   
  6. /*第二步求各部门的平均奖金*/  
  7. select b.groupid,AVG(a.bonus) as avgbonus from T_USER a   
  8. left join T_USER_GROUP b on a.userid=b.userid  
  9. group by groupid  
  10.   
  11. /*第三步求平均值小于总平均值的部门*/  
  12. select s.groupid from(  
  13. select b.groupid,AVG(a.bonus) as avgbonus from T_USER a   
  14. left join T_USER_GROUP b on a.userid=b.userid  
  15. group by groupid  
  16. )s  
  17. where s.avgbonus<(select AVG(bonus) from T_USER)  
  18.   
  19.   
  20. /*第四步求平均值小于总平均值的部门里面的人员的groupid,userid,username,bonus*/  
  21. select tug.groupid,tu.userid,tu.username,tu.bonus from  
  22. (  
  23. select s.groupid from(  
  24. select b.groupid,AVG(a.bonus) as avgbonus from T_USER a   
  25. left join T_USER_GROUP b on a.userid=b.userid  
  26. group by groupid  
  27. )s  
  28. where s.avgbonus<(select AVG(bonus) from T_USER)) p   
  29. inner join T_USER_GROUP tug on tug.groupid=p.groupid  
  30. inner join T_USER tu on tu.userid=tug.userid   
  31.   
  32. /*第五步将第三步得到表的信息存储到虚拟表w中*/  
  33. select f.groupid,f.userid,f.username,f.bonus  into w from  
  34.   
  35. (select tug.groupid,tu.userid,tu.username,tu.bonus from  
  36. (  
  37. select s.groupid from(  
  38. select b.groupid,AVG(a.bonus) as avgbonus from T_USER a   
  39. left join T_USER_GROUP b on a.userid=b.userid  
  40. group by groupid  
  41. )s  
  42. where s.avgbonus<(select AVG(bonus) from T_USER)) p   
  43. inner join T_USER_GROUP tug on tug.groupid=p.groupid  
  44. inner join T_USER tu on tu.userid=tug.userid )f  
  45.   
  46. /*最后查询平均奖金小于总平均值的部门里面的最高和最低奖金获得者的信息*/  
  47. select tr.userid,tr.username,k.maxbonus from (  
  48. select groupid,min(bonus) as maxbonus from w  
  49. group by groupid)k  
  50. inner join T_USER_GROUP tup on tup.groupid=k.groupid  
  51. inner join T_USER tr on tr.userid=tup.userid and tr.bonus=k.maxbonus  

sql联表查询常用


9.

[html] view plain copy
  1. /*查询姓名id为1的职工所在的部门和奖金*/  
  2. select T_USER.userid, t_group.groupid,groupname,bonus   
  3. from T_USER  
  4. inner join T_USER_GROUP on T_USER.userid=T_USER_GROUP.userid  
  5. inner join t_group on T_USER_GROUP.groupid=t_group.groupid  
  6. where T_USER.userid=1  

sql联表查询常用


10.

[html] view plain copy
  1. /*查询生产部门里面奖金大于500的人员的信息,并按照高到低排序*/  
  2.   
  3. select a.groupid,b.userid,username,groupname,bonus   
  4. from t_group a  
  5. left join T_USER_GROUP b on a.groupid=b.groupid  
  6. left join T_USER c on b.userid=c.userid  
  7. where groupname='生产部' and bonus>500  
  8. order by bonus desc  

sql联表查询常用

11.

[html] view plain copy
  1. /*查询id号在8-25之间的职员的所有信息*/  
  2. select groupname,username,bonus  
  3.  from T_USER  
  4. inner join T_USER_GROUP on T_USER.userid=T_USER_GROUP.userid  
  5. inner join t_group on t_group.groupid=T_USER_GROUP.groupid  
  6. where T_USER.userid>8 and T_USER.userid<25  

sql联表查询常用


 将min换成max就是求最高奖金,本例子上午关键之处是派生表的灵活运用,例子中的a,b,f,t up ,tr,w,k等都是派生表,灵活使用派生表是数据库中很重要的一个技能,我也还在学习阶段