mysql中實現七表查詢實例(二)

上一章的內容大家覺得怎么樣?

接下來,讓我們來一點一點繼續深入。

1.查詢成績大于60分的所有信息:

mysql>?select?*?from(select?student.s,sname,cadd,sage,sc.class,teacher.t,cname,score,tname,tadd,ssex,cphone?from?student,teacher,sc,course,?cadd,tadd,cphone?where?((((student.s=sc.s?and?teacher.t=course.t)?and?course.class=sc.class)and?cadd.s=student.s)and  ?tadd.t=teacher.t)?and?cphone.s=student.s)as?a1?where?score>60;  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+  |?s????|?sname??|?cadd???|?sage?|?class?|?t????|?cname??|?score?|?tname??|?tadd???|?ssex?|?cphone?|  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+  |????1?|?劉一???|?福建???|???18?|?????2?|????2?|?數學???|????78?|?賀高???|?深圳???|?男???|??12345?|  |????1?|?劉一???|?福建???|???18?|?????3?|????3?|?英語???|????67?|?楊艷???|?上海???|?男???|??12345?|  |????2?|?錢二???|?深圳???|???19?|?????1?|????1?|?語文???|????79?|?葉平???|?福建???|?女???|??12346?|  |????2?|?錢二???|?深圳???|???19?|?????2?|????2?|?數學???|????81?|?賀高???|?深圳???|?女???|??12346?|  |????2?|?錢二???|?深圳???|???19?|?????3?|????3?|?英語???|????92?|?楊艷???|?上海???|?女???|??12346?|  |????2?|?錢二???|?深圳???|???19?|?????4?|????4?|?物理???|????68?|?周磊???|?湖南???|?女???|??12346?|  |????3?|?張三???|?上海???|???17?|?????1?|????1?|?語文???|????91?|?葉平???|?福建???|?男???|??12347?|  |????3?|?張三???|?上海???|???17?|?????3?|????3?|?英語???|????88?|?楊艷???|?上海???|?男???|??12347?|  |????4?|?李四???|?湖南???|???18?|?????2?|????2?|?數學???|????88?|?賀高???|?深圳???|?女???|??12348?|  |????4?|?李四???|?湖南???|???18?|?????3?|????3?|?英語???|????90?|?楊艷???|?上海???|?女???|??12348?|  |????4?|?李四???|?湖南???|???18?|?????4?|????4?|?物理???|????93?|?周磊???|?湖南???|?女???|??12348?|  |????5?|?王五???|?江西???|???17?|?????3?|????3?|?英語???|????78?|?楊艷???|?上海???|?男???|??12349?|  |????6?|?趙六???|?廣西???|???19?|?????2?|????2?|?數學???|????68?|?賀高???|?深圳???|?女???|??13349?|  |????6?|?趙六???|?廣西???|???19?|?????4?|????4?|?物理???|????71?|?周磊???|?湖南???|?女???|??13349?|  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+  14?rows?in?set?(0.00?sec)

2.查詢年齡為18歲的男性學生考試成績大于60分的所有信息:

mysql>?select?*?from(select?student.s,sname,cadd,sage,sc.class,teacher.t,cname,score,tname,tadd,ssex,cphone?from?student,teacher,sc,course,?cadd,tadd,cphone?where?((((student.s=sc.s?and?teacher.t=course.t)?and?course.class=sc.class)and?cadd.s=student.s)and  ?tadd.t=teacher.t)?and?cphone.s=student.s)as?a1?where?(score>60?and?sage=18)and?ssex="男";  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+  |?s????|?sname??|?cadd???|?sage?|?class?|?t????|?cname??|?score?|?tname??|?tadd???|?ssex?|?cphone?|  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+  |????1?|?劉一???|?福建???|???18?|?????2?|????2?|?數學???|????78?|?賀高???|?深圳???|?男???|??12345?|  |????1?|?劉一???|?福建???|???18?|?????3?|????3?|?英語???|????67?|?楊艷???|?上海???|?男???|??12345?|  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+  2?rows?in?set?(0.00?sec)

3.查詢每個學生參加課程的總數,總分,平均分及其所有信息(CNAME字段除外):

看上去很簡單,但是:

