表的复制
创建一张拥有相同表结构的空表(只复制表结构,不复制记录)
CREATE TABLE new_table_name LIKE old_table_name;
创建一张拥有相同表结构、相同记录的表(复制表结构、复制记录)
CREATE TABLE new_table_name AS (SELECT *FROM old_table_name)
多表查询
SELECT *FROM
Products p ,Vendors v
WHERE
p.vend_id = v.vend_id;
查询出9条记录,Products表产品vend_id和Vendors表里面的vend_id相同的地方,都查询出来,相当于查询出交集的部分。交集部分指:查询出的产品肯定有供应商的,查询出的供应商肯定有对应的产品的。外连接分为:左外连接,右外连接
左外链接
SELECT *FROM
Products p LEFT JOIN Vendors v
ON
p.vend_id = v.vend_id;
结果:
查询出9条记录,会把Products表里面的所有记录以及和Vendors表有交集的地方都查询出来。如果Products表里面的vend_id为空的记录也会查询出来,空的记录就是没有交集的区域。当然这个示例中有外键约束,所有的产品都会有对应的供应商。
查询结果 = 交集的部分(上面9条记录) + 产品没有供应商的产品(上面0条记录)
对应的图表是这样的
右链接
SELECT *FROM
Products p RIGHT JOIN Vendors v
ON
p.vend_id = v.vend_id;
结果
查询出12条记录,会把Vendors表和Products交集部分以及Vendors表里面的供应商vend_id没有在Products表里面的记录也查询出来。因为一个供应商可以对应很多个产品,是1对多关系。查询出的数据大于等于Vendors表里面的数据。
查询结果 = 交集的部分(上面9条记录) + 没有提供任何产品的供应商(上面3条记录)
对应的图表是这样的
内连接
在MySQL中 INNER JOIN 、CROSS JOIN 、JOIN他们是等价的,在标准SQL它们是不同的。
SELECT *FROM
Products p JOIN Vendors v
ON
p.vend_id = v.vend_id;
结果:
查询出9条记录,只会查询出符合on条件的。查询结果是交集部分,查询出的产品肯定有供应商的,查询出的供应商肯定有对应的产品的。
对应图表
并集
MySQL不支持标准SQL中的FUll [OUTER] JOIN ,可以使用UNION代替实现。
(SELECT *FROM
Products p LEFT JOIN Vendors v
ON
p.vend_id = v.vend_id) UNION (SELECT *FROM
Products p RIGHT JOIN Vendors v
ON
p.vend_id = v.vend_id);
查询出的结果:
查询出12条数据。
对应图表
分页
SELECT *FROM
Products p RIGHT JOIN Vendors v
ON
p.vend_id = v.vend_id
LIMIT 0,5;
LIMIT offset,pagesize
从第0条记录开始,查询出5条记录。
下面给出了不同结果集对应的SQL示例图表。
多表查询.pdf
蓝色部分表示能够查询出的数据,每个case都有对应的查询语句。