MySQL_45練習(xí)題

數(shù)據(jù)表

  • 1.學(xué)生表 Student(SId,Sname,Sage,Ssex)
    SId 學(xué)生編號(hào),Sname 學(xué)生姓名,Sage 出生年月,Ssex 學(xué)生性別
  • 2.課程表 Course(CId,Cname,TId)
    CId 課程編號(hào),Cname 課程名稱,TId 教師編號(hào)
  • 3.教師表 Teacher(TId,Tname)
    TId 教師編號(hào),Tname 教師姓名
  • 4.成績(jī)表 SC(SId,CId,score)
    SId 學(xué)生編號(hào),CId 課程編號(hào),score 分?jǐn)?shù)

創(chuàng)建測(cè)試數(shù)據(jù)

學(xué)生表 Student:

導(dǎo)入數(shù)據(jù)方法:將以下 mysql 語(yǔ)句,完整復(fù)制到 workbench 語(yǔ)句窗口(或者是 mysql 的黑窗口),然后運(yùn)行即可導(dǎo)入,不需要另外創(chuàng)建表,下面表的操作一樣。這些語(yǔ)句第一條是創(chuàng)建表(create table),后面都是插入數(shù)據(jù)到表中(insert into table )。

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' , '孫風(fēng)' , '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('09' , '張三' , '2017-12-20' , '女');

insert into Student values('10' , '李四' , '2017-12-25' , '女');

insert into Student values('11' , '李四' , '2017-12-30' , '女');

insert into Student values('12' , '趙六' , '2017-01-01' , '女');

insert into Student values('13' , '孫七' , '2018-01-01' , '女');

科目表 Course

create table Course(CId varchar(10),Cname nvarchar(10),TId varchar(10));

insert into Course values('01' , '語(yǔ)文' , '02');

insert into Course values('02' , '數(shù)學(xué)' , '01');

insert into Course values('03' , '英語(yǔ)' , '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' , '王五');

成績(jī)表 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);

練習(xí)題目

1.查詢" 01 "課程比" 02 "課程成績(jī)高的學(xué)生的信息及課程分?jǐn)?shù)

-1.1 查詢同時(shí)存在" 01 "課程和" 02 "課程的情況

-1.2 查詢存在" 01 "課程但可能不存在" 02 "課程的情況(不存在時(shí)顯示為 null )

-1.3 查詢不存在" 01 "課程但存在" 02 "課程的情況

2.查詢平均成績(jī)大于等于 60 分的同學(xué)的學(xué)生編號(hào)和學(xué)生姓名和平均成績(jī)

3.查詢?cè)?SC 表存在成績(jī)的學(xué)生信息

4.查詢所有同學(xué)的學(xué)生編號(hào)、學(xué)生姓名、選課總數(shù)、所有課程的總成績(jī)(沒(méi)成績(jī)的顯示為 null ) 4.1 查有成績(jī)的學(xué)生信息

5.查詢「李」姓老師的數(shù)量

6.查詢學(xué)過(guò)「張三」老師授課的同學(xué)的信息

7.查詢沒(méi)有學(xué)全所有課程的同學(xué)的信息

8.查詢至少有一門課與學(xué)號(hào)為" 01 "的同學(xué)所學(xué)相同的同學(xué)的信息

9.查詢和" 01 "號(hào)的同學(xué)學(xué)習(xí)的課程 完全相同的其他同學(xué)的信息

10.查詢沒(méi)學(xué)過(guò)"張三"老師講授的任一門課程的學(xué)生姓名

11.查詢兩門及其以上不及格課程的同學(xué)的學(xué)號(hào),姓名及其平均成績(jī)

12.檢索" 01 "課程分?jǐn)?shù)小于 60,按分?jǐn)?shù)降序排列的學(xué)生信息

13.按平均成績(jī)從高到低顯示所有學(xué)生的所有課程的成績(jī)以及平均成績(jī)

