这篇主要总结mysql的建表规则。
01.多表_建表的原则:
    需求:创建一个表可以存储学员信息:学员编号,姓名,性别,年龄,科目
    1).原则:
        1.保证表中的一列,只记录一件事情。如果记录了多件事情,建议分成多列。
        2.为每个表创建一个主键。
        3.要保证每个表只记录一件事情,如果记录多件事情,要分成多表存储。中间可以使用"引用"来引用另一个表的数据。
    2).两个概念:
        1.主表:被其它表引用的表;
        2.从表:引用主表的表;
 
02.多表_表和表之间的关系:
    1).一对多【最常用,比例较多】:
        1.常见实例:客户和订单,分类和商品,部门和员工
                客户(主) --> 订单(从)(外键字段)
                分类(主) --> 商品(从)(外键字段)--》注意:本例描述的是:一个商品只属于一个类别
                部门(主) --> 员工(从)(外键字段)
 
        2.一对多建表原则:在从表(多方)创建一个字段(外键字段),此字段作为外键指向主表(一方)的主键
 
        3.关于外键的说明:
            1).外键字段的名称可以和主键的主键名称不同;
            2).外键字段的数据类型要跟主键的数据类型相同或者比主键类型更宽。
 
    2).多对多【较常用,比例较少】:
        1.常见实例:学生和课程
                学生 --> 课程   --》注意:本例描述:一个学生可以选择多门课程,一个课程可以被多个学生选择.
        2.多对多关系建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键。(可以将这两个 设置为联合主键)
    3).一对一【基本不用】:不建议使用
 
03.多表_外键约束:----(如果俩表要约束的话,主表必须要有定义的主键)!
    1).什么是外键约束:可以在"从表"的"外键字段"上创建一个"外键约束"
    2).外键约束的作用:强制要求"外键"字段的值必须参考"主表"中"主键"字段的值,如果外键中出现了主键中没有的值, 数据库会立即抛异常,它可以保证我们数据的完整性和一致性。
    3).其它说明:外键字段允许:NULL值
             外键的值可以重复,可以为NULL,但必须参考主表的主键的值。(从表不能添加,主表不存在的数据 ; 主表不能删除,从表已使用的数据。)(在一对多关系中,存在一种父子关系,主表又称为父表,从表又称为从表 )
    4).创建语句:
        格式:alter table 从表 add constraint 外键名称 foreign key (从表外键字段名) references 主表 (主表的主键);
        例如:
              ALTER TABLE emp ADD CONSTRAINT fk_emp FOREIGN KEY (deptId) REFERENCES dept (did);
        方法二,手动添加外键约束-->在架构设计器中,将从表的外键 托向 主表的主键.
    5).可以使用SQLYog中的"架构设计器"来设置两个表的关系。(手动添加外键约束 )
            注意:从"从表"向"主表"中拖拽。
04.多表查询:
    1).交叉查询:(错误的结果,显示的两个表的记录的乘积,也叫:笛卡尔积)
        select * from product,category;
    2).内连接查询【最常用】:(显示两个表的等值记录)
        1).隐式内连接【常用】:    from 俩表 where 俩表的等值关系
            格式:  select 字段列表    from 从表,主表   where 从表.外键字段 = 主表.主键字段:
            例如:
                select * from product,category where product.cid = category.cid;
        2).显示内连接: inner join ... on 等值关系---(从表和主表没有位置关系,可以交换位置)
            格式:    select 字段列表  from 从表 INNER JOIN 主表 ON 从表.外键字段 = 主表.主键字段
            例如:
                select * from product inner join category on product.cid = category.cid;
        3).关于"表别名"
            例如:   
                select * from product p,category c where p.cid = c.cid;
                select * from product p inner join category c on p.cid = c.cid;
        4).关于隐式和显示连接的其它写法:
            1).隐式内连接:select ... from 从表 , 主表 on 从表.外键字段 = 主表.主键字段;//错误
            2).显示内连接:select ... from 从表 inner join 主表 where 从表.外键字段 = 主表.主键字段;//OK的,但不建议
    3).外连接查询【较常用】:(分:左外连接和右外连接)
        1).左外连接:能查询出"左表"的所有记录,包括跟右表等值的和不等值的。
            格式:select 字段列表 from 从表 left join 主表 on 从表.外键字段 = 主表.主键字段;
            需求:查询出所有商品,有类别的显示类别名称,没有类别的显示NULL
                select * from product p left join category c on p.cid = c.cid;  (与显示内连接的区别,就是用left替换了inner)
        2).右外连接:能查询出"右表"的所有记录,包括跟左表等值的和不等值的。
            格式:select 字段列表 from 从表 right join 主表 on 从表.外键字段 = 主表.主键字段;
            需求:查询出所有的"商品类别",有商品的类别要同时显示商品,没有的显示NULL
                select * from product p right join category c on p.cid = c.cid;
 
