表的复制

  • 创建一张拥有相同表结构的空表(只复制表结构,不复制记录)

    1. CREATE TABLE new_table_name LIKE old_table_name;
  • 创建一张拥有相同表结构、相同记录的表(复制表结构、复制记录)

    1. CREATE TABLE new_table_name AS (SELECT *FROM old_table_name)

    多表查询

    1. SELECT *FROM
    2. Products p ,Vendors v
    3. WHERE
    4. p.vend_id = v.vend_id;

    image.png
    查询出9条记录,Products表产品vend_id和Vendors表里面的vend_id相同的地方,都查询出来,相当于查询出交集的部分。交集部分指:查询出的产品肯定有供应商的,查询出的供应商肯定有对应的产品的。

    外连接分为:左外连接,右外连接

    左外链接

    1. SELECT *FROM
    2. Products p LEFT JOIN Vendors v
    3. ON
    4. p.vend_id = v.vend_id;

    结果:
    image.png
    查询出9条记录,会把Products表里面的所有记录以及和Vendors表有交集的地方都查询出来。如果Products表里面的vend_id为空的记录也会查询出来,空的记录就是没有交集的区域。当然这个示例中有外键约束,所有的产品都会有对应的供应商。
    查询结果 = 交集的部分(上面9条记录) + 产品没有供应商的产品(上面0条记录)

对应的图表是这样的
image.png

右链接

  1. SELECT *FROM
  2. Products p RIGHT JOIN Vendors v
  3. ON
  4. p.vend_id = v.vend_id;

结果
image.png
查询出12条记录,会把Vendors表和Products交集部分以及Vendors表里面的供应商vend_id没有在Products表里面的记录也查询出来。因为一个供应商可以对应很多个产品,是1对多关系。查询出的数据大于等于Vendors表里面的数据。
查询结果 = 交集的部分(上面9条记录) + 没有提供任何产品的供应商(上面3条记录)
对应的图表是这样的
image.png

内连接

在MySQL中 INNER JOIN 、CROSS JOIN 、JOIN他们是等价的,在标准SQL它们是不同的。

  1. SELECT *FROM
  2. Products p JOIN Vendors v
  3. ON
  4. p.vend_id = v.vend_id;

结果:
image.png
查询出9条记录,只会查询出符合on条件的。查询结果是交集部分,查询出的产品肯定有供应商的,查询出的供应商肯定有对应的产品的。
对应图表
image.png

并集

MySQL不支持标准SQL中的FUll [OUTER] JOIN ,可以使用UNION代替实现。

  1. (SELECT *FROM
  2. Products p LEFT JOIN Vendors v
  3. ON
  4. p.vend_id = v.vend_id) UNION (SELECT *FROM
  5. Products p RIGHT JOIN Vendors v
  6. ON
  7. p.vend_id = v.vend_id);

查询出的结果:
image.png
查询出12条数据。
对应图表
image.png

分页

  1. SELECT *FROM
  2. Products p RIGHT JOIN Vendors v
  3. ON
  4. p.vend_id = v.vend_id
  5. LIMIT 0,5;

LIMIT offset,pagesize
从第0条记录开始,查询出5条记录。

下面给出了不同结果集对应的SQL示例图表。
多表查询.pdf
蓝色部分表示能够查询出的数据,每个case都有对应的查询语句。