mysql>?select?count(t),sum(score),avg(score),student.s,sname,cadd,sage,sc.class,score,teacher.t,tname,tadd,ssex,cphone?from(select?student.s,sname,cadd,sage,sc.class,score,teacher.t,tname,tadd,ssex,cphone?from?student,teacher,sc,course,?cadd,tadd,cphone  ?where?((((student.s=sc.s?and?teacher.t=course.t)?and?course.class=sc.class)and?cadd.s=student.s)and?tadd.t=teacher.t)?and?cphone.s=student.s)as?a1;  ERROR?1054?(42S22):?Unknown?column?'student.s'?in?'field?list'

既然AS新表了,就不要再把查詢的字段歸到舊表下面了。

mysql>?select?count(t),sum(score),avg(score),s,sname,cadd,sage,class,score,t,tname,tadd,ssex,cphone?from(select?student.s,sname,cadd,sage,sc.class,score,teacher.t,tname,tadd,ssex,cphone?from?student,teacher,sc,course,  ?cadd,tadd,cphone?where?((((student.s=sc.s?and?teacher.t=course.t)?and?course.class=sc.class)and?cadd.s=student.s)and?tadd.t=teacher.t)?and?cphone.s=student.s)as?a1;  +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+  |?count(t)?|?sum(score)?|?avg(score)?|?s????|?sname??|?cadd???|?sage?|?class?|?score?|?t????|?tname??|?tadd???|?ssex?|?cphone?|  +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+  |???????21?|???????1483?|????70.6190?|????1?|?劉一???|?福建???|???18?|?????1?|????56?|????1?|?葉平???|?福建???|?男???|??12345?|  +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+  1?row?in?set?(0.08?sec)

沒有指定分組,就直接把第一行的數據套過來了。

正解:

mysql>?select?a1.*,sum(score),count(t),avg(score)?from(select?student.s,sname,cadd,sage,sc.class,teacher.t,cname,score,tname,tadd,ssex,cphone?from?student,teacher,sc,course,?cadd,tadd,cphone?where?((((student.s=sc.s?and  ?teacher.t=course.t)?and?course.class=sc.class)and?cadd.s=student.s)and?tadd.t=teacher.t)?and?cphone.s=student.s)as?a1?group?by?s;  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------------+----------+------------+  |?s????|?sname??|?cadd???|?sage?|?class?|?t????|?cname??|?score?|?tname??|?tadd???|?ssex?|?cphone?|?sum(score)?|?count(t)?|?avg(score)?|  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------------+----------+------------+  |????1?|?劉一???|?福建???|???18?|?????1?|????1?|?語文???|????56?|?葉平???|?福建???|?男???|??12345?|????????259?|????????4?|????64.7500?|  |????2?|?錢二???|?深圳???|???19?|?????1?|????1?|?語文???|????79?|?葉平???|?福建???|?女???|??12346?|????????320?|????????4?|????80.0000?|  |????3?|?張三???|?上海???|???17?|?????1?|????1?|?語文???|????91?|?葉平???|?福建???|?男???|??12347?|????????282?|????????4?|????70.5000?|  |????4?|?李四???|?湖南???|???18?|?????2?|????2?|?數學???|????88?|?賀高???|?深圳???|?女???|??12348?|????????271?|????????3?|????90.3333?|  |????5?|?王五???|?江西???|???17?|?????1?|????1?|?語文???|????46?|?葉平???|?福建???|?男???|??12349?|????????177?|????????3?|????59.0000?|  |????6?|?趙六???|?廣西???|???19?|?????1?|????1?|?語文???|????35?|?葉平???|?福建???|?女???|??13349?|????????174?|????????3?|????58.0000?|  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------------+----------+------------+  6?rows?in?set?(0.00?sec)

4.查詢每個學生參加課程的總數,總分,平均分及其所有信息后按照總分排降序后顯示評價分不小于80分的學生的所有信息:

mysql>??select?*?from(select?count(t),sum(score),avg(score),s,sname,cadd,sage,class,score,t,tname,tadd,ssex,cphone?from(select?student.s,sname,cadd,sage,sc.class,score,teacher.t,tname,tadd,ssex,cphone?from?student,teacher,sc,course,  ?cadd,tadd,cphone?where?((((student.s=sc.s?and?teacher.t=course.t)?and?course.class=sc.class)and?cadd.s=student.s)and?tadd.t=teacher.t)?and?cphone.s=student.s)as?a1?group?by?s?order?by?sum(score)?desc)a3?having?avg(score)>=80;  Empty?set?(0.00?sec)

SQL語句是沒有錯的(CNAME字段漏了),但是結果就……