14.查詢各科成績(jī)最高分、最低分和平均分: 以如下形式顯示:課程 ID,課程 name,最高分,最低分,平均分,及格率,中等率,優(yōu)良率,優(yōu)秀率 及格為>=60,中等為:70-80,優(yōu)良為:80-90,優(yōu)秀為:>=90 要求輸出課程號(hào)和選修人數(shù),查詢結(jié)果按人數(shù)降序排列,若人數(shù)相同,按課程號(hào)升序排列

15.按各科成績(jī)進(jìn)行排序,并顯示排名, Score 重復(fù)時(shí)保留名次空缺 15.1 按各科成績(jī)進(jìn)行排序,并顯示排名, Score 重復(fù)時(shí)合并名次

16.查詢學(xué)生的總成績(jī),并進(jìn)行排名,總分重復(fù)時(shí)保留名次空缺 16.1 查詢學(xué)生的總成績(jī),并進(jìn)行排名,總分重復(fù)時(shí)不保留名次空缺

17.統(tǒng)計(jì)各科成績(jī)各分?jǐn)?shù)段人數(shù):課程編號(hào),課程名稱,[100-85],[85-70],[70-60],[60-0] 及所占百分比

18.查詢各科成績(jī)前三名的記錄

19.查詢每門課程被選修的學(xué)生數(shù)

20.查詢出只選修兩門課程的學(xué)生學(xué)號(hào)和姓名

21.查詢男生、女生人數(shù)

22.查詢名字中含有「風(fēng)」字的學(xué)生信息

23.查詢同名同性學(xué)生名單,并統(tǒng)計(jì)同名人數(shù)

24.查詢 1990 年出生的學(xué)生名單

25.查詢每門課程的平均成績(jī),結(jié)果按平均成績(jī)降序排列,平均成績(jī)相同時(shí),按課程編號(hào)升序排列

26.查詢平均成績(jī)大于等于 85 的所有學(xué)生的學(xué)號(hào)、姓名和平均成績(jī)

27.查詢課程名稱為「數(shù)學(xué)」,且分?jǐn)?shù)低于 60 的學(xué)生姓名和分?jǐn)?shù)

28.查詢所有學(xué)生的課程及分?jǐn)?shù)情況(存在學(xué)生沒(méi)成績(jī),沒(méi)選課的情況)

29.查詢?nèi)魏我婚T課程成績(jī)?cè)?70 分以上的姓名、課程名稱和分?jǐn)?shù)

30.查詢不及格的課程

31.查詢課程編號(hào)為 01 且課程成績(jī)?cè)?80 分以上的學(xué)生的學(xué)號(hào)和姓名

32.求每門課程的學(xué)生人數(shù)

33.假設(shè)成績(jī)不重復(fù),查詢選修「張三」老師所授課程的學(xué)生中,成績(jī)最高的學(xué)生信息及其成績(jī)

34.假設(shè)成績(jī)有重復(fù)的情況下,查詢選修「張三」老師所授課程的學(xué)生中,成績(jī)最高的學(xué)生信息及其成績(jī)

35.查詢不同課程成績(jī)相同的學(xué)生的學(xué)生編號(hào)、課程編號(hào)、學(xué)生成績(jī)

36.查詢每門功成績(jī)最好的前兩名

37.統(tǒng)計(jì)每門課程的學(xué)生選修人數(shù)(超過(guò) 5 人的課程才統(tǒng)計(jì))。

38.檢索至少選修兩門課程的學(xué)生學(xué)號(hào)

39.查詢選修了全部課程的學(xué)生信息

40.查詢各學(xué)生的年齡,只按年份來(lái)算

41.按照出生日期來(lái)算,當(dāng)前月日 < 出生年月的月日則,年齡減一

42.查詢本周過(guò)生日的學(xué)生

43.查詢下周過(guò)生日的學(xué)生

44.查詢本月過(guò)生日的學(xué)生

45.查詢下月過(guò)生日的學(xué)生

答案如下:

1.查詢" 01 "課程比" 02 "課程成績(jī)高的學(xué)生的信息及課程分?jǐn)?shù)

