二、SQL学习之多表查询

内连接包括等值连接和自连接

自身连接:一个表与其自己进行连接

需要给表起别名以示区别
由于所有属性名都是同名属性,因此必须使用别名前缀

等值连接就是连接运算符为=

自然连接(Natural join)是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组(属性名必须相同,),并且在结果中把重复的属性列去掉。而等值连接并不去掉重复的属性列。

连接操作的执行过程


一、标量子查询:只返回一行一列(相当于一个常数)

--查询价格大于奶茶的商品
1.查询奶茶的价格-------------15 
SELECT m.sale_price FROM milk_tea AS m WHERE m.prod_name='奶茶';
2.查询大于奶茶的价格  >15
SELECT m.prod_name,m.sale_price FROM milk_tea AS m WHERE m.sale_price>15;

合成一个语句--多表查询 把1的语句用()包起来放在>后面  ps:1语句必须只返回一个单元格 即SELECT后面只能有一个列
SELECT m.prod_name,m.sale_price 
FROM milk_tea AS m 
WHERE m.sale_price>(
		SELECT m.sale_price 
		FROM milk_tea AS m 
		WHERE m.prod_name='奶茶');

二、关联子查询(组内比较):返回一列-----为表起两个别名,在子查询中加入where p.class=p2.class

1.求出每种类别的均价
SELECT AVG(p.sale_price) FROM prod_info AS p  WHERE p.class='日用品' GROUP BY p.class;
2.每种类别大于均价的商品
SELECT *
FROM prod_info AS p2 
WHERE p2.sale_price>(
                   SELECT AVG(p.sale_price) 
                   FROM prod_info AS p  
                   WHERE p.class=p2.class
                   GROUP BY p.class
                   ); 

 

三、普通子查询-----子查询返回一列数据:

(1)将子查询的结果列,作为主查询的取值范围IN

(2)将子查询的结果作为table表,放在FROM之后

(1)将子查询的结果列,作为子查询的取值范围IN

1.查询各种种类的薯片名称
SELECT p.prod_name FROM prod_info AS p WHERE p.prod_name LIKE '%薯片';

2.查询每种薯片的订单--例如原味薯片
SELECT o.prodname,SUM(o.quantity) FROM order_list AS o WHERE o.prodname='原味薯片';

合二为一:查询每种味道的薯条的订单
SELECT o.prodname,o.quantity FROM order_list AS o WHERE o.prodname IN('原味薯片','黄瓜味薯片','番茄味薯片')

发现存在多个订单,使用groupby对每个种类进行SUM聚合
SELECT o.prodname,SUM(o.quantity) FROM order_list AS o WHERE o.prodname IN('原味薯片','黄瓜味薯片','番茄味薯片') GROUP BY o.prodname;


SELECT o.prodname,SUM(o.quantity) 
FROM order_list AS o 
WHERE o.prodname IN(
		SELECT p.prod_name 
		FROM prod_info AS p 
		WHERE p.prod_name LIKE '%薯片') 
                    GROUP BY o.prodname;

将上述语句结合

(2)将子查询的结果作为table表,放在FROM之后 

SELECT * FROM prod_info AS p WHERE p.prod_name='抽纸';
把上一个语句的查询结果作为一个表b
SELECT * FROM (SELECT * FROM prod_info AS p WHERE p.prod_name='抽纸') AS b WHERE b.cost<20;

 四、内部联结------所有参与的表必须有共同的列(返回结果是共同列重复的行)

内部连接(等值联接)

这是最常用到的一种联接,但实现这种功能需要借助外键的帮助。

此外,内联接的标准写法为

select *

from SC inner join Student

on SC.StuID = Student.StuID;

将SC和Student两张表进行内部联接,实际上,它是以筛选的形式达到此效果的,即将笛卡尔积的结果,添加筛选条件,即保留笛卡尔积结果中满足SC.StuID = Student.StuID的行得到的结果即为内部联接的结果。

通过内部联接,可以将对一张表中的信息进行扩展,从而达到我们想要的查询目的。

自然连接(Natural join)是一种特殊的等值连接,它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉。而等值连接并不去掉重复的属性列。

定义:自然连接是关系R和S在所有公共属性(common attribute)上的等接(Equijoin)。但在得到的结果中公共属性只保留一次,其余删除。

下面我们看一下内联结的优势

 

 五、自联结----必须是同一张表

自连接

有些情况下,需要联接自己才能完成相关的查询操作,此时的联接被称为自连接,此时联接的两张表为,自己和自己,为了避免混淆,需要使用别名进行区分。比如:

select *

from products as p1,products as p2

where p1.ID = p2.ID

六、外部联结 ------所有参与的表必须有共同的列(返回结果包括无关联的行)

left joinleft outer join 的简写

SELECT c.cust_id,o.quantity
FROM cust_info AS c LEFT JOIN order_list AS o
ON c.cust_id=o.cust_id
AND o.order_id LIKE '20190401%';

七、表联结---再联结中使用聚集函数

1.
SELECT l.cust_id,COUNT(l.prod_id)
FROM (SELECT c.cust_id,o.prod_id
FROM cust_info AS c LEFT JOIN order_list AS o
ON c.cust_id=o.cust_id
AND o.order_id LIKE '20190401%') AS l
GROUP BY l.cust_id;
2.   1.和2.的查询结果相同
SELECT c.cust_id,COUNT(o.prod_id)
FROM cust_info AS c LEFT JOIN order_list AS o
ON c.cust_id=o.cust_id
AND o.order_id LIKE '20190401%'
GROUP BY c.cust_id;

八、组合查询 ------UNION------连接的两个表要有相同的字段名,即每个Select子句查询的列名相同

UNION 去重
SELECT * FROM order_list AS o WHERE o.order_id LIKE '20190407%'
UNION
SELECT * FROM order_list AS o WHERE o.order_id LIKE '20190407%'

UNION ALL不去重
SELECT * FROM order_list AS o WHERE o.order_id LIKE '20190407%'
UNION ALL
SELECT * FROM order_list AS o WHERE o.order_id LIKE '20190407%'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值