MySQL多表連接項目案例實踐


MySQL多表連接項目案例實踐 老男孩Linux運維MySQL課程
(1)准備工作(表名和表結構)

use school
student :學生表
sno:  學號
sname:學生姓名
sage: 學生年齡
ssex: 學生性別

teacher :教師表
tno:     教師編號
tname:   教師名字

course :課程表
cno:  課程編號
cname:課程名字
tno:  教師編號

score  :成績表
sno:  學號
cno:  課程編號
score:成績

(2)各個表關聯關系

(3)生成表格及插入數據

/* oldboyedu.com by oldboy 
Date: 05/12/2021 10:32:02 */

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
create database school CHARSET=utf8mb4;
use school;
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `cno` int(11) NOT NULL COMMENT '課程編號',
  `cname` varchar(20) NOT NULL COMMENT '課程名字',
  `tno` int(11) NOT NULL COMMENT '教師編號',
  PRIMARY KEY (`cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of course
-- ----------------------------
BEGIN;
INSERT INTO `course` VALUES (1001, 'linux', 101);
INSERT INTO `course` VALUES (1002, 'python', 102);
INSERT INTO `course` VALUES (1003, 'mysql', 103);
INSERT INTO `course` VALUES (1004, 'k8s', 108);
COMMIT;
-- ----------------------------
-- Table structure for sc
-- ----------------------------
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc` (
  `sno` int(11) NOT NULL COMMENT '學號',
  `cno` int(11) NOT NULL COMMENT '課程編號',
  `score` int(11) NOT NULL DEFAULT '0' COMMENT '成績'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of sc
-- ----------------------------
BEGIN;
INSERT INTO `sc` VALUES (1, 1001, 80);
INSERT INTO `sc` VALUES (1, 1002, 59);
INSERT INTO `sc` VALUES (2, 1002, 90);
INSERT INTO `sc` VALUES (2, 1003, 100);
INSERT INTO `sc` VALUES (3, 1001, 99);
INSERT INTO `sc` VALUES (3, 1003, 40);
INSERT INTO `sc` VALUES (4, 1001, 79);
INSERT INTO `sc` VALUES (4, 1002, 61);
INSERT INTO `sc` VALUES (4, 1003, 99);
INSERT INTO `sc` VALUES (5, 1003, 40);
INSERT INTO `sc` VALUES (6, 1001, 89);
INSERT INTO `sc` VALUES (6, 1003, 77);
INSERT INTO `sc` VALUES (7, 1001, 67);
INSERT INTO `sc` VALUES (7, 1003, 82);
INSERT INTO `sc` VALUES (8, 1001, 70);
INSERT INTO `sc` VALUES (9, 1003, 80);
INSERT INTO `sc` VALUES (10, 1003, 96);
COMMIT;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `sno` int(11) NOT NULL AUTO_INCREMENT COMMENT '學號',
  `sname` varchar(20) NOT NULL COMMENT '姓名',
  `sage` tinyint(3) unsigned NOT NULL COMMENT '年齡',
  `ssex` enum('f','m') NOT NULL DEFAULT 'm' COMMENT '性別',
  PRIMARY KEY (`sno`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of student
-- ----------------------------
BEGIN;
INSERT INTO `student` VALUES (1, 'zhangs', 18, 'm');
INSERT INTO `student` VALUES (2, 'lisi88', 18, 'm');
INSERT INTO `student` VALUES (3, 'wangwu', 22, 'm');
INSERT INTO `student` VALUES (4, 'laoliu', 19, 'f');
INSERT INTO `student` VALUES (5, 'zhao4m', 18, 'm');
INSERT INTO `student` VALUES (6, 'liuxia', 18, 'm');
INSERT INTO `student` VALUES (7, 'matian', 19, 'f');
INSERT INTO `student` VALUES (8, 'oldboy', 20, 'm');
INSERT INTO `student` VALUES (9, 'oldgirl', 20, 'f');
INSERT INTO `student` VALUES (10, 'oldpod', 25, 'm');
COMMIT;
-- ----------------------------
-- Table structure for teacher
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
  `tno` int(11) NOT NULL COMMENT '教師編號',
  `tname` varchar(20) NOT NULL COMMENT '教師名字',
  PRIMARY KEY (`tno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of teacher
-- ----------------------------
BEGIN;
INSERT INTO `teacher` VALUES (101, 'oldboy');
INSERT INTO `teacher` VALUES (102, 'ran');
INSERT INTO `teacher` VALUES (103, 'lisir');
INSERT INTO `teacher` VALUES (104, 'Tim');
INSERT INTO `teacher` VALUES (105, 'Jack');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;

項目構建:
source /root/school.sql

(4)多表連接查詢數據實踐

#實踐練習 
#1.統計下每個學生的平均成績 
解答:
#a.分析題意,找出所有相關表student、sc
#b.找到以上表的直接或間接關聯條件,student.sno,sc.sno
#c.列舉要查詢的列條件,student.sname,sc.score 
#d.組合最終結果:
mysql> SELECT student.sname,AVG(sc.score) FROM student JOIN sc ON student.sno=sc.sno GROUP BY student.sno;
+---------+---------------+
| sname   | AVG(sc.score) |
+---------+---------------+
| zhangs  |       69.5000 |
| lisi88  |       95.0000 |
...省略若干行...
| oldgirl |       80.0000 |
| oldpod  |       96.0000 |
+---------+---------------+

#2.統計每位學生學習的課程門數
mysql> SELECT student.sname,COUNT(sc.score) FROM student JOIN sc  ON student.sno=sc.sno GROUP BY student.sno;
+---------+-----------------+
| sname   | COUNT(sc.score) |
+---------+-----------------+
| zhangs  |               2 |
| lisi88  |               2 |
...省略若干行...
| oldgirl |               1 |
| oldpod  |               1 |
+---------+-----------------+

#3.統計每位老師所教的課程門數
mysql> SELECT teacher.tname ,COUNT(course.cname) FROM teacher JOIN course ON teacher.tno=course.tno GROUP BY teacher.tno;
+--------+---------------------+
| tname  | COUNT(course.cname) |
+--------+---------------------+
| oldboy |                   1 |
| ran    |                   1 |
| lisir  |                   1 |
+--------+---------------------+
#4.每位老師所教的課程門數和名稱
mysql> SELECT teacher.tname ,COUNT(course.cname),GROUP_CONCAT(course.cname)
    -> FROM teacher JOIN course ON teacher.tno=course.tno
    -> GROUP BY teacher.tno;
+--------+---------------------+----------------------------+
| tname  | COUNT(course.cname) | GROUP_CONCAT(course.cname) |
+--------+---------------------+----------------------------+
| oldboy |                   1 | linux                      |
| ran    |                   1 | python                     |
| lisir  |                   1 | mysql                      |
+--------+---------------------+----------------------------+

#5.每位學生學習的課程門數和名稱
mysql> SELECT student.sname,COUNT(sc.score),GROUP_CONCAT(course.cname)
    -> FROM student
    -> JOIN sc 
    -> ON student.sno=sc.sno
    -> JOIN course
    -> ON sc.cno=course.cno
    -> GROUP BY student.sno;
+---------+-----------------+----------------------------+
| sname   | COUNT(sc.score) | GROUP_CONCAT(course.cname) |
+---------+-----------------+----------------------------+
| zhangs  |               2 | python,linux               |
...省略若干行...
| oldboy  |               1 | linux                      |
| oldgirl |               1 | mysql                      |
| oldpod  |               1 | mysql                      |
+---------+-----------------+----------------------------+

(5)多表SQL考試題

1. 統計zhangs,學習了幾門課

2. 查詢zhangs,學習的課程名稱有哪些?

3. 查詢oldboy老師教的學生名.

4. 查詢oldboy所教課程的平均分數

5. 每位老師所教課程的平均分,並按平均分排序

6. 查詢ran所教的不及格的學生姓名

7. 查詢所有老師所教學生不及格的信息

8. 查詢平均成績大於60分的同學的學號和平均成績;

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

10.查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分

11.查詢每門課程被選修的學生數

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

13.查詢選修課程門數超過1門的學生信息

14.查詢平均成績大於85的所有學生的學號、姓名和平均成績

15.統計各位老師,所教課程的及格率

16.統計每門課程:優秀(85分以上),良好(70-85),一般(60-70),不及格(小於60)的學生列表

 《本內容來自老男孩教育MySQL部分教學》,交流數據庫技術可加右上角聯系方式

 


免責聲明!

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



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