sql入門練習題

題目來源於https://www.jianshu.com/p/476b52ee4f1b,本身的解法(僅供參考,有錯誤敬請指出~)sql

數據表介紹函數

--1.學生表
Student(SId,Sname,Sage,Ssex)
--SId 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別學習

--2.課程表
Course(CId,Cname,TId)
--CId 課程編號,Cname 課程名稱,TId 教師編號spa

--3.教師表
Teacher(TId,Tname)
--TId 教師編號,Tname 教師姓名code

--4.成績表
SC(SId,CId,score)
--SId 學生編號,CId 課程編號,score 分數排序

學生表 Student

create table Student(SId varchar(10),Sname varchar(10),Sage datetime,Ssex varchar(10));
insert into Student values('01' , '趙雷' , '1990-01-01' , '男');
insert into Student values('02' , '錢電' , '1990-12-21' , '男');
insert into Student values('03' , '孫風' , '1990-12-20' , '男');
insert into Student values('04' , '李雲' , '1990-12-06' , '男');
insert into Student values('05' , '周梅' , '1991-12-01' , '女');
insert into Student values('06' , '吳蘭' , '1992-01-01' , '女');
insert into Student values('07' , '鄭竹' , '1989-01-01' , '女');
insert into Student values('09' , '張三' , '2017-12-20' , '女');
insert into Student values('10' , '李四' , '2017-12-25' , '女');
insert into Student values('11' , '李四' , '2012-06-06' , '女');
insert into Student values('12' , '趙六' , '2013-06-13' , '女');
insert into Student values('13' , '孫七' , '2014-06-01' , '女');

科目表 Course

create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));
insert into Course values('01' , '語文' , '02');
insert into Course values('02' , '數學' , '01');
insert into Course values('03' , '英語' , '03');

教師表 Teacher

create table Teacher(TId varchar(10),Tname varchar(10));
insert into Teacher values('01' , '張三');
insert into Teacher values('02' , '李四');
insert into Teacher values('03' , '王五');

成績表 SC

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);

練習題目

  1. 查詢" 01 "課程比" 02 "課程成績高的學生的信息及課程分數
  2. 查詢同時存在" 01 "課程和" 02 "課程的學生信息
  3. 查詢存在" 01 "課程但可能不存在" 02 "課程的狀況(不存在時顯示爲 null )
  4. 查詢不存在" 01 "課程但存在" 02 "課程的狀況
  5. 查詢平均成績大於等於 60 分的同窗的學生編號和學生姓名和平均成績
  6. 查詢在 SC 表存在成績的學生信息
  7. 查詢全部同窗的學生編號、學生姓名、選課總數、全部課程的總成績(沒成績的顯示爲 null )
  8. 查有成績的學生信息
  9. 查詢「李」姓老師的數量
  10. 查詢學過「張三」老師授課的同窗的信息
  11. 查詢沒有學全全部課程的同窗的信息
  12. 查詢至少有一門課與學號爲" 01 "的同窗所學相同的同窗的信息
  13. 查詢和" 01 "號的同窗學習的課程 徹底相同的其餘同窗的信息
  14. 查詢沒學過"張三"老師講授的任一門課程的學生姓名
  15. 查詢兩門及其以上不及格課程的同窗的學號,姓名及其平均成績
  16. 檢索" 01 "課程分數小於 60,按分數降序排列的學生信息
  17. 按平均成績從高到低顯示全部學生的全部課程的成績以及平均成績
  18. 查詢各科成績最高分、最低分和平均分:ci

  19. 以以下形式顯示:課程 ID,課程 name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率數學

    及格爲>=60,中等爲:70-80,優良爲:80-90,優秀爲:>=90table

    要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列class

  20. 按各科成績進行排序,並顯示排名, Score 重複時保留名次空缺

  21. 按各科成績進行排序,並顯示排名, Score 重複時合併名次

  22. 查詢學生的總成績,並進行排名,總分重複時保留名次空缺

  23. 查詢學生的總成績,並進行排名,總分重複時不保留名次空缺

  24. 統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[60-0] 及所佔百分比
  25. 查詢各科成績前三名的記錄
  26. 查詢每門課程被選修的學生數
  27. 查詢出只選修兩門課程的學生學號和姓名
  28. 查詢男生、女生人數
  29. 查詢名字中含有「風」字的學生信息
  30. 查詢同名同性學生名單,並統計同名人數
  31. 查詢 1990 年出生的學生名單
  32. 查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列
  33. 查詢平均成績大於等於 85 的全部學生的學號、姓名和平均成績
  34. 查詢課程名稱爲「數學」,且分數低於 60 的學生姓名和分數
  35. 查詢全部學生的課程及分數狀況(存在學生沒成績,沒選課的狀況)
  36. 查詢任何一門課程成績在 70 分以上的姓名、課程名稱和分數
  37. 查詢不及格的課程
  38. 查詢課程編號爲 01 且課程成績在 80 分以上的學生的學號和姓名
  39. 求每門課程的學生人數
  40. 成績不重複,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
  41. 成績有重複的狀況下,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
  42. 查詢不一樣課程成績相同的學生的學生編號、課程編號、學生成績
  43. 查詢每門功成績最好的前兩名
  44. 統計每門課程的學生選修人數(超過 5 人的課程才統計)。
  45. 檢索至少選修兩門課程的學生學號
  46. 查詢選修了所有課程的學生信息
  47. 查詢各學生的年齡,只按年份來算
  48. 按照出生日期來算,當前月日 < 出生年月的月日則,年齡減一
  49. 查詢本週過生日的學生
  50. 查詢下週過生日的學生
  51. 查詢本月過生日的學生
  52. 查詢下月過生日的學生

