一、两张表连接
将两张表格拼接成一个表
1、格式:select 列A,列B from 表A,表 where 表A.列C=表B.列C
2、格式:select 列A,列B from 表A inner join表B on 表A.列C=表B.列C #效率不高
二、多表连接
三张表相连ABC AC没有相同的列名
***格式:select 表A。列a,表C。列b from 表A,表B,表C where 表A列A=表B列A and 表B列B=表C列C ;
格式2 #了解
格式3嵌套多表查询 #了解
数据表别名
三、外联
可以将表设置别名,在链表时使用
强制使用数据列
格式:select 列A列B from 表A RIGHT OUTER JOIN 表B ON 表A列A=表B列A #没有值显示为unll /有数据直接消失
RIGHT OUTER 右边的表强制
LEFT OUTER 左边的表强制
全外连接:
也称联合查询,用来合并查询结果可以合并同一张的表的查询记录(不同表的查询记录也可合并要求查询时,多个select语句查询表头个数必须一样UNION关键字默认去重,可以使用UNI0N ALL包含重复项
格式:
(SELECT语句) UNION (SELECT语句); 去重
(SELECT语句) UNION ALL (SELECT语句); 不去重
四、练习1
1.编写一条 5OL语句,从数据库中返回客户名称(cust name)订单表中的客户表和相关订单号(order num),并按客户名称和订单号对结果进行排序。实际上,请尝试两次:一次使用简单的等连接语法,然后使用INNER JOIN
select o.order_num,c.cust_name from customers as c,orders as o where c.cust_id = o.cust_id order by c.cust_name,o.order_num ;select o.order_num,c.cust_name from customers as c inner join orders as o on c.cust_id = o.cust_id order by c.cust_name,o.order_num ;
2.让我们让之前的挑战变得更有用。除了返回客户名称和订单号 添加名为0rderTotal的第三列,其中包含每个订单的总价格。有两种方法可以执行此操作:您可以使用0rderitems表上的子查询创建OrderTotal列,或者可以将Orderltems表连接至现有表并使用坚合匪数。
这里有一个提示:请注意需要使用完全限定列名的地方。
select o.order_num,c.cust_name,oi.quantity * oi.item_price as ordertotalfrom customers as c
inner join orders as o on c.cust_id = o.cust_id inner join orderitems as oi on oi.order_num = o.order_num
order by c.cust_name,o.order_num ;select c.cust_name,o.order_num,
( select sum( oi.quantity * oi.item_price )
from orderitems as oi where 0.order_num = oi order_num group by oi.order_num ) as ordertotal
from customers as c,orders as o where c.cust_id = o.cust_id;
3.让我们回顾第 14 章中的挑战 2,编写一条 SQL语句来检索订购产品 BR01 的日期,但这次使用联接和简单的等值联接语法。输出应该与第 14 章挑战中的输出相同。
select o.order_date from orders as o, orderitems as oi where o.order_num = oi.order_num and oi.prod_id = 'ANV01';
4.那很有趣,让我们再试一次。重新创建您为第 14 章中的挑战3编写的 SQL,但这次使用ANSI INNER JOIN语法。您在那里编写的代码使用了两个嵌套子查询。要重新创建它,您需要两个INNER JOIN语句 ,每个语句的格式都类似于本章前面的INNERJOIN示例。并且不要忘记按 prod_id 过滤的WHERE子句。
select c.cust_emailfrom customers as c, orderitems as oi,orders as o
where oi.order_num = o.order_num and o.cust_id = c.cust_idand oi.prod_id = 'ANV01';
5.另外 ,为了让事情变得更有趣,我门将混合连接、聚合匪数,以及分组。准备好?回型第 13 章,我要求你找到所有值为 1000 或以上的订单号。这些结果很有用,但更有用的是下了至少该金额订单的客户的姓名。因此,编写一条SQL语句,使用联接从Customers表中返回客户名称(cust_name),并从Orderltems表中返回每个订单的总价格。这里有一个提示:要连接这些表,您还需要包含0rders表(因为Customers与Orderltems不直接相关,Customers与Orders相关,而Orders与0rderltems相关)不要忘记GROUPBY和HAMNG,并确保按客户名称对结果进行排序。您可以为此使用简单的等值连接或 ANSI INNER JOIN语法。或者,如果你有勇气,可以尝试用两种方式写。
select c.cust_name,sum(oi.quantity * oi.item_price) as 订单金额
from customers as c, orderitems as oi,orders as o
where oi.order_num = o.order_num and o.cust_id = c.cust_id
group by oi.order_num having 订单金额 < 1000;
五、练习2
1.使用INNERJOIN编写一条 SOL 语句来检索客户名称(cust_name in客户)以及每个订单的所有订单号(订单中的order num )
select c.cust_name,o.order_num from customers as c,orders as o
where o.cust_id = c.cust_id ;
2.修改您刚刚创建的 SOL 语句以列出所有客户,甚至是那些没有客户的客户命令。
select c.cust_name,o.order_num from orders as o
RIGHT OUTER JOIN customers as c
on o.cust_id = c.cust_id ;
3.使用OUTER JOIN连接Products和Orderitems表,并返回与每个表关联的产品名称(prod name)和订单号(order num)的排序列表。
select p.prod_name,oi.order_num from orderitems as oi
RIGHT OUTER JOIN products as p
on p.prod_id = oi.prod_id
order by oi.order_num;
4.修改在上一个挑战中创建的 SOL语句,使其返回每个商品的订单总数(而不是订单号)。
select p.prod_name,oi.quantity from orderitems as oi
RIGHT OUTER JOIN products as p
on p.prod_id = oi.prod_id
order by oi.quantity;
5.编写一条 SOL语句,列出供应商(Vendors中的vend id )以及他们拥有的产品数量,包括没有产品的供应商。您将需要使用OUTER JOIN和COUNT()聚合函数来计算Products表中每个产品的产品数量。注意:vend id列出现在多个表中,因此每次引用它时,都需要对其进行完全限定。
select v.vend_id,count(p.prod_id) as total_offer
from vendors as v LEFT OUTER JOIN products as p ON v.vend_id = p.vend_id group by v.vend_id;