一、外键
  1.外键:链接两张表的字段,通过主表的主键和从表的外键来描述主外键关系,呈现的是一对多的关系。例如:商品类别(一)对商品(多),主表:商品类别表,从表:商品表。
  2.外键的特点:从表外键的值是对主表主键的引用、从表外键类型必须与主表主键类型一致
  3.声明外键约束
    语法:alter table (从表) add [constraint] (外键名称) foreign key (从表外键字段名) references 主表 (主表的主键)
    例如:(1).ALTER TABLE product(从表) ADD CONSTRAINT cid(外键名称) FOREIGN KEY (cid)(从表外键字段名) REFERENCES category(主表) (cid)(主表的主键);
          (2). ALTER TABLE product ADD FOREIGN KEY (cid) REFERENCES category (cid);
    [外键名称]用于删除外键约束,一般建议”_fk”结尾
    alter table 从表 drop foreign key 外键名称;
  3. 使用外键的目的:保证数据完整性
  4.注意事项:从表外键不能添加主表中不存在的记录、主表不能删除从表中已经引用的记录
二、表与表之间的关系
  表与表之间的关系,就是表与表数据之间的关系。
  1. 一对多关系:
    常见实例:客户和订单,分类和商品,部门和员工
    一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键
    语法:ALTER TABLE product ADD FOREIGN KEY (cid) REFERENCES category (cid);
  2. 多对多关系:
    常见实例:学生和课程,商品和订单,人和角色
    多对多建表原则:需要创建第三张表,中间表至少要有两个字段,这两个字段分别作为外键指向各自一方的主键(就是将一个多对多拆分成两个一对多)
    两张表分别都是主表,第三张表为从表,提供两个字段,都是外键。
    语法:alter table 从表(stu_course) add foreign key(sno) references stu(sid);
    alter table 从表(stu_course) add foreign key(cno) references course(cid);
  3. 一对一关系:(了解)
    在实际开发中应用不多,因为一对一可以创建成一张表
    常见实例:公司和地址
    两种原则:外键唯一,外键是主键
三、操作
  1.多表查询
    (1).交叉连接查询(得到两个表的乘积,基本不使用)
      select * from A,B;
    (2).内连接查询(使用关键字:inner join -- inner可以省略)
      隐式内连接:select * from A,B where 条件;
      例如:select * from category c,product p where c.cid=p.cid;
      显式内连接:select * from A inner join B on 条件;
      例如:select * from category as c inner join product as p on p.cid=c.cid;
    (3).外连接查询(使用关键字outer join --outer可以省略)
      左外连接:left outer join
      select * from A left outer join B on 条件;
      例如:select * from category c left join product p on p.cid=c.cid;
      右外连接:right outer join
      select * from A right outer join B on 条件;
      例如:select * from category c right join product p on p.cid=c.cid;
    内连接和外连接的区别:
      左外连接:查询的是左表全部及两个表的交集
      内连接:查询的是两个表的交集
      右外连接:查询的是右表全部及两个表的交集
  2.子查询
    一条select语句结果作为另一条select语法的一部分(查询条件、查询结果、表等)
    例如:查询化妆品分类上架商品详情
    select * from product where cid =(select cid from category where cname='化妆品');

