MySQL——链表

主键:非空 唯一(针对整列数据而言) 为了方便管理一般主键都是设置为自增
外键:一张表中的一列的值是另一张表的主键,使用外键建立两张数据表的数据关系

一、两张表连接

将两张表格拼接成一个表

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嵌套多表查询 #了解

数据表别名

好处 :

  1. 简化 SQL 语句
  2. 方便在同一 SELECT 语句下反复进行表的调用

三、外联

可以将表设置别名,在链表时使用

强制使用数据列

格式:select 列A列B from 表A RIGHT OUTER JOIN 表B ON 表A列A=表B列A #没有值显示为unll /有数据直接消失

RIGHT OUTER 右边的表强制

LEFT OUTER 左边的表强制


【数据库内、外、左、右连接详解 - CSDN App 】 http://t.csdnimg.cn/ILTsghttp://t.csdnimg.cn/ILTsg
使用联表条件的注意事项:

  1. 注意选择正确的联表方式,大部分情况下,我们要做的都是内联,但是偶尔也会有外联适用的情况
  2. 注意连表查询时使用的字段(列),否则可返回错误的数据
  3. 确保提供了正确的联表条件,否则会得到一个笛卡尔积
  4. 在实践中,联表查询时可能使用多种联表方式。虽然这样写是完全没问题的,但是为了避免数据调
    试等麻烦,建议先单独测试每一个联表的操作。

四、练习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 ordertotal
 from 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_email
 from customers as c, orderitems as oi,orders as o 
where oi.order_num = o.order_num and  o.cust_id = c.cust_id
 and 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;
相关推荐
Cikiss19 分钟前
微服务实战——平台属性
java·数据库·后端·微服务
小小不董33 分钟前
《Linux从小白到高手》理论篇:深入理解Linux的网络管理
linux·运维·服务器·数据库·php·dba
无敌少年小旋风1 小时前
MySQL 内部优化特性:索引下推
数据库·mysql
柒小毓1 小时前
将excel导入SQL数据库
数据库
bug菌¹1 小时前
滚雪球学Oracle[2.5讲]:数据库初始化配置
数据库·oracle·数据库初始化·初始化配置
一休哥助手1 小时前
Redis 五种数据类型及底层数据结构详解
数据结构·数据库·redis
翔云1234561 小时前
MVCC(多版本并发控制)
数据库·mysql
代码敲上天.2 小时前
数据库语句优化
android·数据库·adb
盒马盒马2 小时前
Redis:zset类型
数据库·redis
静听山水2 小时前
mysql语句执行过程
数据库·mysql