MySQL的深入浅出(三)—— 多表查询和子查询

一、多表连接查询

数据表的连接查询比较常用的有内连接和外连接查询两种

1.内连接(指定条件下的笛卡尔积)

内连接有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。

例如:下面的语句3和语句4的结果是相同的。
语句1:隐式的内连接,没有inner join,形成的中间表为两个表的笛卡尔积。

select o.id,o.order_number,c.id,c.name from customers c, orders o wherec.id=o.customer_id;

语句2:显示的内连接,一般称为内连接,有inner join,形成的中间表为两个表经过on条件过滤后的笛卡尔积。

select o.id,o.order_number,c.id,c.name from customers c inner join orders o onc.id=o.customer_id;

这里注意的是on后面其实跟的就是外键约束中相对应的两个列名!

2.外连接

外连接分2种,左连接和右连接;它们用法上一样一样的,查询 逻辑上互为相反;具体语法如下:

SELECT field1,field2,...fieldn from table_name LEFT|RIGHT JOIN join_table ON join_condition;

左连查询和右连查询的区别是,以执行语句中的哪个表为主表, 所谓主表即以主表为准,主表中有的数据才显示, 主表中没有的
数据即使附表中有也不显示在结果中

  • 建议小表拼大表
select c_name,ct_name from commodity inner join commoditytype on c_type=ct_id;
select c_name,ct_name from commoditytype(小表) inner join commodity(大表) on c_type=ct_id;#效率高

一张图看懂 内外 左右连接查询的区别
在这里插入图片描述


二、子查询

连接查询确实能将两张表格同时查询输出,但有是我只是想 用一张表的数据作为条件去查另一张表,我们需要用到子查询了;

  • 单行单例
    我们一起来看下面这条查询语句:
select * from table_a where sal > ( select sal from table_b where name = 'TomCat' ); 

这其实就是一条简单的子查询语句,先从b表中查询出tomcat的
售价,那括号内的查询结果一定是单行单例的一个值了,那么再 通过这个值去查询出售价大于这个值的所有商品;

注意:这里的返回值必须是单行单例的值!

  • 单行多列(应用不多)
    返回结果在内存中构成一个单行多列的数据表,返回单行多列的子查询在实际应用中与返回单行单列的数据类似,只是查询条件可以扩展成多个,用括号把查询条件括起来:
 select * from table_a where (sal,name) = ( select sal,name from table_b where name = 'TomCat' );

先从b表中查询出tomcat的售价,输出的结果有2个列属于单行多 列,分别是售价和名字,那么再通过这两个值去查询和这两个值 相等的所有商品; 注意:这里的返回值和查询的列名顺便必须一致!

  • 单列多行
select * from table_a where sal IN (select sal from table_b;);//查询结果在返回字段结果内的 
select * from table_a where sal NOT IN (select sal from table_b;);//查询结果不在返回字段结果内的
select * from table_a where sal >=ANY (select sal from table_b;);//查询结果在返回字段结果内任意满足 
select * from table_a where sal >=ALL (select sal from table_b;);//查询结果在返回字段结果内全部满足

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值