SELECT * FROM student a
INNER JOIN (
        SELECT s1.sid sid,s1.CId cld_1,s1.score sc_1,s2.CId cld_2,s2.score sc_2
        FROM sc s1
        INNER JOIN sc s2  ON s1.sid = s2.sid
        WHERE s1.cid = '01' AND s2.cid = '02'
        AND s1.`score`>s2.`score`  #s1展示'01'課程,s2展示'02'課程,s1的成績(jī) > s2的成績(jī),即'01'>'02'的成績(jī)
                        ) b 
ON a.SId = b.sid;

1.1 查詢同時(shí)存在" 01 "課程和" 02 "課程的情況

SELECT * 
FROM sc s1
INNER JOIN sc s2
ON s1.`SId` = s2.`SId` 
AND s1.`CId` = '01' AND s2.`CId`='02'  
#篩選條件后,表1和表2分別表示'01','02'課程
INNER JOIN student
ON s1.`SId` = student.`SId`;
#插入學(xué)生表查看學(xué)生信息

1.2查詢存在" 01 "課程但可能不存在" 02 "課程的情況(不存在時(shí)顯示為 null )

SELECT *
FROM sc s1
LEFT JOIN sc s2
ON s1.sid = s2.sid
AND s2.cid = '02'
#左連接且'AND'條件加在'ON'后面,表示會(huì)取主表的所有內(nèi)容,且僅滿足條件的才進(jìn)行關(guān)聯(lián),不滿足條件的顯示為NULL
#此題中:將所有s2.cid = '02'的拿去關(guān)聯(lián),若s1中的沒(méi)有內(nèi)容與s2關(guān)聯(lián),則顯示為null
WHERE s1.cid = '01';
#關(guān)聯(lián)后,篩選關(guān)聯(lián)后的表中s1.cid='01'的內(nèi)容

1.3 查詢不存在" 01 "課程但存在" 02 "課程的情況

SELECT * FROM sc 
WHERE sid NOT IN (SELECT sid FROM sc WHERE cid ='01')
#條件一:sid不在 "有cid='01'的sid" 中
AND sid IN (SELECT sid FROM sc WHERE cid = '02');
#條件二:sid在 "有cid='02'的sid"

2.查詢平均成績(jī)大于等于 60 分的同學(xué)的學(xué)生編號(hào)和學(xué)生姓名和平均成績(jī)

SELECT a.sid,b.sname,ag
FROM (
    SELECT sid,AVG(score) AS ag
    FROM sc
    GROUP BY sid
    HAVING ag>=60) a
#篩選平均成績(jī)大于等于60分同學(xué)的sid和平均成績(jī)
INNER JOIN student b
ON a.`SId` = b.`SId`;

3.查詢?cè)趕c表存在成績(jī)的學(xué)生信息

SELECT *
FROM student
WHERE sid IN (SELECT sid FROM sc);

4.查詢所有同學(xué)的學(xué)生編號(hào)、學(xué)生姓名、選課總數(shù)、所有課程的總成績(jī)(沒(méi)成績(jī)的顯示為 null )

SELECT a.sid,sname,COUNT(cid) counts,SUM(score) sum_score
FROM student a
LEFT JOIN sc b
ON a.`SId` = b.`SId`
GROUP BY a.sid

4.1查有成績(jī)的學(xué)生信息

SELECT *
FROM student
WHERE sid IN (SELECT sid FROM sc);

5.查詢「李」姓老師的數(shù)量

SELECT COUNT(1)
FROM teacher
WHERE tname LIKE '李%'

6.查詢學(xué)過(guò)「張三」老師授課的同學(xué)的信息

#需要連接4表
#1.查詢課程老師為'張三'的cid   教師表和課程表
#2.查詢有成績(jī)且滿足條件1的sid   成績(jī)表
#3.查詢滿足條件2的學(xué)生信息    學(xué)生表
#--------------------------------------------------------------
#sql99語(yǔ)法如下
SELECT s.* 
FROM student s
INNER JOIN sc 
ON s.sid = sc.sid
WHERE cid IN (
    SELECT cid
    FROM course c
    INNER JOIN teacher t
    ON c.tid = t.tid
    WHERE tname = '張三')
