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

特点:

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. python 的包的导入

    已经写过一篇包的导入了,最近又遇到了点问题,所以想把这些再搞的明白点就又试了试 代码结构如下 在test目录下,有Admin包,home包,在home下有它的子包foo 各个文件代码如下 admins ...

  2. Python模块定义和使用

    Python中所谓的模块就是一个Python文件,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块.模块由代码.函数或类组成.编程中使用模块不仅可以提 ...

  3. DOCKER解析(转)

    Docker基本概念详解 本文只是对Docker的概念做了较为详细的介绍,并不涉及一些像Docker环境的安装以及Docker的一些常见操作和命令. 阅读本文大概需要15分钟,通过阅读本文你将知道一下 ...

  4. 微商城分享 包括app分享 微信分享

    <template> <div class="spr"> <img src="../../assets/images/activity/sh ...

  5. angular分页插件tm.pagination二次触发问题解决歪方案

    今天在学习angularjs的分页插件时遇到了一个前端的问题,谷歌浏览器开发者模式调试的时候发现每次点击分页刷新按钮会触发两次后台请求,ajax向后台发送了两次请求,这对于强迫症患者来说是一个比较恶心 ...

  6. 【Unity】打包安卓APK常见问题

    问题:unity error invalid command android 原因:Android版本较新,Unity版本太旧(如4.X),Unity打包APK时调用Android工具使用的命令已被安 ...

  7. JVM参数类型

    java -version看版本号(混合模式) java -Xint -version  解释执行 java -Xcomp -version 编译执行 XX参数是不稳定的用来JVM调优和DeBug B ...

  8. Python SMTP发送邮件

    import smtplibfrom email.mime.text import MIMEText  # 引入smtplib和MIMEText host = 'smtp.163.com'  # 设置 ...

  9. django mysql 数据库配置

    在settings.py中保存了数据库的连接配置信息,Django默认初始配置使用sqlite数据库. DATABASES = { 'default': { 'ENGINE': 'django.db. ...

  10. IntelliJ IDEA常用快捷键(Mac)

    Mac 键盘符号和修饰键说明 ⌘ ——> Command ⇧ ——> Shift ⌥ ——> Option ⌃ ——> Control ↩︎ ——> Return/Ent ...