外键:使两张表之间存在关联

特点:

1.从表外键的值是对主表主键的引用

2.从表外键类型,必须与主表主键类型一致

示例:

创建两个表并准备数据:

USE mybase;
CREATE TABLE category(
cid VARCHAR(32) PRIMARY KEY,
cname VARCHAR(100)
);
CREATE TABLE product(
pid VARCHAR(32) PRIMARY KEY,
pname VARCHAR(40),
price DOUBLE,
category_id VARCHAR(32)
);
INSERT INTO category(cid,cname) VALUES('c001','家电');
INSERT INTO category(cid,cname) VALUES('c002','服饰');
INSERT INTO category(cid,cname) VALUES('c003','化妆品'); INSERT INTO product(pid,pname,price,category_id) VALUES('p001','联想','','c001');
INSERT INTO product(pid,pname,price,category_id) VALUES('p002','海尔','','c001');
INSERT INTO product(pid,pname,price,category_id) VALUES('p003','雷神','','c001'); INSERT INTO product(pid,pname,price,category_id) VALUES('p004','JACK JONES','','c002');
INSERT INTO product(pid,pname,price,category_id) VALUES('p005','真维斯','','c002');
INSERT INTO product(pid,pname,price,category_id) VALUES('p006','花花公子','','c002');
INSERT INTO product(pid,pname,price,category_id) VALUES('p007','劲霸','','c002'); INSERT INTO product(pid,pname,price,category_id) VALUES('p008','香奈儿','','c003');
INSERT INTO product(pid,pname,price,category_id) VALUES('p009','相宜本草','','c003');

执行这段代码没有问题:

DELETE FROM category WHERE cid='c003';

添加外键关系:

ALTER TABLE product ADD FOREIGN KEY(category_id) REFERENCES category(cid);

这时候两个表中的数据就存在外键关系

执行这段代码就会出错:

DELETE FROM category WHERE cid='c003';

如果想成功,需要先删除和它有关的product表中的两条数据

如果从表添加数据,不能添加主表中不存在的记录,例如添加category_id为c004的数据

表与表之间的关系:

一对多:

实例:客户和订单,分类和商品

一个分类对应多个商品,一个商品只能属于某个分类

上边这个实例,就是一个一对多案例

多对多:

实例:学生选课

多名学生,选择多门课程,学生随意选择

需要注意多对多的建表方法:

创建第三张表作为中间表,至少两个字段

这两个字段分别作为外键指向各自一方的主键:

具体代码:

CREATE TABLE 从表(
字段1,
字段2,
...
)
ALTER TABLE 从表 ADD FOREIGN KEY(字段1) REFERENCES 主表1(主键);
ALTER TABLE 从表 ADD FOREIGN KEY(字段2) REFERENCES 主表2(主键);

一对一:

实例:公司的地址

一个公司对应一个地址,一对一

实际开发中不使用,通常写在一张表中即可

多表查询:

使用上边创建的两张表以及数据:

两张表的全集
SELECT * FROM category,product; 内连接查询
SELECT * FROM category INNER JOIN product ON cid=category_id; SELECT * FROM category c,product p WHERE c.cid=p.category_id; 外连接查询
SELECT * FROM category LEFT JOIN product ON cid=category_id; SELECT * FROM category RIGHT JOIN product ON cid=category_id; 子查询 SELECT cid FROM category WHERE cname='化妆品'; SELECT * FROM product WHERE category_id=(SELECT cid FROM category WHERE cname='化妆品');

MySQL学习笔记2(多表操作)的更多相关文章

  1. MySQL学习笔记十三:表分区

    1.分区一般用于非常大的表,采用“分而治之”的策略,将一个很大的对象分成多个小对象进行管理,每个分区都是一个独立的对象. 分区使用分区键将数据根据范围值,特定列值或HASH值等规则分布在不同的分区中. ...

  2. mysql学习笔记--数据库单表查询

    一.查询语句 1.  select [选项] 列名 [from 表名]  [where 条件]  [order by 排序]  [group by 分组]  [having 条件]  [limit 限 ...

  3. MySQL学习笔记8——多表查询

    多表查询 多表查询 *合并结果集 *连接查询 *子查询 合并结果集 *要求被合并的表中,列的类型和列数相同(实际上是查询的结果集列类型和列数相同即可) *UNION,去除重复行 *UNION ALL, ...

  4. mysql学习笔记--数据库多表查询

    一.内连接[inner join] 1. 语法一:select 列名 from 表1 inner join 表2 on 表1.公共字段=表2.公共字段 2. 语法二:select 列名 from 表1 ...

  5. Hibernate学习笔记--------1.单表操作

    一.hibernate基本开发步骤 1.引入包,官网下载的包,目录\lib\required下的jar都加进去,这里使用的是 hibernate-release-5.2.1.Final 2.编写配置文 ...

  6. Mysql学习笔记(三)对表数据的增删改查。

    正文内容. 这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mys ...

  7. MySQL学习笔记一

    MySQL 学习笔记 一 一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系 ...

  8. Mysql学习笔记(二)数据类型 补充

    原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...

  9. Mysql学习笔记(一)数据类型

    原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型     Mysql数据类型             含义(有符号)     tinyint(m ...

  10. 初识mysql学习笔记

    使用VMVirtualBox导入Ubuntu后,可以通过sudo apt-get install mysql-server命令下载mysql. 在学习过程中,我遇到了连接不上Xshell的问题.最终在 ...

随机推荐

  1. 自动滚动标签marquee

    <marquee>标签,它是成对出现的标签,首标签<marquee>和尾标签</marquee>之间的内容就是滚动内容.<marquee>标签的属性主要 ...

  2. Linux ssh命令

    SSH(远程连接工具)连接原理:ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息. ...

  3. cdnbest常见http状态码解释

    cdnbest的常见状态码提示界面: 400状态码:语义有误,当前请求无法被服务器理解 网站访问报这个提示:host not found(找不到主机),这是没有同步站点信息到这个节点上,检查节点连接主 ...

  4. Java学习笔记(十七):构造器和setter方法选用

  5. 360浏览器对CSS的补齐

    360浏览器对很多CSS不兼容,导致了很多代码显示不正常, 常见的解决方法: 很多人在源代码加了<meta content=\"IE=edge\" http-equiv=\& ...

  6. [leetcode]72. Edit Distance 最少编辑步数

    Given two words word1 and word2, find the minimum number of operations required to convert word1 to ...

  7. [leetcode]59. Spiral Matrix II螺旋遍历矩阵2

    Given a positive integer n, generate a square matrix filled with elements from 1 to n^2 in spiral or ...

  8. spring mvc controller中的参数验证机制(二)

    这里我们介绍以下自定义的校验器的简单的使用示例 一.包结构和主要文件 二.代码 1.自定义注解文件MyConstraint package com.knyel.validator; import ja ...

  9. vs [失败]未能找到文件

    用文本文件打开csproj 文件.将里面的不需要文件删除; 或者在工程里面先将其移出工程.然后再删除;

  10. 选择困难症的福音——团队Scrum冲刺阶段-Day 2

    选择困难症的福音--团队Scrum冲刺阶段-Day 2 今日进展 编写提问部分 如何将不同的问题选项连接到不同的下一个问题 如何保证问题的链接不会弄丢 登陆注册界面 完成密码可见与不可见的更改 ui界 ...