联结表(6)
SQL最强大的功能之一就是能在数据检索查询的执行中联结。
**外键:**外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。
**可伸缩性: **能够适应不断增加的工作量而不失败。设计良好的数据库或者应用程序称之为可伸缩性好。
1、创建联结
SELECT vend_name, prod_name, prod_price
FROM vendors, products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;
可以发现联结表可以实现将连个表的数据合成一个表返回,联结表主要通过 WHERE vendors.vend_id = products.vend_id 语句将讲个表进行联结。
注: 这里的联结所用的向需要用完全限定列名避免出现二义性(vendors.vend_id = products.vend_id)
在创建联结表示时where子句建立联结非常重要,如果没有的话会产生笛卡尔积显现,第一个表中的每个行将与第二个表的每一行进行配对,而不管他们逻辑上是否可以配在一起。
**笛卡尔积: **由没有联结条件的表关系返回的结果为笛卡尔积。检索出的行的数目将是第一个表的行数乘以第二个表的行数。
内部联结
以上介绍的联结称之为等值联结(equijoin),它基于两个表之间的相等测试。这种联结也称之为内部联结。其实这种联结可以使用稍微不同的语法来明确指定联结类型
SELECT vend_name, prod_name, prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;
两个表之间用 INNER JOIN 指定,联结条件用特定得ON子句。
2、高级联结
1.表别名
SELECT Concat(RTrim(vend_name),'(',RTrim(vend_county),')') AS vend_title
FROM vendors
ORDER BY vend_name;
别名除了用于列名和计算字段外,SQL还允许给表名起别名。这样做主要有两个理由
-
缩短SQL语句
-
允许在单条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 = 'TNT'; 在表名后用 AS 语句连接表别名。
2.不同类型的联结
直接所遇到的联结都是称之为内部联结或等值联结的简单联结。现在介绍其他三种联结,自连接,自然联结和外部联结。
自联结
例: 假如你发现某个物品(ID为DTNTR)存在问题,因此你想知道该产品的供应商的其他产品是否也存在同样的问题
我们可以通过子查询来实现
SELECT prod_id, prod_name
FROM products
WHERE vend_id = (SELECT vend_id
FROM products
WHERE prod_id = 'DTNTR');
我们也可以通过自联结完成相同的问题。
SELECT p1.prod_id,p1,prod_name
FROM products AS p1, product AS p2
WHERE p1.vend_id = p2.vend_id
AND p2.prod_id = 'DTNTR';
自然联结
自然联结排除多次出现,使每个列只返回一次。
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 = 'FBI';
事实上我们迄今建立的所有内部联结都是自然联机,并且我们可能永远都用不到不是自然联结的内部联结
外部连接
例:对每一个客户下多少订单进行统计
我们使用内部联结写:
SELECT customer.cust_id, orders.orders.order_num
FROM customer INNER JOIN orders
ON customers.cust_id = orders.cust_id;
我们可以是用外部联结:
SELECT customer.cust_id, orders.orders.order_num
FROM customer LEFT OUTER JOIN orders
ON customers.cust_id = orders.cust_id;
可以发现外部联结与内部联结类似,就是使用的关键词为 OUTER JOIN ,外部联结与内部联结的不同是外部联结返回的数据中还包含没有关联行的行。
注: 是用外部联结的关键词的时候需要在关键词 OUTER JOIN 前使用 RIGHT 或 LEFT 关键词,来指定返回的所有行是左边的表还是右边的表
3、使用带有聚合函数的联结
SELECT customers.cust_name,
customers.cust_id,
COUNT(orders.order_num) AS num_ord
FROM customer INNER JOIN orders
ON customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;
上例将表customer,ordres进行关联,GROUP BY 子句按客户分组数据。及COUNT(orders.order_num)的作用是对每个客户的名单进行计数。