+----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+  |?count(t)?|?sum(score)?|?avg(score)?|?s????|?sname??|?cadd???|?sage?|?class?|?score?|?t????|?tname??|?tadd???|?ssex?|?cphone?|  +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+  |????????4?|????????320?|????80.0000?|????2?|?錢二???|?深圳???|???19?|?????1?|????79?|????1?|?葉平???|?福建???|?女???|??12346?|  |????????4?|????????282?|????70.5000?|????3?|?張三???|?上海???|???17?|?????1?|????91?|????1?|?葉平???|?福建???|?男???|??12347?|  |????????3?|????????271?|????90.3333?|????4?|?李四???|?湖南???|???18?|?????2?|????88?|????2?|?賀高???|?深圳???|?女???|??12348?|  |????????4?|????????259?|????64.7500?|????1?|?劉一???|?福建???|???18?|?????1?|????56?|????1?|?葉平???|?福建???|?男???|??12345?|  |????????3?|????????177?|????59.0000?|????5?|?王五???|?江西???|???17?|?????1?|????46?|????1?|?葉平???|?福建???|?男???|??12349?|  |????????3?|????????174?|????58.0000?|????6?|?趙六???|?廣西???|???19?|?????1?|????35?|????1?|?葉平???|?福建???|?女???|??13349?|  +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+  6?rows?in?set?(0.00?sec)

mysql>??select?*?from(select?count(t),sum(score),avg(score),s,sname,cadd,sage,class,score,t,tname,tadd,ssex,cphone?from(select?student.s,sname,cadd,sage,sc.class,score,teacher.t,tname,tadd,ssex,cphone?from?student,teacher,sc,course,  ?cadd,tadd,cphone?where?((((student.s=sc.s?and?teacher.t=course.t)?and?course.class=sc.class)and?cadd.s=student.s)and?tadd.t=teacher.t)?and?cphone.s=student.s)as?a1?group?by?s?order?by?sum(score)?desc)a3?having?avg(score)>0;  +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+  |?count(t)?|?sum(score)?|?avg(score)?|?s????|?sname??|?cadd???|?sage?|?class?|?score?|?t????|?tname??|?tadd???|?ssex?|?cphone?|  +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+  |????????4?|????????320?|????80.0000?|????2?|?錢二???|?深圳???|???19?|?????1?|????79?|????1?|?葉平???|?福建???|?女???|??12346?|  +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+  1?row?in?set?(0.00?sec)

而這個語句,這個結果的出現令我徹底蒙圈了。

最后想了一個以毒攻毒的辦法終于將之拿下。

mysql>??select?*?from(select?count(t),sum(score),avg(score),s,sname,cadd,sage,class,score,t,tname,tadd,ssex,cphone?from(select?student.s,sname,cadd,sage,sc.class,score,teacher.t,tname,tadd,ssex,cphone?from?student,teacher,sc,course,  ?cadd,tadd,cphone?where?((((student.s=sc.s?and?teacher.t=course.t)?and?course.class=sc.class)and?cadd.s=student.s)and?tadd.t=teacher.t)?and?cphone.s=student.s)as?a1?group?by?s?order?by?sum(score)?desc)a3?having?sum(score)/4>=80;  +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+  |?count(t)?|?sum(score)?|?avg(score)?|?s????|?sname??|?cadd???|?sage?|?class?|?score?|?t????|?tname??|?tadd???|?ssex?|?cphone?|  +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+  |????????4?|????????320?|????80.0000?|????2?|?錢二???|?深圳???|???19?|?????1?|????79?|????1?|?葉平???|?福建???|?女???|??12346?|  +----------+------------+------------+------+--------+--------+------+-------+-------+------+--------+--------+------+--------+  1?row?in?set?(0.02?sec)

然而并沒有什么卵用……

當然還是有正解的:

mysql>?select?*?from?(select?a1.*,sum(score)?as?ss,count(t)?as?ct,avg(score)?as?a3?from(select?student.s,sname,cadd,sage,sc.class,teacher.t,cname,score,tname,tadd,ssex,cphone?from?student,teacher,sc,course,?cadd,tadd,cphone  ?where?((((student.s=sc.s?and?teacher.t=course.t)?and?course.class=sc.class)and?cadd.s=student.s)and?tadd.t=teacher.t)?and?cphone.s=student.s)as?a1?group?by?s?desc)as?a2?where?a3=80?or?a3>80;  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+  |?s????|?sname??|?cadd???|?sage?|?class?|?t????|?cname??|?score?|?tname??|?tadd???|?ssex?|?cphone?|?ss???|?ct?|?a3??????|  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+  |????4?|?李四???|?湖南???|???18?|?????2?|????2?|?數學???|????88?|?賀高???|?深圳???|?女???|??12348?|??271?|??3?|?90.3333?|  |????2?|?錢二???|?深圳???|???19?|?????1?|????1?|?語文???|????79?|?葉平???|?福建???|?女???|??12346?|??320?|??4?|?80.0000?|  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+  2?rows?in?set?(0.00?sec)

