SQL语句详解四-DQL(数据查询语言-多表查询一)

表和表的关系

  • 概述:数据库中表的关系有三种,一对一关系、一对多的关系、多对多的关系。

一对一关系

  • 例如:一个人只能有一个身份证号,一个身份证号只属于一个人

  • 示例代码

    -- 创建数据库,并指定 utf8 字符集
    CREATE DATABASE IF NOT EXISTS school CHARACTER SET utf8;
    
    -- 使用数据库
    USE school;
    
    -- 创建人类表
    CREATE TABLE person(
    	p_id INT PRIMARY KEY AUTO_INCREMENT,		-- 人类表 id 
    	p_name VARCHAR(40) NOT NULL,				-- 姓名字段
    	p_address VARCHAR(200)						-- 地址字段
    );
    
    -- 创建身份证号表
    CREATE TABLE idcard(
    	c_id INT PRIMARY KEY AUTO_INCREMENT,		-- 身份证号表 id
    	c_number VARCHAR(18)						-- 身份证号字段
    );
    
    -- 插入数据
    INSERT INTO person VALUES(1 , '张三' ,'河南');
    INSERT INTO person VALUES(2 , '李四' ,'北京');
    INSERT INTO person VALUES(3 , '王五' ,'上海');
    
    INSERT INTO idcard VALUES(1 , '11111');
    INSERT INTO idcard VALUES(2 , '22222');
    INSERT INTO idcard VALUES(3 , '33333');
    
    -- 给人类表添加外键
    ALTER TABLE person ADD CONSTRAINT p_idcard FOREIGN KEY (p_id) REFERENCES idcard(c_id);
    
  • 一对一关系图

一对多、多对一关系

  • 例如:一门课程只能属于一个老师,一个老师可以有多门课程

    • 站在老师的角度,是一对多
    • 站在课程的角度,是多对一
    • 我们习惯把 一 的一方称之为 主表,多的一方称之为 从表
  • 示例代码

    -- 创建课程表
    CREATE TABLE course(
    	c_id INT PRIMARY KEY AUTO_INCREMENT,		-- 课程表 id
    	c_name VARCHAR(100),						-- 课程名称
    	ct_id INT									-- 教师外键
    );
    
    -- 创建教师表
    CREATE TABLE teacher(
    	t_id INT PRIMARY KEY AUTO_INCREMENT,		-- 教师编号
    	t_name VARCHAR(40)							-- 教师姓名
    );
    
    -- 插入数据
    INSERT INTO course VALUES( 101, '语文',1);
    INSERT INTO course VALUES( 102, '数学',3);
    INSERT INTO course VALUES( 103, '英语',5);
    INSERT INTO course VALUES( 104, '政治',2);
    INSERT INTO course VALUES( 105, '历史',1);
    INSERT INTO course VALUES( 106, '地理',4);
    
    INSERT INTO teacher VALUES(1 , '张老师');
    INSERT INTO teacher VALUES(2 , '李老师');
    INSERT INTO teacher VALUES(3 , '王老师');
    INSERT INTO teacher VALUES(4 , '黄老师');
    INSERT INTO teacher VALUES(5 , '马老师');
    
    -- 给课程表添加外键
    ALTER TABLE course ADD CONSTRAINT c_teacher FOREIGN KEY (ct_id) REFERENCES teacher(t_id);
    
  • 一对多、多对一关系图

多对多关系

  • 例如:一门课程可以有多个学生,一个学生也可以有多门课程

    • 多对多可以看成两个多对一的关系,此时我们需要使用到中间表
  • 中间表的创建规则

    • 表名由多对多关系的两个表名称组成
    • 表中只有两个字段,分别建立对应外键关联到对应表的主键
    • 两个字段都是主键,组成联合主键
  • 示例代码

    -- 创建学生表
    CREATE TABLE student(
    	s_id INT PRIMARY KEY AUTO_INCREMENT,		-- 学生表 id
    	s_name VARCHAR(40) NOT NULL					-- 学生姓名字段
    );
    
    -- 创建中间表
    CREATE TABLE student_course(
    	cc_id INT,									-- 课程表外键
    	ss_id INT									-- 学生表外键
    );
    
    -- 插入数据
    INSERT INTO student_course VALUES(101 , 1);
    INSERT INTO student_course VALUES(101 , 2);
    INSERT INTO student_course VALUES(101 , 3);
    INSERT INTO student_course VALUES(102 , 3);
    INSERT INTO student_course VALUES(105 , 3);
    INSERT INTO student_course VALUES(104 , 2);
    
    INSERT INTO student VALUES(1,'张三');
    INSERT INTO student VALUES(2,'李四');
    INSERT INTO student VALUES(3,'王五');
    
    -- 添加外键
    ALTER TABLE student_course ADD CONSTRAINT c_sc FOREIGN KEY(cc_id) REFERENCES course(c_id);
    ALTER TABLE student_course ADD CONSTRAINT s_sc FOREIGN KEY(ss_id) REFERENCES student(s_id);
    
  • 多对多关系图

接下来,请看文章:多表查询

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-01-18 13:16:01       17 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-18 13:16:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-18 13:16:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-18 13:16:01       18 阅读

热门阅读

  1. 页面嵌入iframe Cookie丢失问题解决

    2024-01-18 13:16:01       36 阅读
  2. python list.sort方法和内置函数sorted

    2024-01-18 13:16:01       34 阅读
  3. CTF - Web 干货

    2024-01-18 13:16:01       35 阅读
  4. jquery批量执行任务实时返回状态

    2024-01-18 13:16:01       37 阅读