多表设计与多表查询

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. TCP/IP-TCP

    Don't cry over spilt milk. "覆水难收" 参考资料:TCP/IP入门经典 (第五版)  TCP/IP详解 卷一:协议 TCP是协议栈中非常重要的一个部分, ...

  2. PhotoShop 移动工具详解

    自动选择工具 勾选后  可以随意移动任意图层     不勾选  只适用于移动当前所选图层 Ctrl+Z 还原移动Ctrl+Alt+Z 后退一步 复制图像 Alt键+拖动 Shift+Alt+拖动   ...

  3. Python按行读取文件

    1:readline() file = open("sample.txt") while 1: line = file.readline() if not line: break ...

  4. UVa 10935 - Throwing cards away I (队列问题)

    原题 Throwing cards away I   Given is an ordered deck of n cards numbered 1 to n with card 1 at the to ...

  5. d038: 星罗密布

    内容: 输出图形 *****$***$$$*$$$$$ 规律是...自己发现吧. 要求输入3,输出上面三行的图形 输入说明: 行数小于40 输出说明:   输入样例:   3 输出样例 : ***** ...

  6. MVC中的Ajax(AjaxHelper)

    authour: chenboyi updatetime: 2015-04-30 20:47:49 friendly link:   目录 1,思维导图 2,ActionLink() 3,BeginF ...

  7. cocos2d-x把json数据解析到数组或字典中(libjson库)

    以前在cocos2d-x项目中用到json解析,集成了libjson库后发现网上提供的解析方法大多是在解析过程中取得值,并没有将解析结果有效的保存起来,于是摸索一番,把解析结果根据数据格式存到数组或字 ...

  8. java中字符输入输出流在输出结果的结尾多一个乱码字符:'?'

    原因以及解决方法: 核心方法如下: public static void main(String[] args) throws Exception{ // TODO Auto-generated me ...

  9. sql server 2008 case when

    CASE WHEN的两种格式 1.简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END 2.Case搜索函数 CASE ...

  10. Mahout

    http://blog.csdn.net/yueyedeai/article/details/26567379