答案(解法不惟一,僅我的想法)


 

  1. 查詢" 01 "課程比" 02 "課程成績高的學生的信息及課程分數
        這裏須要經過sc表先查出01課程大於02課程成績的學生id,要把01課程02課程成績分別查出來再拼接成一張表聯查,得出01課程大於02課程成績的學生id。而後到student表查詢信息。
    SELECT
    	s.sid,
    	s.sname,
    	sc1,
    	sc2 
    FROM
    	student s
    	LEFT JOIN (
    	SELECT
    		s1.SId,
    		sc1,
    		sc2 
    	FROM
    		( SELECT score sc1, SId FROM sc WHERE CId = 01 ) s1
    		INNER JOIN ( SELECT score sc2, SId FROM sc WHERE CId = 02 ) s2 
    	WHERE
    		sc1 > sc2 
    	) r ON s.sid = r.sid 
    WHERE
    	r.sc1 IS NOT NULL 
    GROUP BY
    	s.sid 
    ORDER BY
    	( s.sid )
  2. 查詢同時存在" 01 "課程和" 02 "課程的學生信息
    同題1拼接01課程,02課程的學生信息,判斷非空即獲取同事有01,02課程的學生id,而後拼接student獲取信息。
    SELECT
    	a.SId,
    	a.sc1,
    	a.sc2,
    	s.Sname 
    FROM
    	(
    	SELECT
    		s1.SId,
    		sc1,
    		sc2 
    	FROM
    		( SELECT score sc1, SId FROM sc WHERE CId = 01 ) s1
    		left JOIN ( SELECT score sc2, SId FROM sc WHERE CId = 02 ) s2 on s1.sid = s2.sid where SC1 IS NOT NULL AND SC2 IS NOT NULL 
    	) a
    	LEFT JOIN student s ON a.SId = s.SId 
    GROUP BY
    	SId
  3. 查詢存在" 01 "課程但可能不存在" 02 "課程的狀況(不存在時顯示爲 null )
    經過left join,以01爲主查詢便可獲取符合題目條件的sid list。
    ​SELECT
    		s1.SId,
    		sc1,
    		sc2 
    	FROM
    		( SELECT score sc1, SId FROM sc WHERE CId = 01 ) s1
    		LEFT JOIN ( SELECT score sc2, SId FROM sc WHERE CId = 02 ) s2 ON s1.SId = s2.SId
    ​
  4. 查詢不存在" 01 "課程但存在" 02 "課程的狀況
    此題和3題相似,考驗的是left/right join的特性.
    (
    	SELECT
    		s2.SId,
    		sc1,
    		sc2 
    	FROM
    		( SELECT score sc1, SId FROM sc WHERE CId = 01 ) s1
    		right JOIN ( SELECT score sc2, SId FROM sc WHERE CId = 02 ) s2 ON s1.SId = s2.SId
    	)
  5. 查詢平均成績大於等於 60 分的同窗的學生編號和學生姓名和平均成績
    知識點:聚合函數 avg 配合 having
    SELECT
    	s.sid,
    	s.sname,
    	a.avg_score 
    FROM
    	( SELECT sid, avg( score ) avg_score FROM sc GROUP BY ( sid ) HAVING ( avg( score ) > 60 ) ) a
    	LEFT JOIN student s ON a.sid = s.sId
  6. 查詢在 SC 表存在成績的學生信息
    emmmm
    SELECT
    	* 
    FROM
    	student s 
    WHERE
    	s.sid IN ( SELECT sid FROM sc GROUP BY ( sid ) )
    
    
    
    
    SELECT DISTINCT
    	student.* 
    FROM
    	student,
    	sc 
    WHERE
    	student.SId = sc.SId
  7. 查詢全部同窗的學生編號、學生姓名、選課總數、全部課程的總成績(沒成績的顯示爲 null )
    知識點:聚合函數 count。
    SELECT
    	s.sname,
    	a.* 
    FROM
    	student s
    	left JOIN ( SELECT sc.sid, count( sc.score ), avg( sc.score ) FROM sc GROUP BY sc.sid ) a ON s.sid = a.sid
  8. 查有成績的學生信息
    上面知識的總結。
    SELECT
    	s.sname,
    	a.* 
    FROM
    	student s
    	right JOIN ( SELECT sc.sid, count( sc.score ), avg( sc.score ) FROM sc GROUP BY sc.sid ) a ON s.sid = a.sid
  9. 查詢「李」姓老師的數量
    知識點:模糊查詢 like %
    SELECT
    	count( * ) 
    FROM
    	teacher 
    WHERE
    	tname LIKE '李%'
  10. 查詢學過「張三」老師授課的同窗的信息
    思路1:先在course表查出張三總是授課的課程cid,再在sc表查詢有這門課程成績的學生sid。拼接student獲取信息。
    思路2:多表聯查。
    SELECT
    	* 
    FROM
    	student s 
    WHERE
    	s.sid IN (
    	SELECT
    		sid 
    	FROM
    		sc 
    	WHERE
    		sc.cid = ( SELECT cid FROM course c WHERE c.tid = ( SELECT t.tid FROM teacher t WHERE t.Tname = '張三' ) ) 
    	) 
    	
    
    
    	
    	SELECT
    	student.* 
    FROM
    	student,
    	teacher,
    	course,
    	sc 
    WHERE
    	student.sid = sc.sid 
    	AND course.cid = sc.cid 
    	AND course.tid = teacher.tid 
    	AND tname = '張三';
  11. 查詢沒有學全全部課程的同窗的信息
    思路:先查出全部課程的數量,再對比每一個學生學的課程數量。
    SELECT
    	* 
    FROM
    	student 
    WHERE
    	student.sid NOT IN (
    	SELECT
    		sc.sid 
    	FROM
    		sc 
    	GROUP BY
    		sc.sid 
    	HAVING
    	count( sc.cid ) = ( SELECT count( cid ) FROM course ) 
    	);
  12. 查詢至少有一門課與學號爲" 01 "的同窗所學相同的同窗的信息
    首先查出01同窗學的課程list a,在計算有哪些同窗學的課程 in a,得出符合條件的同窗id,拼接student獲取信息
    SELECT
    	* 
    FROM
    	( SELECT sid FROM sc WHERE cid IN ( SELECT cid FROM sc WHERE sid = 01 ) AND sid != 01 GROUP BY sid ) a
    	LEFT JOIN student s ON a.sid = s.sid
  13. 查詢和" 01 "號的同窗學習的課程 徹底相同的其餘同窗的信息
    思路: 先查出01同窗的課程list,而後搜索sc表中sid存在list的數據,計算數量等於01同窗課程數量則徹底相同。
    SELECT
    	Student.* 
    FROM
    	Student 
    WHERE
    	SID IN (
    	SELECT DISTINCT
    		SC.SID 
    	FROM
    		(select * from sc group by cid,sid)sc         -- 確保一個學生一門課只有一次成績。 
    	WHERE
    		SID <> '01' 
    		AND SC.CID IN ( SELECT DISTINCT CID FROM SC WHERE SID = '01' ) 
    	GROUP BY
    		SC.SID 
    	HAVING
    	count( 1 ) = ( SELECT count( 1 ) FROM SC WHERE SID = '01' ) 
    	)
  14. 查詢沒學過"張三"老師講授的任一門課程的學生姓名
    思路: 先查出學過張三老師課程的學生。而後從student表排除,剩下的就是符合條件的。
    SELECT
    	* 
    FROM
    	student 
    WHERE
    	student.sid NOT IN (
    	SELECT
    		sc.sid 
    	FROM
    		sc 
    	WHERE
    	sc.cid IN ( SELECT course.cid FROM course WHERE course.tid IN ( SELECT teacher.tid FROM teacher WHERE tname = "張三" ) ) 
    	);
    
    
    
    
    SELECT
    	* 
    FROM
    	student 
    WHERE
    	student.sid NOT IN (
    	SELECT
    		sc.sid 
    	FROM
    		sc,
    		course,
    		teacher 
    	WHERE
    		sc.cid = course.cid 
    		AND course.tid = teacher.tid 
    	AND teacher.tname = "張三" 
    	);
  15. 查詢兩門及其以上不及格課程的同窗的學號,姓名及其平均成績
    SELECT
    	a.sid,
    	a.ag,
    	s.sname 
    FROM
    	( SELECT *, avg( score ) ag FROM sc WHERE score < 60 GROUP BY sid HAVING count( * ) > 1 ) a
    	LEFT JOIN student s ON a.sid = s.sid
  16. 檢索" 01 "課程分數小於 60,按分數降序排列的學生信息
    SELECT
    	* 
    FROM
    	( SELECT * FROM sc WHERE score < 60 AND cid = 01 ) a
    	LEFT JOIN student s ON a.sid = s.sid 
    ORDER BY
    	a.score
  17. 按平均成績從高到低顯示全部學生的全部課程的成績以及平均成績
    SELECT
    	a.sid,
    	a.ag,
    	sc.cid,
    	sc.score 
    FROM
    	( SELECT sid, avg( score ) ag FROM sc GROUP BY sid ) a
    	RIGHT JOIN sc ON a.sid = sc.sid order by -a.ag
  18. 查詢各科成績最高分、最低分和平均分:
    以以下形式顯示:課程 ID,課程 name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率及格爲>=60,中等爲:70-80,優良爲:80-90,優秀爲:>=90要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
    知識點

    SELECT
    	c.cname '課程名稱',a.*
    FROM
    	( SELECT cid,
    	max( score ) '最高分數',
    	min( score ) '最低分數',
    	avg( score ) '平均分',
    	(((sum(case when score < 60 then 1 else 0 end)/count(*))*100)) '不及格率(%)',
    (((sum(case when score >= 60 and score < 80 then 1 else 0 end)/count(*))*100))	'中等率(%)',
    (((sum(case when score >= 80 and score < 90 then 1 else 0 end)/count(*))*100))	'良好率(%)',
    (((sum(case when score > 90 then 1 else 0 end)/count(*))*100))	'優秀率(%)'
    FROM sc GROUP BY cid )a
    	LEFT JOIN course c ON a.cid = c.cid
  19. 按各科成績進行排序,並顯示排名, Score 重複時保留名次空缺
    暫時沒懂。網上的答案。疑惑1: on 的限制爲何要a.score < b.score 疑惑2:爲何count(a.score)  count(b.score)有這樣的差距。

    SELECT
    	a.cid,
    	a.sid,
    	a.score,
    	count( b.score ) + 1 AS r 
    FROM
    	sc AS a
    	LEFT JOIN sc AS b ON a.score < b.score 
    	AND a.cid = b.cid 
    GROUP BY
    	a.cid,
    	a.sid,
    	a.score 
    ORDER BY
    	a.cid,-a.score
  20. 按各科成績進行排序,並顯示排名, Score 重複時合併名次
    暫時沒懂。網上的答案。

    SET @crank = 0;
    SELECT
    	q.sid,
    	total,
    	@crank := @crank + 1 AS r 
    FROM
    	( SELECT sc.sid, sum( sc.score ) AS total FROM sc GROUP BY sc.sid ORDER BY total DESC ) q;
  21. 查詢學生的總成績,並進行排名,總分重複時保留名次空缺

    1
  22. 查詢學生的總成績,並進行排名,總分重複時不保留名次空缺

    1
  23. 統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[60-0] 及所佔百分比
    1
  24. 查詢各科成績前三名的記錄
    1
  25. 查詢每門課程被選修的學生數
    1
  26. 查詢出只選修兩門課程的學生學號和姓名
    1
  27. 查詢男生、女生人數
    1
  28. 查詢名字中含有「風」字的學生信息
    1
  29. 查詢同名同性學生名單,並統計同名人數
    1
  30. 查詢 1990 年出生的學生名單
    1
  31. 查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列
    1
  32. 查詢平均成績大於等於 85 的全部學生的學號、姓名和平均成績
    1
  33. 查詢課程名稱爲「數學」,且分數低於 60 的學生姓名和分數
    1
  34. 查詢全部學生的課程及分數狀況(存在學生沒成績,沒選課的狀況)
    1
  35. 查詢任何一門課程成績在 70 分以上的姓名、課程名稱和分數
    1
  36. 查詢不及格的課程
    1
  37. 查詢課程編號爲 01 且課程成績在 80 分以上的學生的學號和姓名
    1
  38. 求每門課程的學生人數
    1
  39. 成績不重複,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
    1
  40. 成績有重複的狀況下,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
    1
  41. 查詢不一樣課程成績相同的學生的學生編號、課程編號、學生成績
    1
  42. 查詢每門功成績最好的前兩名
    1
  43. 統計每門課程的學生選修人數(超過 5 人的課程才統計)。
    1
  44. 檢索至少選修兩門課程的學生學號
    1
  45. 查詢選修了所有課程的學生信息
    1
  46. 查詢各學生的年齡,只按年份來算
    1
  47. 按照出生日期來算,當前月日 < 出生年月的月日則,年齡減一
    1
  48. 查詢本週過生日的學生
    1
  49. 查詢下週過生日的學生
    1
  50. 查詢本月過生日的學生
    1
  51. 查詢下月過生日的學生
    1
相關文章
相關標籤/搜索