1. 连接查询
1.1 基本概念
就是将两个或两个以上的表,“连接起来”,当做一个数据源,并从中去取得所需要的数据;
如何连接?
将每一个表的每一行数据两两之间相互对接起来,每次对接的结果都是连接结果的“一行”数据;
上图所示是一种没有条件的连接。有四种形式的写法:
SELECT * from join1,join2;
SELECT * from join1 JOIN join2;
SELECT * from join1 CROSS JOIN join2;
#mysql中 inner join(内连接)在没有条件的情况下,结果集和交叉连接一样
SELECT * from join1 INNER JOIN join2;
其实他们都叫做“交叉连接”;就是没有条件的连接——全部连接起来了。
1.2 连接基本形式:
基本形式为:
表1 【连接形式】 join 表2 【on 连接条件】;
如果是3个表,则进一步扩展为:
表1 【连接形式】 join 表2 【on 连接条件】 【连接形式】 join 表3 【on 连接条件】
更多表,依此类推;
1.3 连接分类
1.3.1 交叉连接
交叉连接就是没有条件的连接,也叫“笛卡尔积”,表1(m列,x行),表2(n列,y行),则交叉连接后的结果为( m+n) 列,(x*y)行。
有三种形式:
select * from 表1, 表2;
select * from 表1 join 表2;
select * from 表1 cross join 表2;
1.3.2 内连接
select * from 表1 【inner】 join 表2 on 连接条件;
在图中的产品表和产品类别表通过内连接显示每个产品的产品类别名:
SELECT * from product INNER JOIN product_type on product.protype_id = product_type.protype_id;
1.3.3 左【外】连接
表1(左表) left 【outer】 join 表2(右表) on 连接条件
SELECT * from product LEFT OUTER JOIN product_type on product.protype_id = product_type.protype_id;
左连接结果集 = 内连接结果集 + 左表不符合内连接条件的数据集
1.3.4 右【外】连接
表1(左表) right【outer】 join 表2(右表) on 连接条件
SELECT * from product RIGHT OUTER JOIN product_type on product.protype_id = product_type.protype_id;
右连接结果集 = 内连接结果集 + 右表不符合内连接条件的数据集
所以左连接,左表的数据会全部取出,右连接,右表数据会全部取出。
1.3.5 全【外】连接
表1 full 【outter】 join 表2
很遗憾 mysql 不支持全连接!只能通过 union 查询达到相同的效果。
#union查询来达到全连接效果
SELECT * from product LEFT OUTER JOIN product_type on product.protype_id = product_type.protype_id
UNION
SELECT * from product RIGHT OUTER JOIN product_type on product.protype_id = product_type.protype_id;
2.子查询
子查询,就是在一个查询语句(select语句)中的内部,某些位置,又出现的“查询语句”。
则有两个概念:”主查询”和“子查询”,
通常,子查询是为主查询服务的,而,通常,都是子查询获得一定的结果数据之后,才去执行主查询。
子查询通常可以有这样的形式:
selelct 字段或表达式或子查询 [as 别名] from 表名或链接结果或子查询 where 字段或表达式或子查询的条件判断
SELECT * from product WHERE price > 10000;
变成:
#变成了子查询的形式
SELECT * from product WHERE price > (SELECT 10000);
#查询所有大于平均价格的产品
SELECT * from product WHERE price > (SELECT AVG(price) FROM product) ;
#查询最高价的商品
select * from product where price = (select max(price) from product );
#查询类别名称中带有“电”字的商品
select * from product where protype_id in(
select protype_id from product_type where protype_name like ‘%电%’
);
3.联合查询
select 语句1
union [all | distinct]
select 语句2
…
order by xx;
将两个具有相同字段数量的查询语句的结果,以”上下堆叠“的方式,合并为一个查询结果。
注意:
1.联合查询默认是all;
2.联合查询中 select语句查询结果的字段数目必须一致;
3.联合查询中 select语句最好字段类型一致;
4.联合查询结果集的字段名以第一个select语句为准。
5.order by是指对联合查询最后的结果集排序。
SELECT id as mid, f1 as mf1, f2 as mf2 from join1
UNION
SELECT * from join2
ORDER BY mid DESC;