多表设计与多表查询

1.外键约束
       表是用来保存现实生活中的数据的,而现实生活中数据和数据之间往往具有一定的关系,我们在使用表来存储数据时,可以明确的声明表和表之前的依赖关系,命令数据库来帮我们维护这种关系,像这种约束就叫做外键约束。  
       定义外键约束  foreign key(本表的列名 ordersid) references orders(id)(引用的表明及列名)
    create table dept(
        id int primary key auto_increment,
        name varchar(20)
    );
    create table emp(
        id int primary key auto_increment,
        name varchar(20),
        dept_id int,
        foreign key(dept_id) references dept(id)
    );

2.多表设计
    一对多:在多的一方保存一的一方的主键做为外键
    一对一:在任意一方保存另一方的主键作为外键
    多对多:创建第三方关系表保存两张表的主键作为外键,保存他们对应关系
3.多表查询
    3.1笛卡尔积查询:将两张表的记录进行一个相乘的操作查询出来的结果就是笛卡尔积查询,如果左表有n条记录,右表有m条记录,笛卡尔积查询出有n*m条记录,其中往往包含了很多错误的数据,所以这种查询方式并不常用
        select * from dept,emp;
    3.2内连接查询:查询的是左边表和右边表都能找到对应记录的记录
        select * from dept,emp where dept.id = emp.dept_id;
        select * from dept inner join emp on dept.id=emp.dept_id;
    3.3外连接查询
        a.左外连接查询:在内连接的基础上增加左边表有而右边表没有的记录
            select * from dept left join emp on dept.id=emp.dept_id;
        b.右外连接查询:在内连接的基础上增加右边表有而左边表没有的记录
            select * from dept right join emp on dept.id=emp.dept_id;
        c.全外连接查询:在内连接的基础上增加左边表有而右边表没有的记录和右边表有而左表表没有的记录
            select * from dept full join emp on dept.id=emp.dept_id;
        d.但是mysql不支持全外连接,不过我们可以使用union关键字模拟全外连接
            select * from dept left join emp on dept.id = emp.dept_id
            union
            select * from dept right join emp on dept.id = emp.dept_id;

多表查询实例

create table a(id int primary key,job varchar(20));
insert into a values(1,'AA'), (2,'BB'), (3,'CC');
select * from a;
 

create table b(id int ,name varchar(20) ,foreign key(id) references a(id));
一对多:在多的一方(b)保存一的一方(a)的主键做为外键;
多对多:创建第三方关系表保存两张表的主键作为外键,保存他们对应关系
注意:被参照的a(id)必须定义为unique才可以被参照,否则报错(逻辑错误)。
insert into b values(1,'bqt'), (2,'bqt2'), (2,'bqt3');
注意:插入数据的id必须在被参照的表中已经存在,否则报错(逻辑错误)。
select * from b;
 

select * from a,b;
 
将两张表的记录进行一个相乘的操作查询出来的结果就是笛卡尔积查询,如果左表有n条记录,右表有m条记录,笛卡尔积查询出有n*m条记录,其中往往包含了很多错误的数据,所以这种查询方式并不常用.

select * from a,b where a.id = b.id;
select * from a inner join b on a.id=b.id;
 
内连接查询:查询的是左边表和右边表都能找到对应记录的记录。

select * from a left join b on a.id=b.id;
 
左外连接查询:在内连接的基础上增加左边表有而右边表没有的记录

select * from a right join b on a.id=b.id;
 
右外连接查询:在内连接的基础上增加右边表有而左边表没有的记录
备注:由于右边表参照左边表,所以不存在右边表有而左边表没有的记录。

select * from a left  join b on a.id = b.id
union
select * from a right join b on a.id = b.id;
 
全外连接查询:在内连接的基础上增加左边表有而右边表没有,和右边表有而左表表没有的记录
select * from a full join b on a.id=b.id; -- 某些数据库支持,但mysql不支持!

