多表设计与多表查询

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. 【USACO 1.4.4】母亲的牛奶

    [题目描述]  农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的.有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原 ...

  2. JavaScript 目标装配式编程(Target Assemble Programming)

    TAP概述 脚本中一切皆对象,若还以传统模式思考编程模式,那简直是对不起脚本解释器的强大支持:我们应该以最接近人类操作方式的来表达人的意图. 更接近工作实践的方式,比如游戏中,一个人物一个角色,人物的 ...

  3. 自动Telnet远程登陆命令

    有些时候,在面对开发机的时候,不断的telnet和不断的command自己的命令确实非常麻烦,需要一些自动测试或者自动部署的需求.然而面对telnet很多同学都跟我一样一开始觉得无法通过管道等传用户名 ...

  4. [转]python对json的相关操作

    json官方说明参见:http://json.org/ Python操作json的标准api库参考:http://docs.python.org/library/json.html 对简单数据类型的e ...

  5. ftp文件操作

    PHP FTP操作类( 上传.拷贝.移动.删除文件/创建目录 ) 2016-06-01 PHP编程 /** * 作用:FTP操作类( 拷贝.移动.删除文件/创建目录 ) */ class class_ ...

  6. Extjs中grid表格中去掉红三角

    在编辑Extjs的gridpanel的时候,数据有错误或是修改在每个单元格上都会出现红色的小三角,在每个列上面可以配置allowBlank: false来标识这个不可以为空 有的时候在保存数据时如果不 ...

  7. JS之路——浏览器window对象

    window对象的方法 window.alert(msg) window.close() window.print() var a = window.setIntval(function,毫秒) // ...

  8. Scheme是什么、怎么自定义Scheme、JLRoutes的使用-备

    转到移动端开发后居然现在才用到Scheme真是惭愧惭愧. URL Scheme是什么 相信大家都知道URL. http://www.apple.com就是一个URL. 而://之前的部分就称为Sche ...

  9. 转:在虚拟机中用NAT方式连接网络

    1.安装VMware Workstation .在安装过VMware Workstation软件后,会在本地连接中,多了两个虚拟网卡,一个是 VMware Network Adapter for VM ...

  10. 深入研究 Win32 结构化异常处理(好多相关文章)

    摘要 就像人们常说的那样,Win32 结构化异常处理(SEH)是一个操作系统提供的服务.你能找到的所有关于 SEH 的文档讲的都是针对某个特定编译器的.建立在操作系统层之上的封装库.我将从 SEH 的 ...