对被联结的表使用别名和聚集函数

使用表别名

  • 使用CONTACT联合搜索组合列并且起别名
SELECT
	CONCAT( RTRIM( vend_name ), "(", RTRIM( vend_country ), ")" ) AS vend_title 
FROM
	vendors 
ORDER BY
	vend_name;

image.png
除此之外,MySQL允许给表起别名,其有2个理由:
1.缩短SQL语句
2.允许在单条SELECT语句中多次使用相同的表

SELECT
	cust_name,
	cust_contact 
FROM
	customers AS c,
	orders AS o,
	orderitems AS oi 
WHERE
	c.cust_id = o.cust_id 
	AND oi.order_num = o.order_num 
	AND prod_id = "TNT2";

image.png

注意

表别名不仅能用于WHERE子句,还可以用于SELECT的列表、ORDER BY子句以及语句的其他部分。
表别名只能在查询执行中使用。

使用不同类型的联结

除了内联结还有自联结、自然联结和外部联结3种联结

自联结

自联结可以代替SELECT子查询


  • 通过查询某个商品获得其制造商,再查询其制造商ID获得该制造商所制造的所有产品
    1.通过SELECT子查询
SELECT
	prod_id,
	prod_name 
FROM
	products 
WHERE
	vend_id =(
	SELECT
		vend_id 
	FROM
		products 
	WHERE
	prod_id = "DTNTR" 
	);

image.png
2.使用自联结查询

SELECT
	p1.prod_id,
	p1.prod_name 
FROM
	products AS p1,
	products AS p2 
WHERE
	p1.vend_id = p2.vend_id 
	AND p2.prod_id = "DTNTR";

注意因为是查询vend_id所以,WHERE的条件有VEND_ID

用自联结而不用子查询

自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句,其处理速度往往比处理子查询快得多。

自然联结

自然联结排除多次出现,使每个列只返回一次,一般是通过SELECT *,对所有其他表的列使用明确的子集来完成的

SELECT
	c.*,
	o.order_num,
	o.order_date,
	oi.prod_id,
	oi.quantity,
	oi.item_price 
FROM
	customers AS c,
	orders AS o,
	orderitems AS oi 
WHERE
	c.cust_id = o.cust_id 
	AND oi.order_num = o.order_num 
	AND prod_id = "FB";

通配符支队第一个表使用,其他列明确给出,所以没有重复的列被检索出来
image.png
事实上,迄今为止我们建立的每个内部联结都是自然联结,也基本不会用到不是自然联结的内部联结

外部联结 LEFT (OUTER) JOIN

将表中的行与另一个表中的行相关联,包含哪些没有关联的行,称为外部联结


  • 检索所有客户订单信息,包含没有订单的客户
SELECT
	customers.cust_id,
	orders.order_num 
FROM
	customers
	LEFT OUTER JOIN orders ON customers.cust_id = orders.cust_id;

其中outer可以不写,即简写为LEFT JOIN
image.png

LEFT RIGHT

在使用OUTER JOIN语法时,必须使用RIGHT或LEFT关键字指定包括其所有行的表
LEFT表示左边表中所有的行,RIGHT表示有表的表中选择所有的行
左外部联结和右外部联结其唯一差别时所关联的表的顺序不同,左外部联结可通过颠倒FROM或WHERE子句中表的顺序转换为右外部联结。具体使用哪种联结纯粹是根据个人喜好和方便而定

注意

MySQL不支持简化字符*=和=*的使用,虽然这2种操作符在其他DBMS种很流行

使用带聚集函数的联结

聚集函数用来汇总数据,其也可以与联结一起使用。

SELECT
	customers.cust_name,
	customers.cust_id,
	COUNT( orders.order_num ) AS num_ord 
FROM
	customers
	INNER JOIN orders ON customers.cust_id = orders.cust_id 
GROUP BY
	customers.cust_id;

image.png

使用联结和联结条件

  • 一般使用内部联结,但使用外部联结也是有效的
  • 保证正确的联结条件,否则将返回不正确的数据
  • 提供联结条件,否则会返回笛卡尔乘积
  • 联结中可以包含多个表,对于每个联结也可以采用不同的联结类型。但应该在联结一起时注意分别测试每个联结,方便排出故障

这个家伙很懒,啥也没有留下😋