数据库 SQL 外键约束 多表查询的更多相关文章

  1. MySQL数据库(4)_MySQL数据库外键约束、表查询

    一.外键约束 创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY ...

  2. 吃货眼中的sqlalchemy外键和连表查询

    前言 使用数据库一个高效的操作是连表查询,一条查询语句能够查询到多个表的数据.在sqlalchem架构下的数据库连表查询更是十分方便.那么如何连表查询?以及数据库外键对连表查询有没有帮助呢?本篇文章就 ...

  3. My SQL外键约束

    外键约束对子表的含义:如果在父表中找不到对应的候选键,则不能对子表进行insert/update操作 外键约束对父表的含义:在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹 ...

  4. MySQL数据库有外键约束时使用truncate命令的办法

    MySQL数据库操作中,Delete与Truncate两个命令都可以删除一个数据表中的全部数据,使用办法分别是: DELETE FROM t_question TRUNCATE TABLE t_que ...

  5. truncate有外键约束的表,报ORA-02266处理。

    问题描述:当父表有子表的外键约束时,无法直接truncate父表.报ORA-02266: unique/primary keys in table referenced by enabled fore ...

  6. 详解MariaDB数据库的外键约束

    1.什么是外键约束 外键约束(foreign key)就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强. 关于数据表的完整性和关连性,可以举个例子 ...

  7. MySQL基础9-主键约束、外键约束、等值连接查询、一对一和多对多关系

    1.主键约束和外键约束 外键约束 * 外键必须是另一表的主键的值(外键要引用主键!) * 外键可以重复 * 外键可以为空 * 一张表中可以有多个外键! 概念模型在数据库中成为表 数据库表中的多对一关系 ...

  8. mysql数据库导入外键约束问题

    在网站搬迁过程中,很重要一点是数据的迁移.你的数据库可能已经包含了一个设计良好的数据表集合,并且在网站运营过程中,产生了重要的数据.这时你必须做好包含数据表schema以及数据本身的迁移. 完成上述数 ...

  9. SQL外键约束

    1.查询表已有的外键 select name from sys.foreign_key_columns f join sys.objects o on f.constraint_object_id=o ...

随机推荐

  1. windows phone使用sharpcompress进行解压压缩文件

    在做移动端时,当我们需要从服务器获得多个文件时,为了节约流量,服务器一般会返回一个压缩包,那我们就是下载完成后,在手机中进行解压到指定位置 SharpCompress就是可以在手机中进行解压一个类库( ...

  2. Routing

    假如有一个请求:localhost/home/index,那么路由需要做的事情如下: (1)确定Controller (2)确定Action (3)确定其他参数 (4)根据识别出来的数据,将请求传递给 ...

  3. 黑马程序员—C语言的函数、数组、字符串

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.函数 定义:函数是代码复用的一种机制. 函数的基本语法: 返回类型 函数名 ( 参数类型 参 ...

  4. iOS开发——OC篇&OC高级语法

    iOS开发高级语法之分类,拓展,协议,代码块详解 一:分类 什么是分类Category? 分类就是类的补充和扩展部分 补充和扩展的每个部分就是分类 分类本质上是类的一部分 分类的定义 分类也是以代码的 ...

  5. 日期选择器(Query+bootstrap和js两种方式)

    日期选择是在下拉列表中选择年.月.日,年显示前后的五年,12个月,日就是有30.31.29.28天的区别,随着月份的变而变 一.js方式的日期选择 (1)首先就是三个下拉列表了,点击年.月.日显示列表 ...

  6. 如何在github上创建一个Repository (Windows)

    一种方式是利用Github for windows工具 来操作github,这个是我推荐的方式 1 请先下载一个工具Github for windows,下载地址为:https://windows.g ...

  7. 转:php连接oracle设定字符集,避免乱码

    原文来自于:http://muyu.iteye.com/blog/399884 数据库用oracle,当php连接oracle的时候,最好指定字符集. 查PHP手册,oci_connect的第四个参数 ...

  8. H.264 Quantization

    H.264 Quantizer 一般的量化器,可用下面的公式来表示: $Z=\pm \left \lfloor\frac{ \left | W \right | }{\bigtriangleup }\ ...

  9. Markdown和reStructuredText语法比较

    reStructuredText在线编辑器 http://rst.ninjs.org/ ReST是Docutils的标记语法,Docutils是Python世界的文档工具集.也因为这样ReST在Pyt ...

  10. 【转】掌握java枚举类型(enum type)

    原文网址:http://iaiai.iteye.com/blog/1843553 1   背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用 ...