05.子查询:
    1).什么是子查询:一个查询的查询条件,需要从另一个查询来获取,这样就要嵌套两个查询语句。作为其他查询的条件的查询就是:子查询;
    2).例如:查询出价格比"海澜之家"更高的商品信息:
            select * from product where price > (select price from product where pname = '海澜之家');
    3).例如:查询"化妆品"分类商品详情
        1).select * from product where cid = (select cid from category where cname = '化妆品')---属于:单表查询
           //子查询的结果作为另个表
        2).select * from product p , (select * from category where cname = '化妆品') c where p.cid = c.cid;
    4).例如:查询"化妆品"和"家电"两个商品详情
        1).select * from product p , (select * from category where cname in ('化妆品','家电')) c where p.cid = c.cid;
06.三表联查:
    1).内连接查询:     (表2, 就是中间表)
        1).隐式内连接:
            select * from 表1 , 表2 , 表3 where 表1 和 表2的等值关系 and 表2和表3的等值关系;
        2).显示内连接:
            select * from 表1 inner join 表2 on 表1和表2的等值关系 inner join 表3 on (表1和表2的连接结果)和 表3的等值关系;
    2).外连接查询:
        select * from 表1 left/right join 表2 on 表1和表2的等值关系 left/right join 表3 on (表1和表2的连接结果)和表3的等值关系;
 
 
 
 

3.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. scrapy 简介

    Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架. Scrapy架构图(绿线是数据流向): Scrapy Engine(引擎): 负责Spider.ItemPip ...

  2. Invalid bound statement (not found) 问题处理

    最近开发过程中遇到一个BUG:Invalid bound statement (not found): com.mapper.ResourceIdMappingsBatchMapper.deleteR ...

  3. 如何在Java的Filter中注入Service???

    今天在做用户使用cookie自动登录的时候,发现在LoginFilter中读取到cookie以后要进行查询数据库然后进行用户名和密码的比对,查询数据库肯定要用到Service和Dao,一开始我以为在s ...

  4. mysql with python

    前言: 数据库为人类解决了三大问题:持久化存储.优化读写.数据标准化. MySQL它不是数据库,它是管理数据库的软件.MySQL管理了很多数据库.是典型的服务型数据库,需要TCP/IP去连接. MyS ...

  5. 【BZOJ1923】[Sdoi2010]外星千足虫 高斯消元

    [BZOJ1923][Sdoi2010]外星千足虫 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 ...

  6. 记录-Hibernate+servlet实现简单的增、删、查、改

    由于需要对Hibernate作个了解,所以写了个简单的实现 以上是大概目录 1.新建Hibernate.cfg.xml配置文件 <?xml version='1.0' encoding='UTF ...

  7. mysql-5.7.16-linux-glibc2.5-x86_64精简后的主从配置

    1.创建复制账号,并授予复制权限CREATE USER 'fansik'@'10.%' IDENTIFIED BY 'fansik';GRANT REPLICATION SLAVE ON *.* TO ...

  8. 【HTTP】WEB机器人

    <HTTP权威指南>学习摘要 Web Robot的自活跃(self-animating)用户代理. Web机器人是在不需要人工干预的情况下,自动进行一系列Web事务处理的软件程序,别名“爬 ...

  9. python基础27 -----python进程终结篇-----IO模型

    一.IO模型 1.IO模型分类 1.阻塞IO--------blocking IO 2.非阻塞IO------nonblocking IO 3. 多路复用IO------- multiplexing ...

  10. 深度学习3--caffe的安装(only CPU)

    1. 本来按照视频走的,但是在cmake的时候报错,然后参考了这篇文章,稀里糊涂的就好了,总结就是把“视频/本文”说的依赖都安装上,就可以了,先安装opencv,再安装caffe第三方依赖 在安装ca ...