有三個表:T_USER,
t_group,
T_USER_GROUP,
求分組某個平均數:
- 3./*各部門平均獎金*/
- select t_group.groupname as "部門", AVG(T_USER.bonus) AS "平均獎金"
- from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid
- left join T_USER on T_USER_GROUP.userid = T_USER.userid group by t_group.groupname;
- 4./*各部門裏面獎金大於平均值的職員*/
- select a.groupid, a.groupname,a.username,a.bonus from
- (select t_group.groupid, t_group.groupname,T_USER.username,T_USER.bonus
- from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid
- left join T_USER on T_USER.userid = T_USER_GROUP.userid) a
- left join
- (select t_group.groupid,t_group.groupname, AVG(T_USER.bonus) AS avgbonus
- from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid
- 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
- where a.bonus>b.avgbonus
- 5./*各部門裏獎金最高(低)的面前三名*/
- SELECT t1.*
- FROM (select t_group.groupid,T_USER.userid,T_USER.username,t_group.groupname,T_USER.bonus from
- T_USER_GROUP LEFT JOIN T_USER ON T_USER.userid = T_USER_GROUP.userid LEFT JOIN t_group
- ON t_group.groupid = T_USER_GROUP.groupid) t1
- WHERE t1.userid IN ( SELECT TOP 3
- t2.userid
- FROM (select t_group.groupid,T_USER.username,T_USER.userid,t_group.groupname,T_USER.bonus from
- T_USER_GROUP LEFT JOIN T_USER ON T_USER.userid = T_USER_GROUP.userid LEFT JOIN t_group
- ON t_group.groupid = T_USER_GROUP.groupid) t2
- WHERE t2.groupid = t1.groupid
- ORDER BY t2.bonus ASC )
- ORDER BY t1.groupid DESC ,t1.bonus asc
- 6./*部門平均獎金<400*/
- select *
- from
- (select t_group.groupid as "部門編號",t_group.groupname as "部門名字", AVG(T_USER.bonus) AS "平均獎金"
- from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid
- left join T_USER on T_USER_GROUP.userid = T_USER.userid group by t_group.groupid,t_group.groupname) b
- where "平均獎金"<400
- 7./*部門平均獎金小於所有人的平均獎金*/
- select b.*
- from (select t_group.groupname as "部門", AVG(T_USER.bonus) AS "平均獎金"
- from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid
- left join T_USER on T_USER_GROUP.userid = T_USER.userid group by t_group.groupname) b
- join
- (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.部門
- where b.平均獎金<a.所有人平均獎金
8.
- /*求平均獎金小於總平均獎金的部門裏面的最高和最低獎金步驟*/
- /*第一步所有員工的平均獎金*/
- select AVG(bonus) from T_USER
- /*第二步求各部門的平均獎金*/
- select b.groupid,AVG(a.bonus) as avgbonus from T_USER a
- left join T_USER_GROUP b on a.userid=b.userid
- group by groupid
- /*第三步求平均值小於總平均值的部門*/
- select s.groupid from(
- select b.groupid,AVG(a.bonus) as avgbonus from T_USER a
- left join T_USER_GROUP b on a.userid=b.userid
- group by groupid
- )s
- where s.avgbonus<(select AVG(bonus) from T_USER)
- /*第四步求平均值小於總平均值的部門裏面的人員的groupid,userid,username,bonus*/
- select tug.groupid,tu.userid,tu.username,tu.bonus from
- (
- select s.groupid from(
- select b.groupid,AVG(a.bonus) as avgbonus from T_USER a
- left join T_USER_GROUP b on a.userid=b.userid
- group by groupid
- )s
- where s.avgbonus<(select AVG(bonus) from T_USER)) p
- inner join T_USER_GROUP tug on tug.groupid=p.groupid
- inner join T_USER tu on tu.userid=tug.userid
- /*第五步將第三步得到表的信息存儲到虛擬表w中*/
- select f.groupid,f.userid,f.username,f.bonus into w from
- (select tug.groupid,tu.userid,tu.username,tu.bonus from
- (
- select s.groupid from(
- select b.groupid,AVG(a.bonus) as avgbonus from T_USER a
- left join T_USER_GROUP b on a.userid=b.userid
- group by groupid
- )s
- where s.avgbonus<(select AVG(bonus) from T_USER)) p
- inner join T_USER_GROUP tug on tug.groupid=p.groupid
- inner join T_USER tu on tu.userid=tug.userid )f
- /*最後查詢平均獎金小於總平均值的部門裏面的最高和最低獎金獲得者的信息*/
- select tr.userid,tr.username,k.maxbonus from (
- select groupid,min(bonus) as maxbonus from w
- group by groupid)k
- inner join T_USER_GROUP tup on tup.groupid=k.groupid
- inner join T_USER tr on tr.userid=tup.userid and tr.bonus=k.maxbonus
9.
- /*查詢姓名id爲1的職工所在的部門和獎金*/
- select T_USER.userid, t_group.groupid,groupname,bonus
- from T_USER
- inner join T_USER_GROUP on T_USER.userid=T_USER_GROUP.userid
- inner join t_group on T_USER_GROUP.groupid=t_group.groupid
- where T_USER.userid=1
10.
- /*查詢生產部門裏面獎金大於500的人員的信息,並按照高到低排序*/
- select a.groupid,b.userid,username,groupname,bonus
- from t_group a
- left join T_USER_GROUP b on a.groupid=b.groupid
- left join T_USER c on b.userid=c.userid
- where groupname='生產部' and bonus>500
- order by bonus desc
11.
- /*查詢id號在8-25之間的職員的所有信息*/
- select groupname,username,bonus
- from T_USER
- inner join T_USER_GROUP on T_USER.userid=T_USER_GROUP.userid
- inner join t_group on t_group.groupid=T_USER_GROUP.groupid
- where T_USER.userid>8 and T_USER.userid<25
將min換成max就是求最高獎金,本例子上午關鍵之處是派生表的靈活運用,例子中的a,b,f,t up ,tr,w,k等都是派生表,靈活使用派生表是數據庫中很重要的一個技能,我也還在學習階段
- 5./*各部門裏獎金最高(低)的面前三名*/
- SELECT t1.*
- FROM (select t_group.groupid,T_USER.userid,T_USER.username,t_group.groupname,T_USER.bonus from
- T_USER_GROUP LEFT JOIN T_USER ON T_USER.userid = T_USER_GROUP.userid LEFT JOIN t_group
- ON t_group.groupid = T_USER_GROUP.groupid) t1
- WHERE t1.userid IN ( SELECT TOP 3
- t2.userid
- FROM (select t_group.groupid,T_USER.username,T_USER.userid,t_group.groupname,T_USER.bonus from
- T_USER_GROUP LEFT JOIN T_USER ON T_USER.userid = T_USER_GROUP.userid LEFT JOIN t_group
- ON t_group.groupid = T_USER_GROUP.groupid) t2
- WHERE t2.groupid = t1.groupid
- ORDER BY t2.bonus ASC )
- ORDER BY t1.groupid DESC ,t1.bonus asc
- 6./*部門平均獎金<400*/
- select *
- from
- (select t_group.groupid as "部門編號",t_group.groupname as "部門名字", AVG(T_USER.bonus) AS "平均獎金"
- from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid
- left join T_USER on T_USER_GROUP.userid = T_USER.userid group by t_group.groupid,t_group.groupname) b
- where "平均獎金"<400
- 7./*部門平均獎金小於所有人的平均獎金*/
- select b.*
- from (select t_group.groupname as "部門", AVG(T_USER.bonus) AS "平均獎金"
- from t_group left join T_USER_GROUP on t_group.groupid = T_USER_GROUP.groupid
- left join T_USER on T_USER_GROUP.userid = T_USER.userid group by t_group.groupname) b
- join
- (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.部門
- where b.平均獎金<a.所有人平均獎金
8.
- /*求平均獎金小於總平均獎金的部門裏面的最高和最低獎金步驟*/
- /*第一步所有員工的平均獎金*/
- select AVG(bonus) from T_USER
- /*第二步求各部門的平均獎金*/
- select b.groupid,AVG(a.bonus) as avgbonus from T_USER a
- left join T_USER_GROUP b on a.userid=b.userid
- group by groupid
- /*第三步求平均值小於總平均值的部門*/
- select s.groupid from(
- select b.groupid,AVG(a.bonus) as avgbonus from T_USER a
- left join T_USER_GROUP b on a.userid=b.userid
- group by groupid
- )s
- where s.avgbonus<(select AVG(bonus) from T_USER)
- /*第四步求平均值小於總平均值的部門裏面的人員的groupid,userid,username,bonus*/
- select tug.groupid,tu.userid,tu.username,tu.bonus from
- (
- select s.groupid from(
- select b.groupid,AVG(a.bonus) as avgbonus from T_USER a
- left join T_USER_GROUP b on a.userid=b.userid
- group by groupid
- )s
- where s.avgbonus<(select AVG(bonus) from T_USER)) p
- inner join T_USER_GROUP tug on tug.groupid=p.groupid
- inner join T_USER tu on tu.userid=tug.userid
- /*第五步將第三步得到表的信息存儲到虛擬表w中*/
- select f.groupid,f.userid,f.username,f.bonus into w from
- (select tug.groupid,tu.userid,tu.username,tu.bonus from
- (
- select s.groupid from(
- select b.groupid,AVG(a.bonus) as avgbonus from T_USER a
- left join T_USER_GROUP b on a.userid=b.userid
- group by groupid
- )s
- where s.avgbonus<(select AVG(bonus) from T_USER)) p
- inner join T_USER_GROUP tug on tug.groupid=p.groupid
- inner join T_USER tu on tu.userid=tug.userid )f
- /*最後查詢平均獎金小於總平均值的部門裏面的最高和最低獎金獲得者的信息*/
- select tr.userid,tr.username,k.maxbonus from (
- select groupid,min(bonus) as maxbonus from w
- group by groupid)k
- inner join T_USER_GROUP tup on tup.groupid=k.groupid
- inner join T_USER tr on tr.userid=tup.userid and tr.bonus=k.maxbonus
9.
- /*查詢姓名id爲1的職工所在的部門和獎金*/
- select T_USER.userid, t_group.groupid,groupname,bonus
- from T_USER
- inner join T_USER_GROUP on T_USER.userid=T_USER_GROUP.userid
- inner join t_group on T_USER_GROUP.groupid=t_group.groupid
- where T_USER.userid=1
10.
- /*查詢生產部門裏面獎金大於500的人員的信息,並按照高到低排序*/
- select a.groupid,b.userid,username,groupname,bonus
- from t_group a
- left join T_USER_GROUP b on a.groupid=b.groupid
- left join T_USER c on b.userid=c.userid
- where groupname='生產部' and bonus>500
- order by bonus desc
11.
- /*查詢id號在8-25之間的職員的所有信息*/
- select groupname,username,bonus
- from T_USER
- inner join T_USER_GROUP on T_USER.userid=T_USER_GROUP.userid
- inner join t_group on t_group.groupid=T_USER_GROUP.groupid
- where T_USER.userid>8 and T_USER.userid<25
將min換成max就是求最高獎金,本例子上午關鍵之處是派生表的靈活運用,例子中的a,b,f,t up ,tr,w,k等都是派生表,靈活使用派生表是數據庫中很重要的一個技能,我也還在學習階段