【7】mysql数据查询语言DQL(Data Query Language)②

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 * from1, 表2;
select * from1  join2;
select * from1  cross  join2;
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;

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值