MySQL多表的更多相关文章

  1. mysql向表中某字段后追加一段字符串:

    mysql向表中某字段后追加一段字符串:update table_name set field=CONCAT(field,'',str) mysql 向表中某字段前加字符串update table_n ...

  2. oracle与mysql创建表时的区别

    oracle创建表时,不支持在建表时同时增加字段注释.故采用以下方式: #创建表CREATE TABLE predict_data as ( id integer ), mid ), time dat ...

  3. mysql数据库表的自增主键号不规律,重新排列

    mysql数据库表的自增主键ID乱了,需要重新排序. 原理:删除原有的自增ID,重新建立新的自增ID. 1.删除原有主键: ALTER TABLE `table_name` DROP `id`; 2. ...

  4. 基于表的数据字典构造MySQL建表语句

    表的数据字典格式如下: 如果手动写MySQL建表语句,确认麻烦,还不能保证书写一定正确. 写了个Perl脚本,可快速构造MySQL脚本语句. 脚本如下: #!/usr/bin/perl use str ...

  5. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表

    创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表 创建数据模型类(POCO类) 在Models文件夹下添 ...

  6. 用户中心mysql数据库表结构的脚本

    /* Navicat MySQL Data Transfer Source Server : rm-m5e3xn7k26i026e75o.mysql.rds.aliyuncs.com Source S ...

  7. MySQL InnoDB表--BTree基本数据结构

    MySQL InnoDB表是索引组织表这一点应该是每一个学习MySQL的人都会首先学到的知识,这代表这表中的数据是按照主键顺序存储,也就是说BTree的叶子节点存储了所有该行的数据. 我最开始是搞Or ...

  8. mysql数据库表结构导出

    mysql数据库表结构导出 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名; 导出整个数据库结构和数据 mysqldump -h localh ...

  9. Mysql连表之多对多

    说明 这里的文章是接着前面 Mysql连表一对多 写的. 连表多对多 可以理解成一夫多妻和一妻多夫. 男人表: nid name 1 xxx 2 yyy 3 zzz 女人表: nid name 1 a ...

  10. 在MySQL向表中插入中文时,出现:incorrect string value 错误

    在MySQL向表中插入中文时,出现:incorrect string value 错误,是由于字符集不支持中文.解决办法是将字符集改为GBK,或UTF-8.      一.修改数据库的默认字符集   ...

随机推荐

  1. 点滴记录——Ubuntu 14.04中Chrome浏览器标题栏出现中文乱码

    今天不知道在系统里装的哪个软件与Chrome浏览器所用的字体向冲突了,导致标题栏显示的中文都变成了乱码,其次收藏栏中的中文也变成了乱码.导致原有的收藏内容都无法辨认了.在网上搜索了一下,也有人遇到了相 ...

  2. 实现@using{}代码块

    前几天,我要写个插件,放在asp.net mvc的view上.这需要写一些扩展HtmlHelper功能的方法.这些方法的一个参数是一段javascript代码. 假如这个参数类型是字符型,当然很简单了 ...

  3. 5.eclipse 自带的jdk没有源码,改了它

    其实JDK源码在安装的时候已经放在了jdk所在的目录下,只是eclipse使用 了不带有源码的jre,导致没找到对应的源码,点击 Window->Perference->Java-> ...

  4. TCP Operational Overview and the TCP Finite State Machine (FSM) http://tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF.htm

    http://tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF.htm   http://tcpipgu ...

  5. idea自定义文档注释模板

    1.类注释模板 IntelliJ IDE --> Preferences --> Editor --> File and Code Templates --> Includes ...

  6. bzoj3272: Zgg吃东西&&3267: KC采花

    口胡 我们容易得到一个费用流的做法,流出k的流量分配给各个点,各个点向下一个点流费用为它的价值的边,然后汇总到ed 观察发现对于流一次,相当于选择了一个区间 如果流了反向边,相当于减去了这一段 可以用 ...

  7. YTU 2596: 编程题B-日期格式

    2596: 编程题B-日期格式 时间限制: 1 Sec  内存限制: 128 MB 提交: 981  解决: 74 题目描述 注:本题只需要提交编写的函数部分的代码即可. 将输入的日期格式 月/日/年 ...

  8. 网络抓包工具wireshark and tcpdump 及其实现基于的libpcap

    最近无意中看到博客园中一篇介绍wireshark的文章,写得不错,它简单清楚介绍了wireshark的使用 简介 wireshark以前叫做Ethereal, 在大学时候的网络课程中就常看到它,它是世 ...

  9. 数组方法 Array.prototype

    Object.prototype 数组的值是有序的集合,每一个值叫做元素,每一个元素在数组中都有数字位置编号,也就是索引,js中数组是弱类型的,数组中可以含有不同类型的元素.数组元素甚至可以是对象或者 ...

  10. angularJs 之deferred

    angularJs 对promise的封装 var deferred = $q.defer(); deferred.promise.then(function(){ var result = {} c ...