#----------------------------------------------------------------
#sql92語(yǔ)法
SELECT s.*
FROM student s,sc,teacher t,course c
WHERE t.tname = '張三'
AND c.tid = t.tid
AND s.sid = sc.sid
AND sc.cid = c.cid;
#直接粗暴連接三張表,然后各自篩選條件即可

7.查詢沒(méi)有學(xué)全所有課程的同學(xué)的信息

SELECT student.*
FROM sc
RIGHT JOIN student
ON sc.`SId` = student.`SId`
GROUP BY student.sid
HAVING  COUNT(cid) <(
        SELECT COUNT(1)
        FROM course);  #所有課程數(shù)量

8.查詢至少有一門課與學(xué)號(hào)為" 01 "的同學(xué)所學(xué)相同的同學(xué)的信息

SELECT DISTINCT student.*
FROM student
INNER JOIN sc
ON student.`SId` = sc.`SId`
WHERE sc.`CId` IN (
        SELECT cid
        FROM sc
        WHERE sid='01')

9.查詢和" 01 "號(hào)的同學(xué)學(xué)習(xí)的課程完全相同的其他同學(xué)的信息
(篩選完全相同的需要使用NOT IN,例如篩選僅有(1,2)的,需要篩選not in( not in(1,2) ),即:沒(méi)有沒(méi)有1和2的。因?yàn)?IN"的作用可以篩選與條件完全相同,或者有其中一個(gè)的)

SELECT s.*
FROM student s
INNER JOIN sc
ON s.sid = sc.sid 
WHERE s.sid NOT IN(
    SELECT sid 
    FROM sc     #篩選沒(méi)有'01'同學(xué)的課程的同學(xué)sid
    WHERE cid NOT IN ( 
        SELECT cid
        FROM sc
        WHERE sid = '01'))
AND NOT s.sid = '01'
#篩選sid不在 "沒(méi)有'01'同學(xué)的課程的同學(xué)的sid" ,且sid !='01'的學(xué)生信息
#此時(shí),若'01'同學(xué)學(xué)習(xí)的1,2課程,那么篩選后的人必定有1或者2或者1,2均有
#若課程數(shù)大于二則必定包含1、2,
GROUP BY s.sid
HAVING COUNT(cid) = (
    SELECT COUNT(1) 
    FROM sc 
    WHERE sid ='01' 
    GROUP BY sid)

10.查詢沒(méi)學(xué)過(guò)"張三"老師講授的任一門課程的學(xué)生姓名

SELECT  Sname
FROM student 
WHERE sid NOT IN (
    SELECT sid 
    FROM sc 
    WHERE cid IN(
        SELECT CID
        FROM course c
        INNER JOIN teacher t
        ON c.Tid = t.Tid
        WHERE Tname='張三'
             )
        );

11.查詢兩門及其以上不及格課程的同學(xué)的學(xué)號(hào),姓名及其平均成績(jī)

SELECT s.sid,sname,AVG(score) AS ag
FROM student s
INNER JOIN sc
ON s.sid = sc.sid
WHERE score<60
GROUP BY s.sid
HAVING COUNT(score)>=2;

12、檢索" 01 "課程分?jǐn)?shù)小于 60,按分?jǐn)?shù)降序排列的學(xué)生信息

SELECT s.*
FROM student s
INNER JOIN sc
ON s.sid = sc.sid 
WHERE cid = '01' AND score<60
ORDER BY score DESC

13、按平均成績(jī)從高到低顯示所有學(xué)生的所有課程的成績(jī)以及平均成績(jī)
(若查詢某人所有成績(jī)以及平均分,則需要先創(chuàng)建一個(gè)平均分的子查詢,然后將所有科目關(guān)聯(lián)子查詢)

SELECT *
FROM student a
LEFT JOIN (
    SELECT sc.*,ag
    FROM sc 
    INNER JOIN (
            SELECT sid,AVG(score) ag 
            FROM sc
            GROUP BY sid) s2
    ON sc.sid=s2.sid) b
ON a.sid = b.sid
ORDER BY ag DESC;

