以前聯繫了一些MySQL的查詢相關知識,如今補充做爲一個記錄,省得本身忘記。sql
致謝博主:https://blog.csdn.net/dehu_zhou/article/details/52881587函數
#建表語句與測試數據 --建立測試數據 create table Student( S varchar(10), Sname varchar(10), Sage datetime, Ssex nvarchar(10) ) ; insert into Student values('01' , '趙雷' , '1990-01-01' , '男'); insert into Student values('02' , '錢電' , '1990-12-21' , '男'); insert into Student values('03' , '孫風' , '1990-05-20' , '男'); insert into Student values('04' , '李雲' , '1990-08-06' , '男'); insert into Student values('05' , '周梅' , '1991-12-01' , '女'); insert into Student values('06' , '吳蘭' , '1992-03-01' , '女'); insert into Student values('07' , '鄭竹' , '1989-07-01' , '女'); insert into Student values('08' , '王菊' , '1990-01-20' , '女'); create table SC( Sid varchar(10), Cid varchar(10), score decimal(18,1) ); insert into SC values('01' , '01' , 80); insert into SC values('01' , '02' , 90); insert into SC values('01' , '03' , 99); insert into SC values('02' , '01' , 70); insert into SC values('02' , '02' , 60); insert into SC values('02' , '03' , 80); insert into SC values('03' , '01' , 80); insert into SC values('03' , '02' , 80); insert into SC values('03' , '03' , 80); insert into SC values('04' , '01' , 50); insert into SC values('04' , '02' , 30); insert into SC values('04' , '03' , 20); insert into SC values('05' , '01' , 76); insert into SC values('05' , '02' , 87); insert into SC values('06' , '01' , 31); insert into SC values('06' , '03' , 34); insert into SC values('07' , '02' , 89); insert into SC values('07' , '03' , 98); create table Course( Cid varchar(10), Cname varchar(10), Tid varchar(10) ); insert into Course values('01' , '語文' , '02'); insert into Course values('02' , '數學' , '01'); insert into Course values('03' , '英語' , '03'); create table Teacher( Tid varchar(10), Tname varchar(10) ); insert into Teacher values('01' , '張三'); insert into Teacher values('02' , '李四'); insert into Teacher values('03' , '王五');
練習題:測試
題一:查詢"01"課程比"02"課程成績高的學生的信息及課程分數。 優化
--分析過程:
--基表:學生的信息(Student),課程分數(SC) --條件: #1.成績本身比本身; #2.查詢學生的信息; #方法1:使用內鏈接,並做爲子查詢條件進行查詢 SELECT t2.*, t1.`01分數`, t1.`02分數` FROM ( SELECT a.Sid, a.score AS '01分數', b.score AS '02分數' FROM SC a INNER JOIN SC b ON a.Sid = b.Sid and a.Cid='01' and b.Cid='02' WHERE a.score > b.score ) t1, Student t2 where t1.Sid=t2.Sid; #方法2:使用三層內鏈接連續使用 #考點:三層嵌套內鏈接 SELECT a.*, b.score AS '01分數', c.score AS '02分數' FROM Student a INNER JOIN SC b ON a.Sid = b.Sid AND b.Cid = '01' INNER JOIN SC c ON a.Sid = c.Sid AND c.Cid = '02' WHERE b.score > c.score;
二、查詢"01"課程比"02"課程成績低的學生的信息及課程分數spa
#與題目1一致,修改爲績比較條件 SELECT a.*, b.score AS '01分數', c.score AS '02分數' FROM Student a INNER JOIN SC b ON a.Sid = b.Sid AND b.Cid = '01' INNER JOIN SC c ON a.Sid = c.Sid AND c.Cid = '02' WHERE b.score < c.score;
三、查詢平均成績大於等於60分的同窗的學生編號和學生姓名和平均成績.net
#考點,group by 子句以及having的條件刪選 SELECT a.*, b.avg_score FROM Student a, ( SELECT t.Sid, round(avg(t.score), 2) AS avg_score FROM SC t GROUP BY t.Sid HAVING avg(t.score) > 60 ) b WHERE a.Sid = b.Sid; #+外鏈接版本 SELECT t1.*,t2.avg_score FROM ( SELECT t.Sid, round(avg(t.score), 2) AS avg_score FROM SC t GROUP BY t.Sid HAVING avg(t.score) > 60 ) t2 LEFT JOIN Student t1 ON t2.Sid = t1.Sid; #外鏈接凝練版本 SELECT t1.*, round(avg(t.score), 2) AS avg_score FROM SC t RIGHT JOIN Student t1 ON t.Sid = t1.Sid GROUP BY t.Sid HAVING avg(t.score) > 60;
四、查詢平均成績小於60分的同窗的學生編號和學生姓名和平均成績code
SELECT t1.*, round(avg(t.score), 2) AS avg_score FROM SC t RIGHT JOIN Student t1 ON t.Sid = t1.Sid GROUP BY t.Sid HAVING avg(t.score) < 60;
五、查詢全部同窗的學生編號、學生姓名、選課總數、全部課程的總成績 blog
SELECT b.Sname, a.Sid, count(DISTINCT a.Cid) as '選課總數', sum(a.score) as '總成績' FROM SC a LEFT JOIN Student b ON a.Sid = b.Sid GROUP BY a.Sid;
六、查詢"李"姓老師的數量 排序
select count(*) from Teacher a where a.Tname like '李%';
七、查詢學過"張三"老師授課的同窗的信息 ci
SELECT a.Tname, b.Cid, d.* FROM Teacher a, Course b, SC c, Student d WHERE a.Tname = '張三' AND a.Tid = b.Tid AND b.Cid = c.Cid AND c.Sid = d.Sid; #方法2:使用三層內鏈接連續使用 SELECT a.* FROM Student a INNER JOIN SC b ON a.Sid = b.Sid INNER JOIN Course c ON b.Cid = c.Cid INNER JOIN Teacher d ON c.Tid = d.Tid WHERE d.Tname = '張三' GROUP BY 1,2,3,4; #按照查詢(select後面的)的1,2,3,4字段來分組 #方法3:方法2基礎上補充 SELECT a.* FROM Student a LEFT JOIN ( SELECT a.* FROM Student a INNER JOIN SC b ON a.Sid = b.Sid INNER JOIN Course c ON b.Cid = c.Cid INNER JOIN Teacher d ON c.Tid = d.Tid WHERE d.Tname = '張三' GROUP BY 1,2,3,4 ) t ON a.Sid = t.Sid WHERE t.Sid IS NOT NULL;
八、查詢沒學過"張三"老師授課的同窗的信息
#方法1:直接對原來學過張三老師課程的學生信息進行not in SELECT * FROM Student t WHERE t.Sid NOT IN ( SELECT d.Sid FROM Teacher a, Course b, SC c, Student d WHERE a.Tname = '張三' AND a.Tid = b.Tid AND b.Cid = c.Cid AND c.Sid = d.Sid ); #NOT IN 與 NOT EXISTS的用法區別 SELECT * FROM Student t WHERE not EXISTS ( SELECT * #此處返回的是整個結果集,若是單挑sid,則返回的結果與預期結果不一致 FROM Teacher a, Course b, SC c, Student d WHERE a.Tname = '張三' AND a.Tid = b.Tid AND b.Cid = c.Cid AND c.Sid = d.Sid AND d.Sid = t.Sid #此處爲結果集的判斷 );
九、查詢學過編號爲"01"而且也學過編號爲"02"的課程的同窗的信息
SELECT c.*,a.score as '01分數',b.score as '02分數' FROM Student c INNER JOIN SC a ON c.Sid = a.Sid INNER JOIN SC b ON a.Sid = b.Sid AND a.Cid = '01' AND b.Cid = '02';
十、查詢學過編號爲"01"可是沒有學過編號爲"02"的課程的同窗的信息
#重要,我沒有作出來 ##方法:連續的左鏈接,篩選出差別結果 SELECT * FROM Student a LEFT JOIN SC b ON a.Sid = b.Sid AND b.Cid = '01' LEFT JOIN SC c ON a.Sid = c.Sid AND c.Cid = '02' WHERE b.Cid = '01' AND c.Cid IS NULL;
十一、查詢沒有學全全部課程的同窗的信息
SELECT * FROM Student b LEFT JOIN SC a ON a.Sid = b.Sid GROUP BY a.Sid HAVING count(a.cid) < 3; #完善方法 SELECT a.* FROM Student a LEFT JOIN SC b ON a.Sid = b.Sid LEFT JOIN ( SELECT COUNT(1) anum FROM Course ) c ON 1 = 1 #經過子查詢和恆真條件篩選 GROUP BY 1, 2, 3, 4 HAVING MAX(c.anum) > COUNT(b.Cid);
十二、查詢至少有一門課與學號爲"01"的同窗所學相同的同窗的信息
SELECT DISTINCT b.* FROM Student b LEFT JOIN SC c ON b.Sid = c.Sid AND c.Cid IN ( SELECT a.Cid FROM SC a WHERE a.Sid = '01' ); #方法2: SELECT a.* FROM Student a INNER JOIN SC b ON a.Sid = b.Sid WHERE EXISTS ( SELECT 1 FROM SC WHERE Sid = '01' AND Cid = b.Cid ) GROUP BY 1, 2, 3, 4; #方法3::經過組裝cid字段比對進行篩選 #重點:GROUP_CONCAT(cid ORDER BY cid) 函數的用法 #1.須要配合group by 子句使用 #2.內部字段的排序的用法 SELECT DISTINCT t.* FROM Student t INNER JOIN SC t1 ON t.Sid = t1.Sid WHERE t.Sid IN ( SELECT t3.Sid FROM ( SELECT sid, GROUP_CONCAT(cid ORDER BY cid) AS cid_list FROM SC a WHERE a.sid = '01' GROUP BY sid ) t2 RIGHT JOIN ( SELECT sid, GROUP_CONCAT(cid ORDER BY cid) AS cid_list FROM SC a GROUP BY sid ) t3 ON t2.cid_list = t3.cid_list WHERE t2.sid IS NOT NULL );
1四、查詢沒學過"張三"老師講授的任一門課程的學生姓名
SELECT t.*, t1.Tid FROM Student t LEFT JOIN ( SELECT a.*, d.Tid FROM Student a LEFT JOIN SC b ON a.sid = b.sid LEFT JOIN Course c ON c.Cid = b.Cid LEFT JOIN Teacher d ON c.Tid = d.Tid AND d.Tname = '張三' WHERE d.Tid IS NOT NULL ) t1 ON t.Sid = t1.sid WHERE t1.tid IS NULL;
1五、查詢兩門及其以上不及格課程的同窗的學號,姓名及其平均成績
SELECT * FROM Student t LEFT JOIN ( SELECT sid, round(avg(score), 1) AS avg_score FROM SC a WHERE a.score < 60 GROUP BY sid HAVING count(*) > 1 ) t1 ON t.Sid = t1.sid WHERE t1.avg_score IS NOT NULL;
#優化 SELECT a.Sid , a.Sname , round(avg(score), 1) AS avg_score FROM Student a INNER JOIN SC b ON a.Sid = b.Sid GROUP BY 1, 2 HAVING SUM( CASE WHEN b.Score >= 60 THEN 0 ELSE 1 END ) >= 2;
1六、檢索"01"課程分數小於60,按分數降序排列的學生信息
SELECT a.* FROM Student a LEFT JOIN SC b ON a.Sid = b.Sid AND b.Cid = '01' WHERE b.score < 60 ORDER BY b.Cid DESC;
1七、按平均成績從高到低顯示全部學生的全部課程的成績以及平均成績
select t.*, round((s01+s02+s03)/3,2) as avs from ( SELECT a.* ,SUM(CASE WHEN b.Cid='01' THEN b.score ELSE 0 END) AS s01 ,SUM(CASE WHEN b.Cid='02' THEN b.score ELSE 0 END) AS s02 ,SUM(CASE WHEN b.Cid='03' THEN b.score ELSE 0 END) AS s03 FROM Student a LEFT JOIN SC b ON a.Sid=b.Sid GROUP BY 1,2,3,4 ) t ORDER BY avs desc; select * from Student t LEFT JOIN ( select a.Sid ,max(case when a.Cid='01' THEN a.score ELSE 0 END) as s01 ,max(case when a.Cid='02' THEN a.score ELSE 0 END) as s02 ,max(case when a.Cid='03' THEN a.score ELSE 0 END) as s03 ,round(avg(case when a.score is null then 0 else a.score end),2) as avs from SC a group BY a.Sid ) t1 on t.Sid = t1.Sid ;
1八、查詢各科成績最高分、最低分和平均分:以以下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
#-- --及格爲>=60,中等爲:70-80,優良爲:80-90,優秀爲:>=90 #考察重點再分組 select a.cid,b.Cname,max(a.score),min(a.score),avg(a.score) ,concat(ROUND(count(IF(a.score >=60 ,1,null))/count(1) * 100,2),'%') as '及格率' ,concat(ROUND(sum(case when a.score >= 70 and a.score < 80 then 1 else 0 end)/count(1) * 100,2),'%') as '中等率' ,concat(ROUND(sum(case when a.score >= 80 and a.score < 90 then 1 else 0 end)/count(1) * 100,2),'%') as '優良率' ,concat(ROUND(sum(case when a.score >= 90 then 1 else 0 end)/count(1) * 100,2),'%') as '優秀率' from SC a INNER JOIN Course b on a.Cid = b.Cid group by 1,2;
1九、按各科成績進行排序,並顯示排名
#單科排序方法,自定義變量 SET @rn:=0; SELECT a.*,@rn:=@rn+1 as '排名' FROM( select a.*,b.score from Course a INNER JOIN SC b on a.Cid = b.Cid where a.Cid='01' ORDER BY a.Cid,b.score desc )a ; #按科目排序方法,經過自鏈接比對排序規則 SELECT a.*, count(b.Cid) + 1 AS tp FROM SC a LEFT JOIN SC b ON a.Cid = b.Cid AND a.score < b.score GROUP BY a.Sid, a.Cid ORDER BY a.Cid, a.score DESC;
20、查詢學生的總成績並進行排名
SET @ct := 0; SELECT (@ct := @ct + 1) AS '排名', b.Sname, ifnull(sum(a.score), 0) AS '總成績' FROM SC a RIGHT JOIN Student b ON a.Sid = b.Sid GROUP BY a.Sid ORDER BY sum(a.score) DESC;
2一、查詢不一樣老師所教不一樣課程平均分從高到低顯示
##沒有統計未參考學生的平均分 select d.Tname,c.Cname,ROUND(sum(b.score)/count(a.Sid),2) as '科目平均分' from Student a LEFT JOIN SC b on a.Sid = b.Sid LEFT JOIN Course c on c.Cid = b.Cid LEFT JOIN Teacher d on c.Tid = d.Tid where b.Cid is not null group by b.Cid ORDER BY sum(b.score)/count(a.Sid) desc; SELECT a.*,b.Cname,AVG(c.Score) ascore FROM Teacher a INNER JOIN Course b ON a.Tid=b.Tid INNER JOIN SC c ON b.Cid=c.Cid GROUP BY 1,2,3 ORDER BY ascore DESC ; #統計未參考學生的平均分 select sum(case when b.cid = '01' then b.score else 0 end)/count(distinct a.Sid) as avg_01, sum(case when b.cid = '02' then b.score else 0 end)/count(distinct a.Sid) as avg_02, sum(case when b.cid = '03' then b.score else 0 end)/count(distinct a.Sid) as avg_03 from Student a LEFT JOIN SC b on a.Sid = b.Sid;
2二、查詢全部課程的成績第2名到第3名的學生信息及該課程成績
#核心爲題19按科目的成績排序 SELECT c.Sname, d.cid, d.score, d.tp FROM Student c INNER JOIN ( SELECT a.*, count(b.Cid) + 1 AS tp FROM SC a LEFT JOIN SC b ON a.Cid = b.Cid AND a.score < b.score GROUP BY a.Sid, a.Cid HAVING count(b.Cid) + 1 IN (2, 3) ) d ON c.Sid = d.sid;
2三、統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[0-60]及所佔百分比
select t.*,c.Cname ,concat(round(t.bjg/sum(t.bjg+t.pt+t.lh+t.yx)* 100 ,2),'%') as bl_bjg ,concat(round(t.pt/sum(t.bjg+t.pt+t.lh+t.yx)* 100 ,2),'%') as bl_pt ,concat(round(t.lh/sum(t.bjg+t.pt+t.lh+t.yx)* 100 ,2),'%') as bl_lh ,concat(round(t.yx/sum(t.bjg+t.pt+t.lh+t.yx)* 100 ,2),'%') as bl_yx from ( select cid ,sum(case when a.score < 60 then 1 else 0 end) as 'bjg' ,sum(case when a.score > 60 and a.score <= 70 then 1 else 0 end) as 'pt' ,sum(case when a.score > 70 and a.score <= 80 then 1 else 0 end) as 'lh' ,sum(case when a.score > 80 then 1 else 0 end) as 'yx' from SC a group by a.cid ) t LEFT JOIN Course c on t.cid =c.cid GROUP BY t.cid ; #直接計算 SELECT a.Cid ,a.cname ,SUM(CASE WHEN b.score<=100 AND b.score>85 THEN 1 ELSE 0 END) AS 'yx' ,SUM(CASE WHEN b.score<=85 AND b.score>70 THEN 1 ELSE 0 END) AS 'lh' ,SUM(CASE WHEN b.score<=70 AND b.score>60 THEN 1 ELSE 0 END) AS 'jg' ,SUM(CASE WHEN b.score<=60 AND b.score>0 THEN 1 ELSE 0 END) AS 'bjg' ,SUM(CASE WHEN b.score<=100 AND b.score>85 THEN 1 ELSE 0 END)/COUNT(1) AS 'yx%' ,SUM(CASE WHEN b.score<=85 AND b.score>70 THEN 1 ELSE 0 END)/COUNT(1) AS 'lh%' ,SUM(CASE WHEN b.score<=70 AND b.score>60 THEN 1 ELSE 0 END)/COUNT(1) AS 'jg%' ,SUM(CASE WHEN b.score<=60 AND b.score>0 THEN 1 ELSE 0 END)/COUNT(1) AS 'bjg%' FROM Course a INNER JOIN SC b ON a.Cid=b.Cid GROUP BY 1,2 ;
2四、查詢學平生均成績及其名次
set @mc := 0; select t.* ,@mc := @mc + 1 as '名次' from ( select c.Sid,c.Sname,sum(b.score)/3 as pjf from Course a LEFT JOIN SC b on a.Cid = b.Cid RIGHT JOIN Student c on b.Sid =c.Sid group by b.Sid ORDER BY pjf desc ) t ; #方法2 SELECT a.* ,COUNT(b.Sid)+1 FROM ( SELECT a.*,AVG(CASE WHEN b.SCore IS NULL THEN 0 ELSE b.SCore END) AS aSCore FROM Student a LEFT JOIN SC b ON a.Sid=b.Sid GROUP BY 1,2,3,4 )a LEFT JOIN( SELECT a.*,AVG(CASE WHEN b.SCore IS NULL THEN 0 ELSE b.SCore END) AS aSCore FROM Student a LEFT JOIN SC b ON a.Sid=b.Sid GROUP BY 1,2,3,4 )b ON a.aSCore<b.aSCore GROUP BY 1,2,3,4,5 ;
2五、查詢各科成績前三名的記錄
##題22 方法的同種類型 SELECT c.Sname, d.cid, d.score, d.tp FROM Student c INNER JOIN ( SELECT a.*, count(b.Cid) + 1 AS tp FROM SC a LEFT JOIN SC b ON a.Cid = b.Cid AND a.score < b.score GROUP BY a.Sid, a.Cid HAVING count(b.Cid) + 1 <4 ) d ON c.Sid = d.sid order by d.cid; SELECT a.*,COUNT(b.cid)+1 AS ascore FROM SC a LEFT JOIN SC b ON a.cid=b.cid AND a.score<b.score GROUP BY 1,2,3 HAVING ascore<=3 ORDER BY a.cid,ascore ;
26查詢每門課程被選修的學生數
SELECT a.* ,COUNT(b.sid) FROM Course a LEFT JOIN SC b ON a.cid=b.cid GROUP BY 1,2,3 ;
2七、查詢出只有兩門課程的所有學生的學號和姓名
SELECT a.* FROM Student a LEFT JOIN SC b ON a.Sid = b.Sid GROUP BY b.Sid HAVING count(b.cid) = 2;
2八、查詢男生、女生人數
SELECT a.Ssex, count(a.Sid) FROM Student a GROUP BY a.Ssex;
#2九、查詢名字中含有"風"字的學生信息 select * from Student a where a.Sname like '%風%';
#30、查詢同名同性學生名單,並統計同名人數 select * from Student a group by a.Sname HAVING count(a.Sname)>1; #3一、查詢1990年出生的學生名單(注:Student表中Sage列的類型是datetime) SELECT * FROM Student WHERE YEAR(sage)=1990 ;
#3二、查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號
SELECT a.*,AVG(b.Score) as ore FROM Course a LEFT JOIN SC b ON a.cid=b.cid GROUP BY 1,2,3 ORDER BY ore DESC,a.cid ;
3三、查詢平均成績大於等於85的全部學生的學號、姓名和平均成績
SELECT a.Sid, a.Sname, sum( CASE WHEN b.score IS NULL THEN 0 ELSE b.score END ) / 3 AS avgsc FROM Student a LEFT JOIN SC b ON a.Sid = b.Sid GROUP BY a.Sid HAVING avgsc > 85;
3四、查詢課程名稱爲"數學",且分數低於60的學生姓名和分數
SELECT a.*, b.score FROM Student a LEFT JOIN SC b ON a.Sid = b.sid LEFT JOIN Course c ON b.Cid = c.Cid WHERE b.score < 60 AND c.Cname = '數學' or c.Cname is null;
3五、查詢全部學生的課程及分數狀況;
SELECT c.cname,a.*,b.score FROM Student a LEFT JOIN SC b ON a.Sid = b.Sid LEFT JOIN Course c on b.Cid = c.Cid ORDER BY c.cname, a.Sid, b.Cid;
3六、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;
SELECT DISTINCT b.Sname, c.Cname, a.score FROM Student b LEFT JOIN SC a ON a.Sid = b.Sid LEFT JOIN Course c ON c.Cid = a.Cid WHERE a.score > 70;
#37 不及格的
SELECT DISTINCT b.Sname, c.Cname, a.score FROM Student b LEFT JOIN SC a ON a.Sid = b.Sid LEFT JOIN Course c ON c.Cid = a.Cid WHERE a.score < 60 or a.score is null;
#38查詢課程編號爲01且課程成績在80分以上的學生的學號和姓名;
SELECT DISTINCT b.Sname, c.Cname, a.score FROM Student b LEFT JOIN SC a ON a.Sid = b.Sid LEFT JOIN Course c ON c.Cid = a.Cid WHERE a.score > 80 and a.Cid='01';
3九、求每門課程的學生人數
SELECT a.Cid, count(a.Sid) FROM SC a GROUP BY a.Cid;
40、查詢選修"張三"老師所授課程的學生中,成績最高的學生信息及其成績
#方法1:排序獲取結果 SELECT * FROM Student a LEFT JOIN SC b ON a.Sid = b.Sid LEFT JOIN Course c ON b.Cid = c.Cid LEFT JOIN Teacher d ON c.Tid = d.Tid WHERE d.Tname = '張三' ORDER BY b.score DESC LIMIT 1; #方法2: 經過內鏈接最大值匹配 SELECT a.*,b.score FROM Student a INNER JOIN SC b ON a.Sid=b.Sid INNER JOIN( SELECT c.Cid ,MAX(c.score) AS maxscore FROM Teacher a INNER JOIN Course b ON a.Tid=b.Tid INNER JOIN SC c ON b.Cid=c.Cid WHERE a.Tname='張三' GROUP BY c.Cid )c ON b.Cid=c.Cid AND b.score=c.maxscore ;
4一、查詢不一樣課程成績相同的學生的學生編號、課程編號、學生成績
SELECT DISTINCT c.Sname, c.Sid, a.Cid, d.cname, a.score FROM Student c LEFT JOIN SC a ON a.Sid = c.Sid INNER JOIN SC b ON a.sid = b.Sid LEFT JOIN Course d ON a.Cid = d.Cid WHERE a.Cid != b.Cid AND a.score = b.score; #方法2 SELECT a.sid ,a.cid ,a.SCore FROM SC a INNER JOIN ( SELECT a.SCore ,b.sid ,COUNT(1) FROM SC a INNER JOIN Student b ON a.sid=b.sid GROUP BY a.SCore,b.sid HAVING COUNT(1)>1 )b ON a.sid=b.sid AND a.SCore=b.SCore ;
4二、查詢每門功成績最好的前兩名 ,同22
SELECT c.Sname, d.cid, d.score, d.tp FROM Student c INNER JOIN ( SELECT a.*, count(b.Cid) + 1 AS tp FROM SC a LEFT JOIN SC b ON a.Cid = b.Cid AND a.score < b.score GROUP BY a.Sid, a.Cid HAVING count(b.Cid) + 1 <3 ) d ON c.Sid = d.sid order by d.cid;
4三、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
SELECT a.Cid, a.Cname, count(b.Sid) FROM Course a LEFT JOIN SC b ON a.Cid = b.Cid GROUP BY b.Cid HAVING count(b.Sid) > 5 ORDER BY count(b.Sid) DESC, b.Cid;
#方法3::經過組裝cid字段比對進行篩選#重點:GROUP_CONCAT(cid ORDER BY cid) 函數的用法#1.須要配合group by 子句使用#2.內部字段的排序的用法
SELECT DISTINCTt.*FROMStudent tINNER JOIN SC t1 ON t.Sid = t1.SidWHEREt.Sid IN (SELECTt3.SidFROM(SELECTsid,GROUP_CONCAT(cid ORDER BY cid) AS cid_listFROMSC aWHEREa.sid = '01'GROUP BYsid) t2RIGHT JOIN (SELECTsid,GROUP_CONCAT(cid ORDER BY cid) AS cid_listFROMSC aGROUP BYsid) t3 ON t2.cid_list = t3.cid_listWHEREt2.sid IS NOT NULL);