出于科學嚴謹的態度(呃,好吧,是偶搞錯太多次了,怕了),讓我們一起來驗證一下:

mysql>?select?*?from?(select?a1.*,sum(score)?as?ss,count(t)?as?ct,avg(score)?as?a3?from(select?student.s,sname,cadd,sage,sc.class,teacher.t,cname,score,tname,tadd,ssex,cphone?from?student,teacher,sc,course,?cadd,tadd,cphone?where?((((student.s=sc.s?and  ?teacher.t=course.t)?and?course.class=sc.class)and?cadd.s=student.s)and?tadd.t=teacher.t)?and?cphone.s=student.s)as?a1?group?by?s?desc)as?a2?where?a3=80?or?a3>60;  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+  |?s????|?sname??|?cadd???|?sage?|?class?|?t????|?cname??|?score?|?tname??|?tadd???|?ssex?|?cphone?|?ss???|?ct?|?a3??????|  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+  |????4?|?李四???|?湖南???|???18?|?????2?|????2?|?數學???|????88?|?賀高???|?深圳???|?女???|??12348?|??271?|??3?|?90.3333?|  |????3?|?張三???|?上海???|???17?|?????1?|????1?|?語文???|????91?|?葉平???|?福建???|?男???|??12347?|??282?|??4?|?70.5000?|  |????2?|?錢二???|?深圳???|???19?|?????1?|????1?|?語文???|????79?|?葉平???|?福建???|?女???|??12346?|??320?|??4?|?80.0000?|  |????1?|?劉一???|?福建???|???18?|?????1?|????1?|?語文???|????56?|?葉平???|?福建???|?男???|??12345?|??259?|??4?|?64.7500?|  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+  4?rows?in?set?(0.00?sec)
mysql>?select?*?from?(select?a1.*,sum(score)?as?ss,count(t)?as?ct,avg(score)?as?a3?from(select?student.s,sname,cadd,sage,sc.class,teacher.t,cname,score,tname,tadd,ssex,cphone?from?student,teacher,sc,course,?cadd,tadd,cphone?where?((((student.s=sc.s?and  ?teacher.t=course.t)?and?course.class=sc.class)and?cadd.s=student.s)and?tadd.t=teacher.t)?and?cphone.s=student.s)as?a1?group?by?s?desc)as?a2;  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+  |?s????|?sname??|?cadd???|?sage?|?class?|?t????|?cname??|?score?|?tname??|?tadd???|?ssex?|?cphone?|?ss???|?ct?|?a3??????|  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+  |????6?|?趙六???|?廣西???|???19?|?????1?|????1?|?語文???|????35?|?葉平???|?福建???|?女???|??13349?|??174?|??3?|?58.0000?|  |????5?|?王五???|?江西???|???17?|?????1?|????1?|?語文???|????46?|?葉平???|?福建???|?男???|??12349?|??177?|??3?|?59.0000?|  |????4?|?李四???|?湖南???|???18?|?????2?|????2?|?數學???|????88?|?賀高???|?深圳???|?女???|??12348?|??271?|??3?|?90.3333?|  |????3?|?張三???|?上海???|???17?|?????1?|????1?|?語文???|????91?|?葉平???|?福建???|?男???|??12347?|??282?|??4?|?70.5000?|  |????2?|?錢二???|?深圳???|???19?|?????1?|????1?|?語文???|????79?|?葉平???|?福建???|?女???|??12346?|??320?|??4?|?80.0000?|  |????1?|?劉一???|?福建???|???18?|?????1?|????1?|?語文???|????56?|?葉平???|?福建???|?男???|??12345?|??259?|??4?|?64.7500?|  +------+--------+--------+------+-------+------+--------+-------+--------+--------+------+--------+------+----+---------+  6?rows?in?set?(0.00?sec)

通過這個案例我們可以清楚的看到七個表的聯合查詢還是很有挑戰性的,很多時候查詢出來的結果雖然是對的,甚至有些時候就連語句看起來也是對的……但是,呃,其實都是錯的。真正真確的語句是必須經得起反復驗證的(終于搞定了,鼓勵下)。

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享