14.查詢各科成績(jī)最高分、最低分和平均分:
以如下形式顯示:課程 ID,課程 name,最高分,最低分,平均分,及格率,中等率,優(yōu)良率,優(yōu)秀率
及格為>=60,中等為:70-80,優(yōu)良為:80-90,優(yōu)秀為:>=90
要求輸出課程號(hào)和選修人數(shù),查詢結(jié)果按人數(shù)降序排列,若人數(shù)相同,按課程號(hào)升序排列

SELECT c.cid,cname,COUNT(1) counts,MAX(score) max_socre,MIN(score) min_score,AVG(score) avg_score,
       SUM(IF(score>=60,1,0))/COUNT(1) AS 及格率,
       SUM(IF(score BETWEEN 70 AND 79,1,0))/COUNT(1) AS 中等率,
       SUM(IF(score BETWEEN 81 AND 90,1,0))/COUNT(1) AS 優(yōu)良率,
       SUM(IF(score>=90,1,0))/COUNT(1) AS 優(yōu)秀率
FROM course c
INNER JOIN sc
ON c.cid = sc.cid
GROUP BY c.cid
ORDER BY counts DESC, CAST(c.cid AS SIGNED INTEGER) ASC;  #將字符串cid轉(zhuǎn)變?yōu)閿?shù)值型(其實(shí)這里不轉(zhuǎn)變也可以排序)

15.按各科成績(jī)進(jìn)行排序,并顯示排名, Score 重復(fù)時(shí)保留名次空缺
排名函數(shù):

  • <排名方式>() OVER(PARTITION <分組依據(jù)> ORDER BY <排序依據(jù)>)
  • 排名方式:
    -- row_number:排名時(shí)序號(hào)連續(xù)并且不重復(fù),遇到相同的數(shù)值,仍然連續(xù)排名
    -- rank :排名時(shí),相同數(shù)值取同一序號(hào),且取較高值,序號(hào)有間隔
    -- dense_rank:排名時(shí),相同數(shù)值取同一序號(hào),且取較高值,序號(hào)連續(xù)不間斷
SELECT cid,score,rank() over(PARTITION BY cid ORDER BY score DESC) AS 'rank'
FROM sc;

15.1 按各科成績(jī)進(jìn)行排序,并顯示排名, Score 重復(fù)時(shí)合并名次
SELECT cid,score,dense_rank() over(PARTITION BY cid ORDER BY score DESC) AS 'rank'
FROM sc;

16、查詢學(xué)生的總成績(jī),并進(jìn)行排名,總分重復(fù)時(shí)保留名次空缺

SELECT a.*,rank() over(ORDER BY sum_score DESC) 'rank'
FROM(
    SELECT sid,SUM(score) sum_score
    FROM sc
    GROUP BY sid) a;

17.統(tǒng)計(jì)各科成績(jī)各分?jǐn)?shù)段人數(shù):課程編號(hào),課程名稱,[100-85],[85-70],[70-60],[60-0] 及所占百分比

SELECT cid,SUM(IF(score BETWEEN 85 AND 100,1,0))/COUNT(1) '[100-85]',SUM(IF(score BETWEEN 85 AND 100,1,0)) a,
                SUM(IF(score BETWEEN 70 AND 84,1,0))/COUNT(1) '(85-70]',SUM(IF(score BETWEEN 70 AND 84,1,0)) b,
                SUM(IF(score BETWEEN 60 AND 69,1,0))/COUNT(1) '(70-60]',SUM(IF(score BETWEEN 60 AND 69,1,0)) c,
                SUM(IF(score BETWEEN 0  AND 59,1,0))/COUNT(1) '(60-0]' ,SUM(IF(score BETWEEN 0  AND 59,1,0)) d
FROM sc
GROUP BY cid;

18.查詢各科成績(jī)前三名的記錄

SELECT *
FROM (
    SELECT cid,sid,rank() over(PARTITION BY cid ORDER BY score DESC) 'rank'
    FROM sc) a
WHERE a.rank <= 3;
#解法二:大于此成績(jī)的小于3個(gè)人即為第三名
SELECT *
FROM sc a
WHERE (
    SELECT COUNT(*) 
    FROM sc b 
    WHERE a.cid = b.cid 
    AND b.score > a.score
       )< 3;

