SQL統計實例——mysql實現


網上的經典例題,這里用mysql方言實現。

 

表格如下:

 

mysql建表語句: 

/*Table structure for table `stuscore` */

DROP TABLE IF EXISTS `stuscore`; CREATE TABLE `stuscore` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `subject` varchar(20) DEFAULT NULL, `score` varchar(20) DEFAULT NULL, `stuid` varchar(10) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8; /*Data for the table `stuscore` */

insert  into `stuscore`(`id`,`name`,`subject`,`score`,`stuid`) values (1,'張三','數學','89','1'), (2,'張三','語文','80','1'), (3,'張三','英語','70','1'), (4,'李四','數學','90','2'), (5,'李四','語文','70','2'), (6,'李四','英語','80','2'), (7,'王五','數學','55','3'), (8,'王五','語文','92','3'), (9,'王五','英語','74','3'), (10,'趙六','數學','62','4'), (11,'趙六','語文','81','4'), (12,'趙六','英語','93','4');

 

問題:

1.    計算每個人的總成績並排名(要求顯示字段:姓名,總成績)

2.    計算每個人的總成績並排名(要求顯示字段: 學號,姓名,總成績)

3.    計算每個人單科的最高成績(要求顯示字段: 學號,姓名,課程,最高成績)

4.    計算每個人的平均成績(要求顯示字段: 學號,姓名,平均成績)

5.    列出各門課程成績最好的學生(要求顯示字段: 學號,姓名,科目,成績)

6.    列出各門課程成績最好的兩位學生(要求顯示字段: 學號,姓名,科目,成績)

7.    統計如下:

學號

姓名

語文

數學

英語

總分

平均分

 

 

 

 

 

 

 

 

 

 

 

8.列出各門課程的平均成績(要求顯示字段:課程,平均成績)

9.列出數學成績的排名(要求顯示字段:學號,姓名,成績,排名)

10.列出數學成績在2-3名的學生(要求顯示字段:學號,姓名,科目,成績)

11.求出李四的數學成績的排名

12.統計如下:

課程

不及格(0-59)個

良(60-80)個

優(81-100)個

 

 

 

 

  

 

 

 

 

 答案:

1.    計算每個人的總成績並排名(要求顯示字段:姓名,總成績)

SELECT a.name, SUM(score) sum_score FROM stuscore a GROUP BY a.name

  

2.    計算每個人的總成績並排名(要求顯示字段: 學號,姓名,總成績)

SELECT a.stuid, a.name, SUM(score) sum_score FROM stuscore a GROUP BY a.name

  

3.    計算每個人單科的最高成績(要求顯示字段: 學號,姓名,課程,最高成績)

SELECT a.stuid, a.name, a.subject, a.score FROM stuscore a JOIN ( SELECT stuid, MAX(score) max_score FROM stuscore GROUP BY stuid )b ON a.stuid=b.stuid WHERE a.score=b.max_score

  

4.    計算每個人的平均成績(要求顯示字段: 學號,姓名,平均成績)

SELECT DISTINCT a.stuid, a.name, b.avg_score FROM stuscore a JOIN ( SELECT stuid, AVG(score) avg_score FROM stuscore GROUP BY stuid )b ON a.stuid=b.stuid

  

5.    列出各門課程成績最好的學生(要求顯示字段: 學號,姓名,科目,成績)

SELECT DISTINCT a.stuid, a.name, a.subject, a.score FROM stuscore a JOIN ( SELECT subject, MAX(score) max_score FROM stuscore GROUP BY subject )b ON a.subject=b.subject WHERE a.score=b.max_score

  

6.    列出各門課程成績最好的兩位學生(要求顯示字段: 學號,姓名,科目,成績)

SELECT DISTINCT a.stuid, a.name, a.subject, a.score FROM stuscore a WHERE ( SELECT COUNT(1) FROM stuscore b WHERE b.subject=a.subject AND b.score>=a.score ) <= 2
ORDER BY a.subject ASC, a.score DESC

  

7.    統計如下:

學號

姓名

語文

數學

英語

總分

平均分

 

 

 

 

 

 

 

 

 

 

 

SELECT a.stuid 學號, a.name 姓名, SUM(CASE WHEN a.subject='語文' THEN score ELSE 0 END)語文, SUM(CASE WHEN a.subject='數學' THEN score ELSE 0 END)數學, SUM(CASE WHEN a.subject='英語' THEN score ELSE 0 END)英語, SUM(score)總分, (SUM(score)/COUNT(1))平均分 FROM stuscore a GROUP BY a.stuid

  

8.列出各門課程的平均成績(要求顯示字段:課程,平均成績)

SELECT a.subject, AVG(score) avg_score FROM stuscore a GROUP BY a.subject

  

9.列出數學成績的排名(要求顯示字段:學號,姓名,成績,排名)

SELECT a.*, @var:=@var+1 rank FROM ( SELECT stuid, name, score FROM stuscore WHERE subject='數學' ORDER BY score DESC )a, (SELECT @var:=0)b

  

10.列出數學成績在2-3名的學生(要求顯示字段:學號,姓名,科目,成績)

SELECT t.* FROM ( SELECT a.*, @var:=@var+1 rank FROM ( SELECT stuid, NAME, score FROM stuscore WHERE SUBJECT='數學' ORDER BY score DESC )a, (SELECT @var:=0)b )t WHERE t.rank IN (2,3)

  

11.求出李四的數學成績的排名

SELECT t.* FROM ( SELECT a.*, @var:=@var+1 rank FROM ( SELECT stuid, name, score FROM stuscore WHERE subject='數學' ORDER BY score DESC )a, (SELECT @var:=0)b )t WHERE t.name='李四'

  

12.統計如下:

課程

不及格(0-59)個

良(60-80)個

優(81-100)個

 

 

 

 

  

 

 

 

SELECT a.subject 課程, (SELECT COUNT(1) FROM stuscore WHERE subject=a.subject AND score<60)不及格, (SELECT COUNT(1) FROM stuscore WHERE subject=a.subject AND score BETWEEN 60 AND 80)良, (SELECT COUNT(1) FROM stuscore WHERE subject=a.subject AND score>80)優 FROM stuscore a GROUP BY a.subject

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM