MySQL(十一)-多表查询(上)

多表关系

1 一对一

方式1:通过修改表结构添加外键
修改表结构: ALTER TABLE 当前表名 ADD CONSTRAINT FOREIGN KEY(id) REFERENCES 被关联表名 (id);

方式1:通过修改表结构添加外键 
-- 用户和资料表 
-- 用户表 
CREATE TABLE customer ( 
      id INT PRIMARY KEY AUTO_INCREMENT, 
      user_name VARCHAR(50) 
);
-- 资料表 
CREATE TABLE extension( 
      id INT PRIMARY KEY AUTO_INCREMENT, 
      info VARCHAR(200) 
);
-- 外键(主键)关联主键 
ALTER TABLE extension 
      ADD CONSTRAINT FOREIGN KEY(id) REFERENCES customer(id); 

方式2: 在创建表时候,直接建立外键 
-- 用户表同上 
-- 资料表 
      --创建字段关联id 
CREATE TABLE extension2( 
      id INT PRIMARY KEY AUTO_INCREMENT, 
      info VARCHAR(200), 
      cid INT UNIQUE, 
      foreign key(cid) REFERENCES customer(id) );

注意:物理外键(主)和逻辑外键

-- 测试数据 
insert into customer values(1,'张三'); 
insert into extension values(1,'开发工程师'); 

insert into extension values(2,'测试工程师'); -- 报错,资料表时依赖于用户表 

insert into customer values(1,'李四'); 
insert into extension values(2,'测试工程师'); -- 成功 

insert into extension2 values(1,'开发工程师',100); -- customer中没有id=100

注意:auto_increment:如果没有指定编号,那么根据当前表中最大编号按照递增顺序编号,即使数据
被删除,该编号也不会被再次利用

方式2:通过建表时,添加外键约束

创建表时候增加字段,用于外键约束:

  • 创建新字段 INT UNIQUE
  • foreign key(当前表字段名) REFERENCES 被关联表(id)

2 一对多关系

方式1:在多的一方表中增加字段,去关联少的一方的主键

-- 商店表 
CREATE TABLE shop( 
      id INT PRIMARY KEY, 
      sname VARCHAR(100) 
);
-- 商品表 
CREATE TABLE goods( 
      id INT PRIMARY KEY auto_increment,
      gname VARCHAR(100), 
      price DOUBLE, 
      sid INT, 
      foreign key(sid) REFERENCES shop(id)
 );
-- 在商店表中插入具体数据 
insert into shop values(1,"华天"),(2,"好再来"); 

-- 向商品表中增加数据 
insert into goods values(1,'沙发',3999.9,1),(0,"电视",4888.8,1); --成功 i

nsert into goods values(0,'笔记本',3999.9,3); -- 失败,shop不存在该编号

方式2:新建一个关系表,用于关联之前两个表的各自主键。

-- 商店表 
CREATE TABLE shop( 
      id INT PRIMARY KEY, 
      sname VARCHAR(100) 
);
-- 商品表 
CREATE TABLE goods2( 
      id INT PRIMARY KEY auto_increment, 
      gname VARCHAR(100), 
      price DOUBLE );
-- 新建关系表 
create table shop_goods( 
      id int primary key, 
      shop_id int, 
      goods_id int unique, 
      foreign key(shop_id) references shop(id), 
      foreign key(goods_id) references goods2(id) );

-- 向goods2表中插入数据 
insert into goods2 values (1,'沙发',999.9),(2,"电视",1999),(3,'笔记本',8999); 

-- 向关系表中增加数据 
insert into shop_goods values(1,2,3); --成功 
insert into shop_goods values(2,2,3); -- 失败,同一个商品是能由一家卖 

-- 向shop添加数据 
insert into shop values (3,"家乐福");

insert into shop_goods values(2,3,2); -- 成功 
insert into shop_goods values(3,300,1); -- 失败,没有编号为300的店

3 多对多
创建第三方表用于记录各自主键

  • 学生和学科
  • 商品类型和商品
-- 创建学生表 
create table students( 
      id int primary key auto_increment not null, 
      s_name varchar(10) 
);
-- 创建学科表 
create table courses( 
      id int primary key auto_increment not null, 
      c_name varchar(10) 
);
--第三张表 
create table stu_cos( 
      id int primary key auto_increment not null, 
      s_id int, 
      c_id int, 
      foreign key(s_id) REFERENCES students(id), 
      foreign key(c_id) references courses(id)
);

-- 向学生表和课程表中插入数据 
insert into students values(1,'张三'),(2,"李四"),(3,"王五"),(4,"马六"); 
insert into courses values(1,"python"),(2,'java'),(3,"c++"),(4,'web'); 

-- 向关系表中插入数据 
insert into stu_cou values 
      (1,1,1),
      (2,3,3), 
      (3,2,1),
      (4,1,2), 
      (5,2,2),
      (6,4,4), 
      (7,4,3),
      (8,3,1);
posted @ 2021-01-06 20:07  小杜打醋尢买布  阅读(68)  评论(0编辑  收藏  举报