19、查詢每門課程被選修的學(xué)生數(shù)

SELECT cid,COUNT(1)
FROM sc
GROUP BY cid;

20、查詢出只選修兩門課程的學(xué)生學(xué)號(hào)和姓名

SELECT s.sid,sname,COUNT(s.sid)
FROM student s
INNER JOIN sc
ON s.sid = sc.`SId`
GROUP BY s.sid
HAVING COUNT(s.sid) = 2

21.查詢男生、女生人數(shù)

SELECT ssex,COUNT(1)
FROM student
GROUP BY ssex;

22、查詢名字中含有「風(fēng)」字的學(xué)生信息

SELECT *
FROM student
WHERE sname LIKE '%風(fēng)%';

23.查詢同名同性學(xué)生名單,并統(tǒng)計(jì)同名同姓人數(shù)

SELECT a.sname,COUNT(a.sname) counts
FROM student a
INNER JOIN student b
ON a.sname = b.sname 
AND a.`Ssex` = b.`Ssex`
AND a.sid != b.sid
GROUP BY a.sname ;

24.查詢 1990 年出生的學(xué)生名單

SELECT *
FROM student 
WHERE YEAR(sage)=1990;

25.查詢每門課程的平均成績(jī),結(jié)果按平均成績(jī)降序排列,平均成績(jī)相同時(shí),按課程編號(hào)升序排列

SELECT cid,AVG(score) ag
FROM sc 
GROUP BY cid
ORDER BY ag DESC,cid ASC

26.查詢平均成績(jī)大于等于 85 的所有學(xué)生的學(xué)號(hào)、姓名和平均成績(jī)

SELECT s.sid,sname,AVG(score) ag
FROM student s
INNER JOIN sc
ON s.sid = sc.sid 
GROUP BY s.sid 
HAVING ag>=85;

27、查詢課程名稱為「數(shù)學(xué)」,且分?jǐn)?shù)低于 60 的學(xué)生姓名和分?jǐn)?shù)

SELECT sname,cname,score
FROM sc 
INNER JOIN student s
ON s.sid = sc.sid AND score < 60
INNER JOIN course c
ON sc.cid = c.cid AND cname = '數(shù)學(xué)';

28、查詢所有學(xué)生的課程及分?jǐn)?shù)情況(存在學(xué)生沒(méi)成績(jī),沒(méi)選課的情況)

SELECT *,sc.cid,sc.`score`
FROM student s
LEFT JOIN sc
ON s.sid = sc.sid;

29、查詢?nèi)魏我婚T課程成績(jī)?cè)?70 分以上的姓名、課程名稱和分?jǐn)?shù)

SELECT sname,cname,score
FROM sc
INNER JOIN student s
ON s.sid = sc.sid AND score > 70
INNER JOIN course c
ON sc.cid = c.cid;

30.查詢存在不及格的課程

SELECT DISTINCT cid
FROM sc
WHERE score < 60;

31.查詢課程編號(hào)為 01 且課程成績(jī)?cè)?80 分以上的學(xué)生的學(xué)號(hào)和姓名

SELECT s.sid,sname
FROM student s
INNER JOIN sc
ON s.sid = sc.sid 
AND cid = '01' 
AND score >= 80;

32、求每門課程的學(xué)生人數(shù)

SELECT cid, COUNT(1)
FROM sc
GROUP BY cid;

33、假設(shè)成績(jī)不重復(fù),查詢選修「張三」老師所授課程的學(xué)生中,成績(jī)最高的學(xué)生信息及其成績(jī)

SELECT s.*,score
FROM student s
INNER JOIN sc
ON s.sid = sc.sid
WHERE cid IN (
    SELECT cid
    FROM course c
    INNER JOIN teacher t
    ON c.tid = t.tid
    AND tname = '張三')
ORDER BY score DESC
LIMIT 1;

34、假設(shè)成績(jī)有重復(fù)的情況下,查詢選修「張三」老師所授課程的學(xué)生中,成績(jī)最高的學(xué)生信息及其成績(jī)

