SQL中联表查询深入分析

  • LEFT JOIN 左集合(左表)
  • RIGHT JOIN 右集合(右表)
  • FULL OUTER JOIN 并集
  • JOIN (INNER JOIN) 交集

测试数据表:

sql 复制代码
-- 创建数据库 (可选)
CREATE DATABASE IF NOT EXISTS school_demo;
USE school_demo;

-- 1. 老师表
DROP TABLE IF EXISTS teachers;
CREATE TABLE teachers (
    t_id INT PRIMARY KEY AUTO_INCREMENT,
    t_name VARCHAR(50) NOT NULL,
    subject VARCHAR(50) -- 教授科目
);

-- 2. 课程表 (关联老师)
DROP TABLE IF EXISTS courses;
CREATE TABLE courses (
    c_id INT PRIMARY KEY AUTO_INCREMENT,
    c_name VARCHAR(50) NOT NULL,
    t_id INT, -- 外键,关联老师ID
    credit DECIMAL(3,1) -- 学分
);

-- 3. 学生表
DROP TABLE IF EXISTS students;
CREATE TABLE students (
    s_id INT PRIMARY KEY AUTO_INCREMENT,
    s_name VARCHAR(50) NOT NULL,
    age INT,
    major VARCHAR(50) -- 专业
);

-- 4. 选课记录表 (关联学生和课程)
DROP TABLE IF EXISTS selections;
CREATE TABLE selections (
    id INT PRIMARY KEY AUTO_INCREMENT,
    s_id INT, -- 关联学生
    c_id INT, -- 关联课程
    score INT, -- 分数,NULL表示未考试
    INDEX idx_s (s_id),
    INDEX idx_c (c_id)
);

测试数据:

sql 复制代码
-- 插入老师数据 (5条)
INSERT INTO teachers (t_name, subject) VALUES 
('王老师', '数学'),
('李老师', '英语'),
('赵老师', '计算机'),
('陈老师', '物理'),
('刘老师', '体育');

-- 插入课程数据 (5条,分别对应上面的老师)
INSERT INTO courses (c_name, t_id, credit) VALUES 
('高等数学', 1, 4.0),
('大学英语', 2, 3.0),
('Java编程', 3, 3.5),
('大学物理', 4, 4.0),
('篮球', 5, 1.0);

-- 插入学生数据 (5条)
INSERT INTO students (s_name, age, major) VALUES 
('张三', 20, '计算机'),
('李四', 21, '数学'),
('王五', 20, '物理'),
('赵六', 22, '计算机'),
('钱七', 19, '英语');

-- 插入选课记录数据 (约8条,模拟不同学生选不同课)
INSERT INTO selections (s_id, c_id, score) VALUES 
(1, 1, 85.5), -- 张三选修高等数学
(1, 3, 92.0), -- 张三选修Java编程
(2, 1, 95.0), -- 李四选修高等数学
(2, 2, 88.0), -- 李四选修大学英语
(3, 4, 76.0), -- 王五选修大学物理
(4, 3, 89.0), -- 赵六选修Java编程
(4, 5, 100.0),-- 赵六选修篮球
(5, 2, NULL); -- 钱七选修英语但还未考试(score为NULL)

场景 1:基础联表 (INNER JOIN 或 JOIN) 查询所有选了课的学生姓名、课程名和分数:

sql 复制代码
SELECT 
    s.s_name AS 学生姓名,
    c.c_name AS 课程名,
    sel.score AS 分数
FROM selections sel
JOIN students s ON sel.s_id = s.s_id
JOIN courses c ON sel.c_id = c.c_id;

查询结果:

场景 2:多表联查 (包含老师信息) 查询学生张三选修的课程,以及该课程的任课老师:

sql 复制代码
SELECT 
    s.s_name,
    c.c_name,
    t.t_name AS 老师,
    t.subject
FROM students s
JOIN selections sel ON s.s_id = sel.s_id
JOIN courses c ON sel.c_id = c.c_id
JOIN teachers t ON c.t_id = t.t_id
WHERE s.s_name = '张三';

查询结果

场景 3:左联表 (Left Join) 查询所有学生,以及他们的选课情况(即使没选课的学生也要列出):

sql 复制代码
SELECT 
    s.s_name,
    c.c_name,
    sel.score
FROM students s
LEFT JOIN selections sel ON s.s_id = sel.s_id
LEFT JOIN courses c ON sel.c_id = c.c_id;

查询结果:

相关推荐
仍然.8 小时前
Redis---缓存
数据库·redis·缓存
Aloudata8 小时前
LookML 语义模型 vs 企业级独立语义层:BI 建模语言能否承担企业语义底座?
数据库·人工智能·数据分析·数据资产·dataagent
细嗅蔷薇@8 小时前
排序和分⻚(order by 、limit)
数据库·oracle
wdfk_prog9 小时前
LWIP教程 09:从 `tcp_slowtmr()` 到 Fast Retransmit——TCP 超时重传与重复 ACK
服务器·网络·数据库·网络协议·tcp/ip
逸模9 小时前
BIM在连锁餐饮装修中的应用:不只是画三维图
大数据·数据库·人工智能·物联网·建模
梦想平凡9 小时前
棋牌游戏技术实战(五):从对局事件重新执行规则,核对棋盘和最终状态
数据库·游戏·oracle
白露与泡影9 小时前
Oracle AI Database 26ai RAC 部署步骤、关键命令与一键脚本
数据库·人工智能·oracle
天天喝旺仔10 小时前
MySQL 索引原理与慢查询优化实战:从 B+ 树到执行计划调优
数据库·sql·mysql·性能优化
专业程序开发源10 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
liulilittle10 小时前
Linux 下 select 测试函数
linux·服务器·网络·数据库·c++·select·c