MySQL之SQL訓練(二)

一、表關係

在這裏插入圖片描述

二、操作表

1、創建表結構

SET FOREIGN_KEY_CHECKS = 0;

DROP TABLE IF EXISTS class;
CREATE TABLE class (
  cid TINYINT (4) NOT NULL AUTO_INCREMENT,
  caption VARCHAR (32) NOT NULL,
  PRIMARY KEY (cid)
) DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

DROP TABLE IF EXISTS student;
CREATE TABLE `student` (
  `sid` TINYINT (4) NOT NULL AUTO_INCREMENT,
  `sname` VARCHAR (32) COLLATE utf8_unicode_ci NOT NULL,
  `gender` ENUM ('男', '女') COLLATE utf8_unicode_ci NOT NULL,
  `class_id` TINYINT (4) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_class_id` (`class_id`),
  CONSTRAINT `fk_class_id` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
) DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

DROP TABLE IF EXISTS teacher;
CREATE TABLE teacher (
  tid TINYINT (4) AUTO_INCREMENT PRIMARY KEY,
  tname VARCHAR (32)
) DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

DROP TABLE IF EXISTS course;
CREATE TABLE course (
  cid TINYINT (4) AUTO_INCREMENT PRIMARY KEY,
  cname VARCHAR (32),
  teach_id TINYINT (4),
  FOREIGN KEY (teach_id) REFERENCES teacher (tid)
) DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

DROP TABLE IF EXISTS score;
CREATE TABLE score (
  sid TINYINT (4) AUTO_INCREMENT PRIMARY KEY,
  number TINYINT (4),
  student_id TINYINT (4),
  course_id TINYINT (4),
  FOREIGN KEY (student_id) REFERENCES student (sid),
  FOREIGN KEY (course_id) REFERENCES course (cid)
) DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

SET FOREIGN_KEY_CHECKS = 1;

2、插入測試數

insert into class(caption) values('三年級二班'),('二年級一班'),('一年級五班'),('二年級四班');
insert into student(sname,gender,class_id) values('張三','男',2),('李四','女',1),('Esther','男',2),('Esther','女',4);
insert into teacher(tname) values('馬克'),('黎明'),('梵高'),('馬克思');
insert into course(cname,teach_id)  values('音樂',2),('美術',3),('體育',1),('政治',4);
insert into score(number,student_id,course_id) values(100,1,1),(99,1,3),(98,1,2),(97,2,1),(96,2,2),(95,2,3),(94,3,2),(93,3,3),(92,4,3),(100,3,4);

三、測試題

1、查詢“音樂”課程比“美術”課程成績高的所有學生的學號

SELECT
  a.student_id
FROM
  (SELECT
    s.student_id,
    s.number
  FROM
    score s
    JOIN course c
      ON s.course_id = c.cid
  WHERE c.cname = '音樂') a
  INNER JOIN
    (SELECT
      s.student_id,
      s.number
    FROM
      score s
      JOIN course c
        ON s.course_id = c.cid
    WHERE c.cname = '美術') b
    ON a.student_id = b.student_id
WHERE a.number > b.number;

2、查詢平均成績大於95分的同學的學號和平均成績

SELECT
  student_id,
  AVG(number) avg_score
FROM
  score
GROUP BY student_id
HAVING avg_score > 95;

3、查詢所有同學的學號、姓名、選課數、總成績

SELECT
  student_id,
  sname,
  COUNT(course_id) AS '課數',
  SUM(number) AS '總分'
FROM
  score
  JOIN student
    ON score.student_id = student.sid
GROUP BY student_id;

4、查詢姓“馬”的老師的人數

SELECT
  COUNT(*) AS '馬老師人數'
FROM
  teacher
WHERE tname LIKE '馬%'

5、查詢沒學過“黎”老師課的同學的學號、姓名

SELECT
  sid,
  sname
FROM
  student
WHERE sid NOT IN
  (SELECT
    s.`student_id`
  FROM
    `score` s
    JOIN `course` c
      ON s.`course_id` = c.`cid`
    JOIN `teacher` t
      ON c.`teach_id` = t.`tid`
  WHERE t.`tname` LIKE '黎%')

6、查詢學過編號“1”並且也學過編號“2”課程的同學的學號、姓名

SELECT
  `sid`,
  `sname`
FROM
  (SELECT
    s1.`student_id`
  FROM
    (SELECT `student_id` FROM `score` WHERE `course_id` = 1) s1,
    (SELECT `student_id` FROM `score` WHERE `course_id` = 2) s2
  WHERE s1.`student_id` = s2.`student_id`) s3, `student`
WHERE s3.`student_id` = `student`.`sid`

7、查詢學過“馬”老師的所有課的同學的學號、姓名

SELECT
  s1.`sid`,
  s1.`sname`
FROM
  `student` s1
  JOIN `score` s2
    ON s1.`sid` = s2.`student_id`
  JOIN `course` c
    ON s2.`course_id` = c.`cid`
  JOIN `teacher` t
    ON t.`tid` = c.`teach_id`
WHERE t.`tname` LIKE '黎%'

8、查詢課程編號“2”的成績比課程編號“1”課程低的所有同學的學號、姓名

SELECT
  s.`sid`,
  s.`sname`
FROM
  `student` s
  JOIN
    (SELECT
      s2.`student_id`
    FROM
      (SELECT
        *
      FROM
        `score`
      WHERE `course_id` = 2) s2
      JOIN
        (SELECT
          *
        FROM
          `score`
        WHERE `course_id` = 3) s3
        ON s2.`student_id` = s3.`student_id`
        AND s2.`number` < s3.`number`) s4
    ON s.`sid` = s4.`student_id`

9、查詢有課程成績小於95分的同學的學號、姓名

SELECT
  st.`sid`,
  st.`sname`
FROM
  `student` st
  JOIN `score` sc
    ON st.`sid` = sc.`student_id`
WHERE sc.`number` < 95
GROUP BY st.`sid`

10、查詢沒有學全所有課的同學的學號、姓名

SELECT
  st.`sid`,
  st.`sname`
FROM
  `student` st
  JOIN `score` sc
    ON st.`sid` = sc.`student_id`
GROUP BY st.`sid`
HAVING COUNT(sc.`course_id`) <
  (SELECT
    COUNT(`cname`)
  FROM
    `course`)

11、查詢至少有一門課與學號爲“1”的同學所學相同的同學的學號和姓名

SELECT
  st.`sid`,
  st.`sname`
FROM
  `student` st
  JOIN
    (SELECT
      sc.`student_id`
    FROM
      `score` sc
    WHERE sc.`course_id` IN
      (SELECT
        sc.`course_id`
      FROM
        `score` sc
      WHERE sc.`student_id` = 1)
    GROUP BY sc.`student_id`) s
    ON st.`sid` = s.`student_id` 

12、查詢至少學過學號爲“1”同學所選課程中任意一門課的其他同學學號和姓名

SELECT
  st.`sid`,
  st.`sname`
FROM
  `student` st
  JOIN
    (SELECT
      sc.`student_id`
    FROM
      `score` sc
    WHERE sc.`course_id` IN
      (SELECT
        sc.`course_id`
      FROM
        `score` sc
      WHERE sc.`student_id` = 1)
    GROUP BY sc.`student_id`) s
    ON st.`sid` = s.`student_id`
WHERE st.`sid` != 1

13、查詢和“2”號的同學學習的課程完全相同的其他同學學號和姓名

SELECT
  st.`sid`,
  st.`sname`
FROM
  `student` st
  JOIN
    (SELECT
      s1.`student_id`
    FROM
      (SELECT
        sc.`student_id`,
        (
          GROUP_CONCAT(
            sc.`course_id`
            ORDER BY sc.`course_id` DESC SEPARATOR ','
          )
        ) gc
      FROM
        `score` sc
      GROUP BY sc.`student_id`) s1
    WHERE s1.`gc` =
      (SELECT
        GROUP_CONCAT(
          sc.`course_id`
          ORDER BY sc.`course_id` DESC SEPARATOR ','
        )
      FROM
        `score` sc
      WHERE sc.`student_id` = 2)) sc
    ON st.`sid` = sc.`student_id`
WHERE st.`sid` != 2

14、刪除學習“梵高”老師課的SC表記錄

DELETE
  sc.*
FROM
  `score` sc
  JOIN `course` co
    ON sc.`course_id` = co.`cid`
  JOIN `teacher` t
    ON co.`teach_id` = t.`tid`
WHERE t.`tname` = '梵高'

15、向SC表中插入一些記錄,這些記錄要求符合以下條件
①沒有上過編號“2”課程的同學學號
②插入“2”號課程的平均成績

insert into `score` (
  `number`,
  `student_id`,
  `course_id`
)
values
  (
    (SELECT
      AVG(sc.`number`)
    FROM
      `score` sc
    WHERE sc.`course_id` = 2),
    (SELECT
      sc.`student_id`
    FROM
      `score` sc
    WHERE sc.`course_id` NOT IN
      (SELECT
        sc.`course_id`
      FROM
        `score` sc
      WHERE sc.`student_id` = 2)),
    2
  )

16、按平均成績從低到高顯示所有學生的“音樂”、“美術”、“體育”三門的課程成績,要求如下
① 按如下形式顯示: 學生姓名,音樂,美術,體育,課程數,平均分
② 只顯示音樂、美術、體育,但其他課程要算到課程數和平均分裏

SELECT
  st.`sname`,
  s1.`number` AS '音樂',
  s2.`number` AS '美術',
  s3.`number` AS '體育',
  s.`cnt` AS '課程數',
  s.`av` AS '平均分'
FROM
  (SELECT
    sc.`student_id`,
    COUNT(sc.`course_id`) cnt,
    AVG(sc.`number`) av
  FROM
    `score` sc
  GROUP BY sc.`student_id`) s
  LEFT JOIN
    (SELECT
      sc.`student_id`,
      sc.`number`
    FROM
      `score` sc
      JOIN `course` co
        ON sc.`course_id` = co.`cid`
    WHERE co.`cname` = '音樂') s1
    ON s.`student_id` = s1.`student_id`
  LEFT JOIN
    (SELECT
      sc.`student_id`,
      sc.`number`
    FROM
      `score` sc
      JOIN `course` co
        ON sc.`course_id` = co.`cid`
    WHERE co.`cname` = '美術') s2
    ON s.`student_id` = s2.`student_id`
  LEFT JOIN
    (SELECT
      sc.`student_id`,
      sc.`number`
    FROM
      `score` sc
      JOIN `course` co
        ON sc.`course_id` = co.`cid`
    WHERE co.`cname` = '體育') s3
    ON s.`student_id` = s3.`student_id`
  JOIN `student` st
    ON st.`sid` = s.`student_id`
ORDER BY s.`av` ASC

17、查詢各科成績最高和最低的分:以如下形式顯示:課程名稱,最高分,最低分

SELECT
  co.`cname`,
  MAX(sc.`number`) AS '最高分',
  MIN(sc.`number`) AS '最低分'
FROM
  `score` sc
  JOIN `course` co
    ON sc.`course_id` = co.`cid`
GROUP BY sc.`course_id`

18、按各科平均成績從低到高和及格率的百分數從高到低順序(95分及格)

select
  co.`cname`,
  avg(sc.`number`) as '平均成績'
from
  `score` sc
  join `course` co
    on sc.`course_id` = co.`cid`
group by sc.`course_id`
order by AVG(sc.`number`) asc;
SELECT
  co.`cname`,
  CONCAT(
    FORMAT((s2.`cnt` / s1.`cnt`) * 100, 0),
    '%'
  ) AS '及格率'
FROM
  (SELECT
    `course_id`,
    COUNT(student_id) cnt
  FROM
    `score`
  GROUP BY `course_id`) s1
  JOIN
    (SELECT
      `course_id`,
      COUNT(student_id) cnt
    FROM
      `score`
    WHERE `number` >= 95
    GROUP BY `course_id`) s2
    ON s1.`course_id` = s2.`course_id`
  JOIN `course` co
    ON s1.`course_id` = co.`cid`
ORDER BY (s2.`cnt` / s1.`cnt`) DESC;

19、課程平均分從高到低顯示(現實任課老師)

SELECT
  t.`tname`,
  FORMAT(AVG(sc.`number`), 2) AS '課程平均分'
FROM
  `score` sc
  JOIN `course` co
    ON sc.`course_id` = co.`cid`
  JOIN `teacher` t
    ON co.`teach_id` = t.`tid`
GROUP BY sc.`course_id`
ORDER BY AVG(sc.`number`) DESC

20、查詢每門課程被選修的學生數

SELECT
  co.`cname`,
  COUNT(sc.`student_id`) AS '被選修的學生數'
FROM
  `score` sc
  JOIN `course` co
    ON sc.`course_id` = co.`cid`
GROUP BY sc.`course_id`

21、查詢各科成績前三名的記錄:(不考慮成績並列情況)

SELECT
  c.`cname` AS '科目',
  SUBSTRING_INDEX (GROUP_CONCAT (s.`sname` ORDER BY sc.`number` DESC),',',3) AS '前三名'
FROM
  `score` sc
  LEFT JOIN `course` c
    ON sc.`course_id` = c.`cid`
  LEFT JOIN `student` s
    ON sc.`student_id` = s.`sid`
GROUP BY sc.`course_id`

22、查詢出只選修了一門課程的全部學生的學號和姓名

SELECT
  st.`sid`,
  st.`sname`
FROM
  (SELECT
    sc.`student_id`,
    COUNT(sc.`course_id`) cnt
  FROM
    `score` sc
  GROUP BY sc.`student_id`) s
  JOIN `student` st ON s.`student_id` = st.`sid`
WHERE s.`cnt` = 1

23、查詢男生、女生的人數

SELECT
  s1.*,
  s2.*
FROM
  (SELECT
    COUNT(*) AS '男生人數'
  FROM
    `student` st
  WHERE st.`gender` = '男') s1,
  (SELECT
    COUNT(*) AS '女生人數'
  FROM
    `student` st
  WHERE st.`gender` = '女') s2

24、查詢姓“馬”的老師名單

SELECT
  t.*
FROM
  `teacher` t
WHERE t.`tname` LIKE '馬%'

25、查詢同名同姓學生名單,並統計同名人數

SELECT
  st.`sname`,
  COUNT(*) cnt
FROM
  `student` st
GROUP BY st.`sname`
HAVING cnt > 1

26、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列

SELECT
  co.`cname`,
  AVG(sc.`number`) avg_sc
FROM
  `course` co
  JOIN `score` sc
    ON co.`cid` = sc.`course_id`
GROUP BY sc.`course_id`
ORDER BY avg_sc ASC,
  sc.`course_id` DESC

27、查詢平均成績大於95的所有學生的學號、姓名和平均成績

SELECT
  st.`sid`,
  st.`sname`,
  AVG(sc.`number`) AS '平均分'
FROM
  `student` st
  JOIN `score` sc
    ON st.`sid` = sc.`student_id`
GROUP BY sc.`student_id`

28、查詢課程名稱爲“體育”,且分數在95以下包括95的學生姓名和分數

select
  st.`sname`,
  sc.`number`
from
  `student` st
  join `score` sc
    on st.`sid` = sc.`student_id`
  join `course` co
    on sc.`course_id` = co.`cid`
where co.`cname` = '體育'
  and sc.`number` <= 95

29、查詢課程編號爲3且課程成績在90分以上的學生的學號和姓名

select
  st.`sid`,
  st.`sname`
from
  `student` st
  join `score` sc
    on st.`sid` = sc.`student_id`
where sc.`course_id` = 3
  and sc.`number` > 95

30、選了“政治”課的學生人數

SELECT
  COUNT(sc.`course_id`) AS '選政治課學生人數'
FROM
  `course` co
  JOIN `score` sc
    ON co.`cid` = sc.`course_id`
WHERE co.`cname` = '政治'

31、查詢選修“梵高”老師所授課程的學生中,成績最高的學生姓名及其成績

SELECT
  st.`sname`,
  sc.`number`
FROM
  `student` st
  JOIN `score` sc
    ON st.`sid` = sc.`student_id`
  JOIN `course` co
    ON co.`cid` = sc.`course_id`
  JOIN `teacher` t
    ON t.`tid` = co.`teach_id`
WHERE t.`tname` = '梵高'
ORDER BY sc.`number` DESC
LIMIT 1

32、查詢各個課程及相應的選修人數

SELECT
  co.`cname`,
  COUNT(sc.`student_id`)
FROM
  `course` co
  JOIN `score` sc
    ON co.`cid` = sc.`course_id`
GROUP BY sc.`course_id`

33、查詢不同課程但成績相同的學生的學號、課程號、學生成績

SELECT
  sc1.`student_id`,
  sc1.`course_id`,
  sc1.`number`
FROM
  (SELECT
    sc.`student_id`,
    sc.`course_id`,
    sc.`number`
  FROM
    `score` sc) sc1,
  (SELECT
    sc.`student_id`,
    sc.`course_id`,
    sc.`number`
  FROM
    `score` sc) sc2
WHERE sc1.`number` = sc2.`number`
  AND sc1.`course_id` != sc2.`course_id`

34、檢索至少選修兩門課程的學生學號及姓名

SELECT
  st.`sid`,
  st.`sname`
FROM
  `student` st
  JOIN `score` sc
    ON st.`sid` = sc.`student_id`
GROUP BY sc.`student_id`
HAVING COUNT(sc.`course_id`) >= 2

35、檢索“2”課程分數小於95,按分數降序排列的同學學號

SELECT
  sc.`student_id`
FROM
  `score` sc
WHERE sc.`course_id` = 2
  AND sc.`number` < 95
ORDER BY sc.`number` DESC

36、查詢沒學過“馬克”老師講授的任一門課程的學生姓名

SELECT
  st.`sname`
FROM
  `student` st
  JOIN
    (SELECT
      sc1.`student_id`
    FROM
      (SELECT
        sc.`student_id`,
        GROUP_CONCAT(sc.`course_id` SEPARATOR '|') gc
      FROM
        `score` sc
      GROUP BY sc.`student_id`) sc1,
      (SELECT
        GROUP_CONCAT(co.`cid` SEPARATOR '|') gc
      FROM
        `course` co
        JOIN `teacher` t
          ON co.`teach_id` = t.`tid`
      WHERE t.`tname` = '馬克') sc2
    WHERE sc1.`gc` REGEXP sc2.`gc`) sc3
    ON st.`sid` = sc3.`student_id`

37、查詢全部學生都選修的課程的課程號和課程名

SELECT
  co.`cid`,
  co.`cname`
FROM
  `score` sc
  JOIN `course` co
    ON sc.`course_id` = co.`cid`
GROUP BY co.`cid`,
  co.`cname`
HAVING COUNT(sc.`student_id`) =
  (SELECT
    COUNT(`sid`)
  FROM
    `student`)

38、查詢兩門以上不及格課程的同學的學號,姓名及其平均成績(95分及格)

SELECT
  st.`sid`,
  st.`sname`,
  AVG(sc.`number`)
FROM
  `score` sc
  JOIN `student` st
    ON sc.`student_id` = st.`sid`
WHERE sc.`number` < 95
GROUP BY sc.`student_id`
HAVING COUNT(sc.`course_id`) >= 2
發佈了37 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章