Mysql学习-Mysql查询(4)

4.连接查询

连接是关系型数据库模型的主要特点;连接查询是关系数据库中最主要的查询,主要包括内连接,外
连接等.通过连接运算可以实现多个表查询.在关系数据库管理系统中,表建立时各数据之间的关系
不必确定,常把一个实体的所有信息存放在一个表中,当查询数据时,通过连接操作査询出存放在多
个表中的不同实体的信息,.当两个或多个表中存在相同意义的字段时,便可以通过这些字段对不同的
表进行连接查询.

(1)内连接查询

在内连接查询中,只有满足条件的记录才能出现在结果关系中

//从fruits表中查询f_name,f_price字段,从suppliers表中查询s_id,s_name
SELECT suppliers.s_id,s name,f_name,f_price
FROM fruits,suppliers
WHERE fruits.s_id=suppliers.s_id;

在这里,SELECT语句与前面所介绍的一个最大的差别是:SELECT后面指定的列分别属于两个不同的表,同时FROM子句列出了两个表fruits和suppliers.WHERE子句在这里作为过滤条件,指明只有两
个表中sid字段值相等的时候才符合连接查询的条件.
从返回的结果可以看到,显示的记录是由两个表中的不同列值组成的新纪录
注意:因为fruits表和suppliers表中有相同的字段s_id,因此在比较的时候完全限定表名(格式为“表
名.列名"),如果只给出s id,MySQL将不知道指的是哪一个,并返回错误信息.

下面的内连接查询语句返回与前面完全相同的结果。

//在fruits表和suppliers表之间,使用INNER JOIN 语法进行内连接查询
SELECT suppliers.s_id,s_name,f_name,f_price
FROM fruits INNER JOIN suppliers
ON fruits.s_id=suppliers.s_id;

在这里的查询语句中,两个表之间的关系通过INNER JOIN指定,使用这种语法的时候,连接的条件
使用ON子句而不是WHERE,ON和WHERE后面指定的条件相同.
注意:使用WHERE子句定义连接条件比较简单明了,而INNER JOIN语法是ANSI SQL的标准规
范,使用INNER JOIN连接语法能够确保不会忘记连接条件,而且WHERE子句在某些时候会影响
查询的性能.

如果在一个连接查询中,涉及的两个表都是同一个表,这种查询称为自连接查询.自连接是一种特殊
的内连接,它是指相互连接的表在物理上为同一张表,但可以在逻辑上分为两张表

//查询f id='a1'的水果供应商提供的水果种类
SELECT f1.f_id,f1.f_name
FROM fruits AS f1,fruits AS f2
WHERE f1.s_id=f2.s_id AND f2.f_id='a1';

此处查询的两个表是相同的表,为了防止产生二义性,对表使用了别名,fruits表第一次出现的别名为
f1,第二次出现的别名为f2,使用SELECT语句返回列表时明确支出返回以f1为前缀的列的名,WHERE连接两个表,并按照第2个表的f_id对数据进行过滤,返回所需数据

(2)外连接查询

外连接查询将查询多个表中相关联的行,内连接时,返回查询结果集合中仅是符合查询条件和连接条
件的行.有时候需要包含没有关联的行中数据,即返回查询结果集合中不仅包含符合连接条件的行
还包含左表(左外连接或左连接),右表(右外连接或右连接)或两个边接表(全外连接)中的所有数据
行.

外连接分为左外连接或左连接和右外连接或右连接;
LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录
RIGHT JOIN(右连接):返回包括右表中的所有记录和左表中连接字段相等的记录

1)LEFT JOIN连接

左连接的结果包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行,如果左
表的某行在右表中没有匹配行,则在相关联的结果行中,右表的所有选择列表列均为空值

//在customers表和orders表中,查询所有客户,包括没有订单的客户
SELECT customers.c_id,orders.o_num
FROM customers LEFT OUTER JOIN orders
ON customers.c_id=orders.c_id;

2)RIGHT JOIN右连接

右连接是左连接的反向连接,将返回右表的所有行,如果右表的某行在左表中没有匹配行,左表将返
回空值.

//在customers表和orders表中,查询所有订单,包括没有客户的订单
SELECT customers.c_id,orders.o_num
FROM customers RIGHT OUTER JOIN orders
ON customers.c_id=orders.c_id;

内连接,左连接,右连接如图所示:

左连接(LEFT JOIN 或 LEFT OUTER JOIN)和右连接(RIGHT JOIN 或 RIGHT OUTER JOIN)
在 SQL 中用于结合两个或多个表的数据,但它们之间存在明显的区别。以下是左连接和右连接之
间的主要区别:
1.保留的行
LEFT JOIN(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录
RIGHT JOIN(右连接):返回包括右表中的所有记录和左表中连接字段相等的记录,
2.使用场景
在实际应用中,左连接比右连接更为常见。这主要是因为左连接更直观地反映了“主表”与
“详情表”之间的关系。
右连接在某些特定场景下可能有用,但通常不如左连接直观。在某些数据库设计或查询需求
中,可能需要使用右连接,但这种情况相对较少。
可替代性
虽然左连接和右连接在功能上是不同的,但你可以通过调整查询的结构和表的顺序来用左连
接替代右连接,反之亦然。例如,如果你有一个右连接查询,你可以通过交换两个表的顺序
并使用左连接来得到相同的结果。(如下面的例子)

例如:

SELECT customers.c_id,orders.o_num
FROM customers RIGHT OUTER JOIN orders
ON customers.c_id=orders.c_id;
改为:
SELECT customers.c_id,orders.o_num
FROM orders LEFT OUTER JOIN customers
ON customers.c_id=orders.c_id

结果是相同的

(3)复合条件连接查询
复合条件连接查询是在连接查询的过程中,通过添加过滤条件限制查询的结果,使查询的结果更加准
确.

//在customers表和orders表中,使用INNER JOIN语法査询customers表中ID为10001的客
//户的订单信息;
SELECT customers.c_id,orders.o_num
FROM customers INNER JOIN orders
ON customers.c_id=orders.c_id AND customers.c_id = 10001;

结果显示,在连接査询时指定査询客户ID为10001的订单信息,添加了过滤条件之后返回的结果将会
变少,因此返回结果只有两条记录


使用连接查询,并对查询的结果进行排序,

//在fruits表和suppliers表之间,使用INNER JOIN语法进行内连接查询,并对查询结果排序;
SELECT suppliers.s_id,s_name,f_name,f_price
FROM fruitS INNER JOIN suppliers
ON fruits.s_id=suppliers.s_id
ORDER BY fruits.s_id;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值