数据库-联结
联结是利用SQL的SELECT
能执行的最重要操作
创建联结
利用WHERE
子句来将两个表正确的联结,来创建联结。
例如:
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products
WHERE Vendors.vend_id = Products.vend_id;
利用这段语句将返回两个不同表中的值。
WHERE子句的重要性
这里我就不得不提到WHERE
语句的重要性。
因为在联结查询中最重要的就是where
子句,只有利用WHERE
子句才能将两个表联结起来,为何要用WHERE
子句联结,其实也很好理解,要记住,在一条SELECT
语句中联结几个表时,相应的关系是在语句执行的时候构造的。在数据库表中的定义没有指示DBMS如何对表进行联结的内容。你必须自己来完成这件事情的操作。
在联结两个表的时候,实际要做的是将第一个表中的每一行和第二个表中的每一行相对应。WHERE
子句作为过滤每一行的存在,只包含联结的条件的行。没有WHERE
子句,那将乱套,第一个表中的每一行和第二个表中的每一行配对,而不管他们逻辑上是否能配在一起。
例如:
SELECT vend_name, prod_name, prod_price
FROM Vendors, Products;
在你的数据库中输入这段语句,你就会发现输出了一堆你用不上的东西,很乱,而它实际上是将第一个表中的每一行和第二个表的每一行都匹配了一遍并输出出来,也就是说第一个表中存在多少行数据就将写出多少编数据,因为他将每一行都匹配了一遍并输出出来。
内联接
我们从开始到现在其实一直都是等值连接,也称内联接,它基于两个表之间相等的测试。其实我们可以对这种联结使用稍微不同的语法,明确制定联结的类型。 例如:
SELECT vend_name, prod_name, prod_price
FROM Vendors
INNER JOIN Products ON Vendors.vend_id = Products.vend_id;
这种语句也称内联接,它并没用用WHERE
子句,利用联结条件INNER JOIN
特定的ON
子句,传递给ON
的实际条件与传递给WHERE
的相同。
利用表的别名来创建联结
同样AS
关键字不仅仅能给列起别名,也可以给表起别名。
例如:
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 = 'RGAN01';
这样就可以利用表的别名来给表创建联结。
自联结
自联结就是利用别名查询来实现自己跟自己联结
外联结
左外联结
类似于上节课讲的内联接,形式差不多,我们拿例子来讲解:
SELECT Customers.cust_id, Orders.order_num
FROM Customers
LEFT OUTER JOIN Orders ON Customers.cust_id = Orders.cust_id;
这段代码的输出为:
cust_id | order_num
1000000001 | 20005
1000000001 | 20009
1000000002 | NULL
1000000003 | 20006
1000000004 | 20007
1000000005 | 20008
这段语句将左外联结,完美解释了,简单来讲就是LEFT OUTER JOIN
将FROM
子句后的表中选择所有行跟LEFT OUTER JOIN
后的表中所有行做对比,以FROM
后的表为基准,LEFT OUTER JOIN
后没有的行填充为NULL
然后按指定列输出显示。
右外联结
当然右外联结和左外联结是差不多的,只是取值的相反而已,没有什么太大差别,两个外联结也可以通过FROM
后的表名和OUTER JOIN
后的表名进行调换,用的话,看你心情来选择用哪个。
SELECT Customers.cust_id, Orders.order_num
FROM Customers
RIGHT OUTER JOIN Orders ON Customers.cust_id = Orders.cust_id;
全外联结
我们既然有左右外联结,那就一定有全外联结,就是说以两边为基准,只要是其中一个表中的一行没有对应的数值,我们就应当将其填充其为NULL
。
SELECT Customers.cust_id, Orders.order_num
FROM Customers
FULL OUTER JOIN Orders ON Customers.cust_id = Orders.cust_id;
不管是什么联结,我们在语句中都可以随心使用聚集函数,用来求出我们想要的字段。