SELECT *    #選第一名的信息
FROM (
    SELECT a.*,dense_rank() over(ORDER BY score DESC) AS ranks    #根據(jù)成績(jī)排名
    FROM (    #創(chuàng)建子查詢:張三老師所授課學(xué)生的信息
        SELECT s.*,score
        FROM student s
        INNER JOIN sc
        ON s.sid = sc.sid
        WHERE cid IN (
            SELECT cid
            FROM course c
            INNER JOIN teacher t
            ON c.tid = t.tid
            AND tname = '張三')) a
    ) b
WHERE ranks = 1;

35.查詢不同課程成績(jī)相同的學(xué)生的學(xué)生編號(hào)、課程編號(hào)、學(xué)生成績(jī)

SELECT *
FROM sc a
INNER JOIN sc b
ON a.sid = b.sid
AND a.cid != b.cid
AND a.score = b.score
GROUP BY a.`SId`,a.cid;
#這里用兩個(gè)group by可以多次分類,達(dá)到去重效果

36.查詢每門功成績(jī)最好的前兩名

SELECT *
FROM sc a
WHERE   (
    SELECT COUNT(1) 
    FROM sc b
    WHERE a.cid=b.cid 
    AND b.score>a.score
    )<2;
#子查詢?yōu)椋捍笥诖顺煽?jī)的數(shù)量

37.統(tǒng)計(jì)每門課程的學(xué)生選修人數(shù)(超過(guò) 5 人的課程才統(tǒng)計(jì))

SELECT cid,COUNT(1)
FROM sc 
GROUP BY cid
HAVING COUNT(1) > 5;

38.檢索至少選修兩門課程的學(xué)生學(xué)號(hào)

SELECT *
FROM sc
GROUP BY sid
HAVING COUNT(cid) >=2;

39、查詢選修了全部課程的學(xué)生信息

SELECT *
FROM student s
INNER JOIN sc 
ON s.sid = sc.`SId`
GROUP BY s.sid
HAVING COUNT(cid) =(
    SELECT COUNT(1)
    FROM course);
#解法二:
SELECT *
FROM student a
WHERE (SELECT COUNT(1) FROM sc b WHERE a.sid=b.sid)  
               #這一步,每一個(gè)條件查詢內(nèi)容都會(huì)根據(jù)括號(hào)中where后的條件去關(guān)聯(lián)
             =(SELECT COUNT(1) FROM course)

40.查詢各學(xué)生的年齡,只按年份來(lái)算

SELECT sid,sname,YEAR(NOW())-YEAR(sage) AS age
FROM student;

41、按照出生日期來(lái)算,當(dāng)前月日 < 出生年月的月日則,年齡減一
substr(參數(shù)1,參數(shù)2,參數(shù)3):截取字符串某一位置開(kāi)始的固定字符數(shù)
參數(shù)1:被截取的字符串,參數(shù)2:截取開(kāi)始位置(sql從1開(kāi)始排序),參數(shù)3:截取位數(shù)

SELECT sid,sname,TIMESTAMPDIFF(YEAR,sage,NOW()) AS age
FROM student;
#解法二:
select   *,
    case when substr(sage,6,5)<substr(now(),6,5) then year(now())-year(sage) 
            when substr(sage,6,5)>=substr(now(),6,5) then year(now())-year(sage) -1 
            end as age
from student;

42.查詢本周過(guò)生日的學(xué)生
week:查詢今年的第幾周,參數(shù)為從星期幾開(kāi)始算新的一周

SELECT *
FROM student
WHERE WEEK(sage,1) = WEEK(NOW(),1);

43、查詢下周過(guò)生日的學(xué)生

SELECT *
FROM student
WHERE WEEK(sage,1) = WEEK(NOW(),1) + 1;

44.查詢本月過(guò)生日的學(xué)生

SELECT *
FROM student
WHERE MONTH(sage) = MONTH(NOW());

45.查詢下月過(guò)生日的學(xué)生

SELECT *
FROM student
WHERE MONTH(sage) = MONTH(NOW()) + 1;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容