一、多表连接查询
数据表的连接查询比较常用的有内连接和外连接查询两种
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;);//查询结果在返回字段结果内全部满足