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);

 
                
             浙公网安备 33010602011771号
浙公网安备 33010602011771号