Mysql一套完整練習題


Mysql一套完整練習題

練完這一套題,你的Mysql就算入門了;

測試表格

--1.學生表
Student(S#,Sname,Sage,Ssex)
--S# 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別
--2.課程表 
Course(C#,Cname,T#)
--C# --課程編號,Cname 課程名稱,T# 教師編號
--3.教師表 
Teacher(T#,Tname)
--T# 教師編號,Tname 教師姓名
--4.成績表 
SC(S#,C#,score)
--S# 學生編號,C# 課程編號,score 分數

創建測試數據

學生表 Student

create table Student(S# varchar(10),Sname nvarchar(10),Sage datetime,Ssex nvarchar(10))
insert into Student values('01' , N'趙雷' , '1990-01-01' , N'')
insert into Student values('02' , N'錢電' , '1990-12-21' , N'')
insert into Student values('03' , N'孫風' , '1990-05-20' , N'')
insert into Student values('04' , N'李雲' , '1990-08-06' , N'')
insert into Student values('05' , N'周梅' , '1991-12-01' , N'')
insert into Student values('06' , N'吳蘭' , '1992-03-01' , N'')
insert into Student values('07' , N'鄭竹' , '1989-07-01' , N'')
insert into Student values('08' , N'王菊' , '1990-01-20' , N'')

科目表 Course

create table Course(C# varchar(10),Cname nvarchar(10),T# varchar(10))
insert into Course values('01' , N'語文' , '02')
insert into Course values('02' , N'數學' , '01')
insert into Course values('03' , N'英語' , '03')

教師表 Teacher

create table Teacher(T# varchar(10),Tname nvarchar(10))
insert into Teacher values('01' , N'張三')
insert into Teacher values('02' , N'李四')
insert into Teacher values('03' , N'王五')

成績表 SC

create table SC(S# varchar(10),C# 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 "課程成績高的學生的信息及課程分數
1.1 查詢同時存在" 01 "課程和" 02 "課程的情況
1.2 查詢存在" 01 "課程但可能不存在" 02 "課程的情況(不存在時顯示為 null )
1.3 查詢不存在" 01 "課程但存在" 02 "課程的情況
2. 查詢平均成績大於等於 60 分的同學的學生編號和學生姓名和平均成績
3. 查詢在 SC 表存在成績的學生信息
4. 查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績(沒成績的顯示為 null )
4.1 查有成績的學生信息
5. 查詢「李」姓老師的數量
6. 查詢學過「張三」老師授課的同學的信息
7. 查詢沒有學全所有課程的同學的信息
8. 查詢至少有一門課與學號為" 01 "的同學所學相同的同學的信息
9. 查詢和" 01 "號的同學學習的課程完全相同的其他同學的信息
10. 查詢沒學過"張三"老師講授的任一門課程的學生姓名
11. 查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績
12. 檢索" 01 "課程分數小於 60,按分數降序排列的學生信息
13. 按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
14. 查詢各科成績最高分、最低分和平均分:
以如下形式顯示:課程 ID,課程 name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90
要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
15. 按各科成績進行排序,並顯示排名, Score 重復時保留名次空缺
15.1 按各科成績進行排序,並顯示排名, Score 重復時合並名次
16. 查詢學生的總成績,並進行排名,總分重復時保留名次空缺
16.1 查詢學生的總成績,並進行排名,總分重復時不保留名次空缺
17. 統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[60-0] 及所占百分比
18. 查詢各科成績前三名的記錄
19. 查詢每門課程被選修的學生數
20. 查詢出只選修兩門課程的學生學號和姓名
21. 查詢男生、女生人數
22. 查詢名字中含有「風」字的學生信息
23. 查詢同名同性學生名單,並統計同名人數
24. 查詢 1990 年出生的學生名單
25. 查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列
26. 查詢平均成績大於等於 85 的所有學生的學號、姓名和平均成績
27. 查詢課程名稱為「數學」,且分數低於 60 的學生姓名和分數
28. 查詢所有學生的課程及分數情況(存在學生沒成績,沒選課的情況)
29. 查詢任何一門課程成績在 70 分以上的姓名、課程名稱和分數
30. 查詢不及格的課程
31. 查詢課程編號為 01 且課程成績在 80 分以上的學生的學號和姓名
32. 求每門課程的學生人數
33. 成績不重復,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
34. 成績有重復的情況下,查詢選修「張三」老師所授課程的學生中,成績最高的學生信息及其成績
35. 查詢不同課程成績相同的學生的學生編號、課程編號、學生成績
36. 查詢每門功成績最好的前兩名
37. 統計每門課程的學生選修人數(超過 5 人的課程才統計)。
38. 檢索至少選修兩門課程的學生學號
39. 查詢選修了全部課程的學生信息
40. 查詢各學生的年齡,只按年份來算
41. 按照出生日期來算,當前月日 < 出生年月的月日則,年齡減一
42. 查詢本周過生日的學生信息
43. 查詢下周過生日的學生信息
44. 查詢本月過生日的學生信息
45. 查詢下月過生日的學生信息

答案參考

創建表

mysql -u root -p 密碼;進入mysql

show databases;查看數據庫
create database test;創建數據庫
use
test; --表在 test 中創建

-- 學生表 Student create table Student ( S char(10), Sname char(10), Sage datetime, Ssex char(10) ); insert into Student values('01' , N'趙雷' , '1990-01-01' , N''); insert into Student values('02' , N'錢電' , '1990-12-21' , N''); insert into Student values('03' , N'孫風' , '1990-05-20' , N''); insert into Student values('04' , N'李雲' , '1990-08-06' , N''); insert into Student values('05' , N'周梅' , '1991-12-01' , N''); insert into Student values('06' , N'吳蘭' , '1992-03-01' , N''); insert into Student values('07' , N'鄭竹' , '1989-07-01' , N''); insert into Student values('08' , N'王菊' , '1990-01-20' , N''); -- 科目表 Course create table Course ( C char(10), Cname char(10), T char(10) ); insert into Course values('01' , N'語文' , '02'); insert into Course values('02' , N'數學' , '01'); insert into Course values('03' , N'英語' , '03'); -- 教師表 Teacher create table Teacher ( T char(10), Tname char(10) ); insert into Teacher values('01' , N'張三'); insert into Teacher values('02' , N'李四'); insert into Teacher values('03' , N'王五'); -- 成績表 SC create table SC ( S char(10), C char(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"課程成績高的學生的信息及課程分數
SELECT
    a.*, b.s_score AS score1,
    c.s_score AS score2
FROM
    student a
LEFT JOIN score b ON a.s_id = b.s_id
AND b.c_id = '01'
LEFT JOIN score c ON a.s_id = c.s_id
AND (c.c_id = '02' OR c.c_id =NULL)
WHERE
    b.s_score > c.s_score ;
 
-- 2、查詢"01"課程比"02"課程成績低的學生的信息及課程分數
SELECT
    a.*, b.s_score AS score1,
    c.s_score AS score2
FROM
    student a
LEFT JOIN score b ON a.s_id = b.s_id
AND (b.c_id = '01' OR b.c_id =NULL)
LEFT JOIN score c ON a.s_id = c.s_id
AND c.c_id = '02' 
WHERE
    b.s_score < c.s_score ;
 
-- 3、查詢平均成績大於等於60分的同學的學生編號和學生姓名和平均成績
SELECT
    a.s_id,
    a.s_name,
    ROUND(AVG(b.s_score), 1) AS 平均成績
FROM
    student a
LEFT JOIN score b ON a.s_id = b.s_id
GROUP BY
    a.s_id
HAVING
    AVG(b.s_score) >= 60;
 
-- 4、查詢平均成績小於60分的同學的學生編號和學生姓名和平均成績
-- (包括有成績的和無成績的)
-- 方法一:
SELECT
    a.s_id,
    a.s_name,
    ROUND(AVG(b.s_score), 1) AS 平均成績
FROM
    student a
LEFT JOIN score b ON a.s_id = b.s_id
GROUP BY
    a.s_id
HAVING
    AVG(b.s_score) < 60
OR
a.s_id NOT IN(SELECT DISTINCT a.s_id FROM student a JOIN score b WHERE a.s_id=b.s_id);
 
-- 方法二:
SELECT
    a.s_id,a.s_name,
    ROUND(AVG(b.s_score),2) AS avg_score
FROM
    student a
JOIN score b ON a.s_id = b.s_id
GROUP BY
    a.s_id
HAVING AVG(b.s_score) < 60
UNION
SELECT a.s_id,a.s_name,0 AS avg_score FROM 
student a
WHERE a.s_id NOT IN (SELECT DISTINCT s_id FROM score);
 
-- 5、查詢所有同學的學生編號、學生姓名、選課總數、所有課程的總成績,並從高到低排序
SELECT
    a.s_id,
    a.s_name,
    COUNT(b.c_id) AS 選課總數 ,
    SUM(b.s_score) AS 總成績
FROM
    student a
LEFT JOIN score b
ON
    a.s_id = b.s_id
GROUP BY a.s_id
ORDER BY SUM(b.s_score) DESC;
 
-- 6、查詢"李"姓老師的數量 
SELECT COUNT(t_id) FROM teacher WHERE t_name LIKE '李%';
 
-- 7、查詢學過"張三"老師授課的同學的信息 
#張三編號
SELECT t_id FROM teacher WHERE t_name = '張三'
#張三代課的課程編號
SELECT c_id FROM course WHERE t_id = (SELECT t_id FROM teacher WHERE t_name = '張三')
#學張三課程的學生編號
SELECT s_id FROM score WHERE c_id = (SELECT c_id FROM course WHERE t_id = (SELECT t_id FROM teacher WHERE t_name = '張三'))
-- 方法一:
SELECT *FROM student WHERE 
s_id IN (SELECT s_id FROM score WHERE 
c_id = (SELECT c_id FROM course WHERE
t_id = (SELECT t_id FROM teacher WHERE t_name = '張三'))
);
 
-- 方法二:
SELECT a.* FROM student a
JOIN score b ON a.s_id = b.s_id
WHERE 
b.c_id IN (SELECT c_id FROM course WHERE t_id = (SELECT t_id FROM teacher WHERE t_name = '張三'));
 
-- 8、查詢沒學過"張三"老師授課的同學的信息 
-- 方法一:
SELECT *FROM student WHERE 
s_id NOT IN (SELECT s_id FROM score WHERE 
c_id = (SELECT c_id FROM course WHERE
t_id = (SELECT t_id FROM teacher WHERE t_name = '張三'))
);
 
-- 9、查詢學過編號為"01"並且也學過編號為"02"的課程的同學的信息,及兩門課程成績
-- 方法一
SELECT
    a.*, b.s_score,
    c.s_score 
FROM
    student a
JOIN score b ON a.s_id = b.s_id
AND b.c_id = '01'
JOIN score c ON a.s_id = c.s_id
AND c.c_id = '02';
 
-- 方法二:
SELECT
    a.*, b.s_score,
    c.s_score
FROM
    student a,
    score b,
    score c
WHERE
    a.s_id = b.s_id
AND a.s_id = c.s_id
AND b.c_id = '01'
AND c.c_id = '02';
 
-- 10、查詢學過編號為"01"但是沒有學過編號為"02"的課程的同學的信息
SELECT s_id FROM score  WHERE c_id = '01'
SELECT s_id FROM score  WHERE c_id = '02'
 
SELECT *FROM student a
WHERE
a.s_id IN (SELECT s_id FROM score  WHERE c_id = '01')
AND a.s_id NOT IN (SELECT s_id FROM score  WHERE c_id = '02');
 
 
-- 11、查詢沒有學全所有課程的同學的信息 
 
SELECT s_id FROM score
GROUP BY s_id
HAVING COUNT(s_id) != 3
 
#方法一:
SELECT *FROM student WHERE s_id IN(
    SELECT s_id FROM score
    GROUP BY s_id
    HAVING COUNT(s_id) != 3
);
 
#方法二:
SELECT a.s_id FROM score a 
    JOIN score b ON a.s_id=b.s_id AND b.c_id='02'
    JOIN score c ON a.s_id=c.s_id AND c.c_id='03'
    WHERE a.c_id='01'
 
SELECT *FROM student d WHERE d.s_id IN(
    SELECT e.s_id FROM score e WHERE e.s_id NOT IN(
        SELECT a.s_id FROM score a 
            JOIN score b ON a.s_id=b.s_id AND b.c_id='02'
            JOIN score c ON a.s_id=c.s_id AND c.c_id='03'
            WHERE a.c_id='01')
);
 
#--------------
 
# 上述兩種方法結果都少了沒有選課的8號學生,但看具體條件是否需要查出
 
# 學全選取所有課程的同學的id 
SELECT s_id FROM score
    GROUP BY s_id
    HAVING COUNT(s_id) = 3
 
#方法一:
SELECT *FROM student WHERE s_id NOT IN(
    SELECT s_id FROM score
    GROUP BY s_id
    HAVING COUNT(s_id) = 3
);
 
-- 12、查詢至少有一門課與學號為"01"的同學所學相同的同學的信息 
 
SELECT c_id FROM score WHERE s_id ='01'
 
SELECT DISTINCT s_id FROM score WHERE c_id IN (SELECT c_id FROM score WHERE s_id ='01')
 
SELECT * FROM student a
WHERE
a.s_id IN (SELECT DISTINCT b.s_id FROM score b WHERE 
b.c_id IN (SELECT c.c_id FROM score c WHERE c.s_id ='01')
);
 
-- 13、查詢和"01"號的同學學習的課程完全相同的其他同學的信息 
 
SELECT * FROM student WHERE s_id IN(
    SELECT DISTINCT s_id FROM score WHERE s_id!='01' AND c_id IN (SELECT c_id FROM score WHERE s_id ='01') 
    GROUP BY s_id
    HAVING COUNT(1)=(SELECT COUNT(1) FROM score WHERE s_id='01')
)
 
-- 15、查詢兩門及其以上不及格課程的同學的學號,姓名及其平均成績 
SELECT s_id FROM score WHERE s_score<60 GROUP BY s_id HAVING COUNT(1) >= 2
 
SELECT
    a.s_id,
    a.s_name,
    ROUND(AVG(b.s_score), 1) AS 平均成績 
FROM
    student a
LEFT JOIN score b ON a.s_id = b.s_id
GROUP BY a.s_id
HAVING
a.s_id IN(SELECT s_id FROM score WHERE s_score<60 GROUP BY s_id HAVING COUNT(1) >= 2)
 
 
-- 16、檢索"01"課程分數小於60,按分數降序排列的學生信息及01分數
-- 方法一:
SELECT
    a.*, b.s_score
FROM
    student a
LEFT JOIN score b ON a.s_id = b.s_id
WHERE
    b.c_id = '01'
AND b.s_score < 60
ORDER BY
    b.s_score DESC;
 
-- 方法二:
SELECT
    a.*, b.s_score
FROM
    student a,score b
WHERE
a.s_id = b.s_id AND b.c_id='01' AND b.s_score < 60
ORDER BY
    b.s_score DESC;
 
-- 方法三(有點瑕疵):
SELECT
    a.*, b.s_score
FROM
    student a
LEFT JOIN score b ON a.s_id = b.s_id
AND    b.c_id = '01'
AND b.s_score < 60
ORDER BY
    b.s_score DESC;
 
-- 17、按平均成績從高到低顯示所有學生的所有課程的成績以及平均成績
 
-- 方法一(自連接):
SELECT
 a.s_id,
(SELECT s_score FROM score WHERE s_id=a.s_id AND c_id='01') AS score1,
(SELECT s_score FROM score WHERE s_id=a.s_id AND c_id='02') AS score2,
(SELECT s_score FROM score WHERE s_id=a.s_id AND c_id='03') AS score3,
ROUND(avg(a.s_score), 2) AS 平均分
FROM score a
GROUP BY a.s_id
ORDER BY 平均分 DESC;
 
-- 方法二(自連接):
SELECT 
 a.s_id,
 b.s_score,
 c.s_score,
 d.s_score,
 ROUND(avg(a.s_score), 2) AS 平均分
FROM
    score a
LEFT JOIN score b ON a.s_id = b.s_id AND b.c_id='01'
LEFT JOIN score c ON a.s_id = c.s_id AND c.c_id='02'
LEFT JOIN score d ON a.s_id = d.s_id AND d.c_id='03'
GROUP BY a.s_id
ORDER BY 平均分 DESC;
 
-- 18.查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
-- 及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90
 
SELECT 
a.c_id,
MAX(a.s_score),
 MIN(a.s_score),
 AVG(a.s_score)
FROM
    score a
GROUP BY a.c_id;
 
-- 方法一:
SELECT
    a.c_id AS 課程ID,
    b.c_name AS 課程name,
    MAX(a.s_score) AS 最高分,
    MIN(a.s_score) AS 最低分,
    ROUND(AVG(a.s_score),2) AS 平均分,
  ROUND(100*(SUM(CASE WHEN a.s_score >= 60 THEN 1 ELSE 0 END) / COUNT(1)) , 2)  AS '及格率',
    ROUND(100*(SUM(CASE WHEN a.s_score >= 70 AND  a.s_score <80 THEN 1 ELSE 0 END) / COUNT(1)) , 2)  AS '中等率',
  ROUND(100*(SUM(CASE WHEN a.s_score >= 80 AND  a.s_score <90 THEN 1 ELSE 0 END) / COUNT(1)) , 2)  AS '優良率',
  ROUND(100*(SUM(CASE WHEN a.s_score >= 90 THEN 1 ELSE 0 END) / COUNT(1)) , 2)  AS '優秀率'
FROM
    score a
LEFT JOIN course b ON a.c_id = b.c_id
GROUP BY
    b.c_id;
 
-- 19、按各科成績進行排序,並顯示排名
-- mysql沒有rank順序函數
 select a.s_id,a.c_id,
        @i:=@i +1 as i保留排名,
        @k:=(case when @score=a.s_score then @k else @i end) as rank不保留排名,
        @score:=a.s_score as score
    from (
        select s_id,c_id,s_score from score WHERE c_id='01' GROUP BY s_id,c_id,s_score ORDER BY s_score DESC
)a,(select @k:=0,@i:=0,@score:=0)s
    union
    select a.s_id,a.c_id,
        @i:=@i +1 as i,
        @k:=(case when @score=a.s_score then @k else @i end) as rank,
        @score:=a.s_score as score
    from (
        select s_id,c_id,s_score from score WHERE c_id='02' GROUP BY s_id,c_id,s_score ORDER BY s_score DESC
)a,(select @k:=0,@i:=0,@score:=0)s
    union
    select a.s_id,a.c_id,
        @i:=@i +1 as i,
        @k:=(case when @score=a.s_score then @k else @i end) as rank,
        @score:=a.s_score as score
    from (
        select s_id,c_id,s_score from score WHERE c_id='03' GROUP BY s_id,c_id,s_score ORDER BY s_score DESC
)a,(select @k:=0,@i:=0,@score:=0)s
 
-- 20、查詢學生的總成績並進行排名
SELECT a.s_id,
    @i:=@i+1 AS i,
    @k:=(CASE WHEN @score=a.sum_score THEN @k ELSE @i END) AS rank,
    @score:=a.sum_score AS score
FROM (SELECT s_id,SUM(s_score) AS sum_score FROM score GROUP BY s_id ORDER BY sum_score DESC) AS a,
(SELECT @i:=0,@score:=0) AS b
 
-- 21、查詢不同老師所教不同課程平均分從高到低顯示 
SELECT
    a.t_name,
    b.c_id,
    b.c_name,
    ROUND(AVG(c.s_score) ,2) AS 平均分
FROM
    teacher a
LEFT JOIN course b ON a.t_id = b.t_id
LEFT JOIN score c ON b.c_id=c.c_id
GROUP BY c.c_id
ORDER BY AVG(c.s_score) DESC;
 
-- 22、查詢所有課程的成績第2名到第3名的學生信息及該課程成績
SELECT c.*,d.s_name,d.s_birth,d.s_sex FROM 
(SELECT a.s_id,a.s_score,a.c_id,@i:=@i+1 AS 排名 FROM score a,(SELECT @i:=0)b WHERE a.c_id='01') c 
LEFT JOIN student d ON c.s_id=d.s_id
WHERE 排名 BETWEEN 2 AND 3
UNION
SELECT c.*,d.s_name,d.s_birth,d.s_sex FROM 
(SELECT a.s_id,a.s_score,a.c_id,@j:=@j+1 AS 排名 FROM score a,(SELECT @j:=0)b WHERE a.c_id='02') c 
LEFT JOIN student d ON c.s_id=d.s_id
WHERE 排名 BETWEEN 2 AND 3
UNION
SELECT c.*,d.s_name,d.s_birth,d.s_sex FROM 
(SELECT a.s_id,a.s_score,a.c_id,@k:=@k+1 AS 排名 FROM score a,(SELECT @k:=0)b WHERE a.c_id='03') c 
LEFT JOIN student d ON c.s_id=d.s_id
WHERE 排名 BETWEEN 2 AND 3;
 
-- 23、統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[0-60]及所占百分比
  
SELECT
    a.c_id AS 課程編號, a.c_name AS 課程名稱,
  c.`[100-85]的人數`, c.`[100-85]所占百分比`,
    d.`[85-70]的人數`, d.`[85-70]所占百分比`,
    e.`[70-60]的人數`, e.`[70-60]所占百分比`,
    f.`[0-60]的人數`, f.`[0-60]所占百分比`
FROM
    course a
LEFT JOIN score b ON a.c_id = b.c_id
LEFT JOIN
    (SELECT *,SUM(CASE WHEN s_score >85 AND s_score <=100 THEN 1 ELSE 0 END) AS '[100-85]的人數' ,
    ROUND(SUM(CASE WHEN s_score >85 AND s_score <=100 THEN 1 ELSE 0 END)/COUNT(1)*100,2) AS '[100-85]所占百分比'
    FROM score GROUP BY c_id) c ON a.c_id=c.c_id
LEFT JOIN
    (SELECT*,SUM(CASE WHEN s_score >70 AND s_score <=85 THEN 1 ELSE 0 END) AS '[85-70]的人數' ,
    ROUND(SUM(CASE WHEN s_score >70 AND s_score <=85 THEN 1 ELSE 0 END)/COUNT(1)*100,2) AS '[85-70]所占百分比'
    FROM score GROUP BY c_id) d ON a.c_id=d.c_id
LEFT JOIN
    (SELECT*,SUM(CASE WHEN s_score >60 AND s_score <=70 THEN 1 ELSE 0 END) AS '[70-60]的人數' ,
    ROUND(SUM(CASE WHEN s_score >60 AND s_score <=70 THEN 1 ELSE 0 END)/COUNT(1)*100,2) AS '[70-60]所占百分比'
    FROM score GROUP BY c_id) e ON a.c_id=e.c_id
LEFT JOIN
    (SELECT *,SUM(CASE WHEN s_score >0 AND s_score <=60 THEN 1 ELSE 0 END) AS '[0-60]的人數' ,
    ROUND(SUM(CASE WHEN s_score >0 AND s_score <=60 THEN 1 ELSE 0 END)/COUNT(1)*100,2) AS '[0-60]所占百分比'
    FROM score GROUP BY c_id) f ON a.c_id=f.c_id
GROUP BY a.c_id
 
-- 24、查詢學生平均成績及其名次 
SELECT
    b.s_id,
    @i:=@i+1 AS 相同分數的不同名次,
    @k:=(CASE WHEN @avg_s=b.avg_score THEN @k ELSE @i END) AS 相同分數的相同名次,
    @avg_s:=b.avg_score AS 平均成績
FROM
(SELECT
    a.s_id,
    ROUND(AVG(a.s_score), 2) AS avg_score
FROM
    score a
GROUP BY
    a.s_id
ORDER BY AVG(a.s_score) DESC) b,(SELECT @i:=0,@avg_s:=0,@k:=0) c
 
 
-- 24.1添加名次rank,(相同分數的相同名次,並列排名)
-- 上面24難以看出並列排名
SELECT
    b.s_id,    b.c_id,
    -- 順序一直在變大
    @i:=@i+1 AS 相同分數的不同名次,
  -- 只有在前后二次分數不同時才會使用順序號
    @k:=(CASE WHEN @s=b.s_score THEN @k ELSE @i END) AS 相同分數的相同名次,
    @s:=b.s_score AS 成績
FROM
(SELECT *FROM score  WHERE s_id='03' ORDER BY s_score DESC)b,
(SELECT @i:=0,@k:=0,@s:=0);
 
-- 25、查詢各科成績前三名的記錄
-- 1.選出b表比a表成績大的所有組
-- 2.選出比當前id成績大的 小於三個的
-- SELECT  a.s_id,a.c_id,a.s_score FROM score a 
-- LEFT JOIN score b ON a.c_id=b.c_id AND a.s_score<b.s_score 
-- GROUP BY a.s_id,a.c_id,a.s_score 
-- HAVING COUNT(b.s_id)<3
-- ORDER BY a.c_id,a.s_score DESC
 
-- 26、查詢每門課程被選修的學生數 
SELECT c_id,COUNT(1) FROM  score GROUP BY c_id
 
-- 27、查詢出只有兩門課程的全部學生的學號和姓名 
-- 方法一:
SELECT a.s_id,a.s_name FROM student a 
LEFT JOIN score b ON a.s_id=b.s_id
GROUP BY a.s_id
HAVING COUNT(1)=2
 
-- 方法二:
SELECT a.s_id,a.s_name FROM student a WHERE a.s_id IN 
(SELECT s_id FROM score GROUP BY s_id HAVING COUNT(1)=2)
 
-- 28、查詢男生、女生人數 
SELECT s_sex,COUNT(1) FROM student GROUP BY s_sex
 
-- 29、查詢名字中含有"風"字的學生信息
SELECT *FROM student WHERE s_name LIKE '%風%' 
 
-- 30、查詢同名同性學生名單,並統計同名人數 
SELECT a.s_name,a.s_sex,COUNT(1) AS 人數 FROM student a 
JOIN student b ON a.s_name=b.s_name AND a.s_sex=b.s_sex AND a.s_id!=b.s_id
GROUP BY a.s_name,a.s_sex
 
-- 31、查詢1990年出生的學生名單
-- 方法一
SELECT s_name FROM student WHERE YEAR(s_birth)='1990'
-- 方法二
SELECT s_name FROM student WHERE s_birth LIKE '1990%'
 
-- 32、查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號升序排列
SELECT c_id,ROUND(avg(s_score),2)FROM score 
GROUP BY c_id
ORDER BY avg(s_score) DESC,c_id ASC 
 
-- 33、查詢平均成績大於等於85的所有學生的學號、姓名和平均成績 
SELECT a.s_id,a.s_name,ROUND(avg(b.s_score),2) AS 平均成績 FROM student a 
LEFT JOIN score b ON a.s_id=b.s_id
GROUP BY a.s_id
HAVING avg(b.s_score) >= 85
 
-- 34、查詢課程名稱為"數學",且分數低於60的學生姓名和分數 
SELECT a.s_name,b.s_score FROM student a 
LEFT JOIN score b ON a.s_id=b.s_id
WHERE c_id=(
SELECT c_id FROM course WHERE c_name='數學'
) AND b.s_score < 60
 
-- 35、查詢所有學生的課程及分數情況; 
-- 方法一:
SELECT a.s_id,a.s_name,b.s_score,c.s_score,d.s_score FROM student a 
LEFT JOIN score b ON a.s_id=b.s_id AND b.c_id='01'
LEFT JOIN score c ON a.s_id=c.s_id AND c.c_id='02'
LEFT JOIN score d ON a.s_id=d.s_id AND d.c_id='03'
GROUP BY a.s_id
 
-- 方法二:
 SELECT a.s_id,a.s_name,
SUM(CASE c.c_name WHEN '語文' THEN b.s_score ELSE 0 END) AS '語文',
SUM(CASE c.c_name WHEN '數學' THEN b.s_score ELSE 0 END) AS '數學',
SUM(CASE c.c_name WHEN '英語' THEN b.s_score ELSE 0 END) AS '英語',
SUM(b.s_score) as  '總分'
FROM student a 
LEFT JOIN score b ON a.s_id = b.s_id 
LEFT JOIN course c ON b.c_id = c.c_id 
GROUP BY a.s_id,a.s_name
 
 -- 36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數; 
 
SELECT a.s_name,c.c_name,b.s_score FROM student a
LEFT JOIN score b ON a.s_id=b.s_id
LEFT JOIN course c ON b.c_id=c.c_id
HAVING b.s_score > 70
 
-- 37、查詢不及格的學生id,姓名,及其課程名稱,分數
SELECT a.s_id,a.s_name,c.c_name,b.s_score FROM student a 
LEFT JOIN score b ON a.s_id=b.s_id
LEFT JOIN course c ON b.c_id=c.c_id
WHERE b.s_score < 60
 
 
-- 38、查詢課程編號為01且課程成績在80分以上的學生的學號和姓名; 
SELECT b.s_id,b.s_name FROM score a
LEFT JOIN student b ON a.s_id=b.s_id
WHERE a.c_id='01' AND a.s_score>80
 
-- 39、求每門課程的學生人數 
SELECT c_id,COUNT(1) FROM score GROUP BY c_id
 
 
-- 40、查詢選修"張三"老師所授課程的學生中,成績最高的學生信息及其成績
 
SELECT t_id FROM teacher a WHERE a.t_name='張三'
 
SELECT c_id FROM course b WHERE t_id=(SELECT t_id FROM teacher a WHERE a.t_name='張三')
 
SELECT c.*,d.s_score FROM student c
LEFT JOIN score d ON c.s_id=d.s_id AND d.c_id=
(SELECT c_id FROM course b WHERE t_id=(SELECT t_id FROM teacher a WHERE a.t_name='張三'))
HAVING  MAX(d.s_score)
 
 
-- 41、查詢不同課程成績相同的學生的學生編號、課程編號、學生成績 
SELECT DISTINCT a.s_id,a.c_id,a.s_score 
FROM score a,score b WHERE a.s_score=b.s_score AND a.c_id!=b.c_id
 
-- 42、查詢每門功課成績最好的前兩名 
-- 方法一
SELECT *FROM
(SELECT a.s_id,a.c_id,a.s_score, @i:=@i+1 as 排名 FROM score a,(SELECT @i:=0)b WHERE a.c_id='01' ORDER BY a.s_score DESC
) c
WHERE 排名 BETWEEN 1 AND 2
UNION
SELECT *FROM
(SELECT a.s_id,a.c_id,a.s_score, @j:=@j+1 as 排名 FROM score a,(SELECT @j:=0)b WHERE a.c_id='02' ORDER BY a.s_score DESC
) c
WHERE 排名 BETWEEN 1 AND 2
UNION
SELECT *FROM
(SELECT a.s_id,a.c_id,a.s_score, @k:=@k+1 as 排名 FROM score a,(SELECT @k:=0)b WHERE a.c_id='03' ORDER BY a.s_score DESC
) c
WHERE 排名 BETWEEN 1 AND 2
 
-- 方法二
-- SELECT a.s_id,a.c_id,a.s_score FROM score a
-- WHERE (SELECT COUNT(1) FROM score b WHERE b.c_id=a.c_id AND b.s_score>=a.s_score)<=2 ORDER BY a.c_id
 
-- 43、統計每門課程的學生選修人數(超過5人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列  
SELECT c_id AS 課程號,COUNT(1) AS 選修人數 FROM score 
GROUP BY c_id 
HAVING COUNT(1)>5 
ORDER BY COUNT(1) DESC,c_id
 
-- 44、檢索至少選修兩門課程的學生學號 
SELECT s_id,COUNT(1) FROM score GROUP BY s_id HAVING COUNT(1)>=2
 
 
-- 45、查詢選修了全部課程的學生信息 
SELECT COUNT(1) FROM course
 
SELECT b.* FROM score a
LEFT JOIN student b ON a.s_id=b.s_id
GROUP BY a.s_id 
HAVING COUNT(1)=(SELECT COUNT(1) FROM course)
 
-- 46、查詢各學生的年齡
 -- 按照出生日期來算,當前月日<出生年月的月日則,年齡減一
-- 方法一
SELECT s_id,s_birth,(DATE_FORMAT(NOW(),'%Y')-DATE_FORMAT(s_birth,'%Y'))-
(CASE WHEN DATE_FORMAT(NOW(),'%m%d')< DATE_FORMAT(s_birth,'%m%d') THEN 1 ELSE 0 END) AS age
FROM student
 
-- 47、查詢本周過生日的學生
-- 方法一
SELECT * FROM student WHERE WEEK(CURRENT_DATE)=WEEK(s_birth)
-- 方法二
SELECT * FROM student WHERE WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))=WEEK(s_birth)
 
-- 48、查詢下周過生日的學生
SELECT * FROM student WHERE WEEK(DATE_FORMAT(NOW(),'%Y%m%d'))+1=WEEK(s_birth)
 
-- 49、查詢本月過生日的學生
SELECT * FROM student WHERE MONTH(NOW())=MONTH(s_birth)
 
-- 50、查詢下月過生日的學生
SELECT * FROM student WHERE MONTH(NOW())+1=MONTH(s_birth)
 
SELECT DATE_FORMAT(NOW(),'%Y')
SELECT DATE_FORMAT(NOW(),'%Y%m%d')

 結束


免責聲明!

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



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