zoukankan      html  css  js  c++  java
  • Mysql-联结

    联结

    简介

    联结是一种机制,用来在一条SELECT语句中关联表,联结是由Mysql根据需要而建立的,它存在于SELECT语句的执行当中。

    在执行数据检索查询中使用联结是SQL强大的功能之一,

    联结是利用SQL的SELECT能执行的最重要的操作,

    在使用联结之前,我们必须要了解下关系表。

    关系表

    来个栗子说明下

    有一个关于产品的数据表,每个产品为一条记录,记录中包含产品的名称,产品的介绍,产品的价格以及供应商的信息。

    现在假如有一个供应商能够提供多种商品,那么如何存储供应商的信息,如名字,地址,手机号等,答案是应该将供应商的信息与产品的信息分开存储

    理由如下:

    1)同一个供应商的信息是相同的,对产品重复此信息浪费存储空间

    2)如果供应商信息有改动,只需改动一处即可

    3)如果有重复数据,很难保证每次输入数据的方式都相同(每种产品都存储供应商信息)

    相同数据出现多次不是一件好事是关系数据库设计的基础,关系表的设计就是要保证把信息分成多个表,一类信息一个表,

    各表通过某个常用值互相关联。

    下面我们来创建vendors和products这两个表,并对其进行关联

    CREATE TABLE vendors(
        vend_id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(20) NOT NULL,
        telephone VARCHAR(11)
    )ENGINE="INNODB", CHARSET="UTF8";
    
    
    CREATE TABLE products(
        pro_id INT(10) not NULL AUTO_INCREMENT PRIMARY KEY,
        vend_id INT(10),
        proc_name VARCHAR(20) not NULL,
        decs VARCHAR(50) DEFAULT NULL
    )ENGINE="INNODB", CHARSET="UTF8";
    
    
    INSERT INTO vendors VALUES(NULL, "tom", "13711111111");
    INSERT INTO vendors VALUES(NULL, "lily", "13811111111");
    INSERT INTO vendors VALUES(NULL, "marton", "13911111111");
    
    INSERT INTO products VALUES(NULL, 1, "apple", "big");
    INSERT INTO products VALUES(NULL, 2, "organge", "small");
    INSERT INTO products VALUES(NULL, 1, "grapes", NULL);

    外键为某个表的一列,它包含另一个表的主键值,定义两个表之间的关系。

    联结表的优点:

    1)避免了信息重复,节约了时间和空间

    2)某个数据变动,只需改变其响应的数据表即可

    3)数据无重复使得数据能够更有效的存储和方便的处理,伸缩性强能够适应不断增加的工作量

    如果数据存储在多个表中,那么怎么用一条语句检索出数据?答案是使用联结。

    Mysql中常用join来建立表之间的连接。

    join

    要理解join,我们首先要理解笛卡尔积,由没有联结条件的表关系返回的结果为笛卡尔积。

    比如表products中有m条记录,表vendors中有n条记录,那么这两个表的笛卡尔积为m*n条记录。

    如下方式可以产生笛卡尔积

    SELECT p.pro_id, p.vend_id, v.name, v.telephone FROM products p INNER JOIN vendors v;

    内连接

    求两个表的交集,常见的内连接有JOIN, INNER JOIN, WHERE

    以下两种查询方式是等价的

    SELECT * FROM vendors, products WHERE vendors.vend_id=products.vend_id;
    SELECT * FROM vendors inner JOIN products WHERE vendors.vend_id=products.vend_id;

    左连接

    左连接以左表为主,返回包含左表中所有的数据行,对于右表中的某行在左表中没有匹配的行,那么右表将返回NULL

    右连接

    右连接以右表为主,返回包含右表中所有的数据行,对于左表中的某行在右表中没有匹配的行,那么左表将返回NULL

    外连接

    求两个或多个表之间的左连接和右连接的并集

    Mysql不支持外连接,但是可以通过UNION来实现

    当连接表的列采用相同的名称时,可用USING来简化ON语法

    USING(col_name)指定一个属性名来连接两个表,而ON指定一个条件

    在使用SELECT *时,USING会去除USING指定的列,而ON不会。

    建议

    1) 查询两表关联到相等的数据时用内连接

    2) 左表中的关联列是右表中的关联列的子集,则使用右连接

    3) 右表中的关联列是左表中的关联列的子集,则使用左连接

    4) 左右表有交集但是又不互为子集时用全外连接

    5) 求差操作是用联合查询

    参考资料:《Mysql必知必会》

  • 相关阅读:
    2021.11.20 MapReduce实验
    Linux串口应用编程
    Linux系统中的TTY
    69 进程创建的优化设计 上
    71 键盘驱动程序设计(上)
    有关EXPORT_SYMBOL_GPL
    73 键盘驱动程序设计(下)
    72 键盘驱动程序设计(中)
    本地maven打包无法被导入
    java 8 Stream 递归实现树形结构
  • 原文地址:https://www.cnblogs.com/marton/p/11297534.html
Copyright © 2011-2022 走看看