MySQL 数据库之连接查询

连接查询

1. 概述

当一个查询需要对多个表进行操作时称为连接查询,包括内连接查询、外连接查询、交叉查询和自连接查询等;

2. 连接查询的结构

多个表连接查询能通过以下两种方式实现:

2.1. 使用单表查询的 SQL 命令,在 FROM子句中指明连接的表名,WHERE子句中指明连接的列名及连接条件;

注意: 当所查询的数据表之间具有同名列时,为了避免二义性,要为它们附加表名前缀加以区分,如 “表名.列名”
例子:从数据表 B,O 中查询就读于 “工商” 的学生,列出 ID 和名字;

  	select B.ID,Name
  	from B,O
  	where B.ID=O.ID and b='工商'

20220201

2.2. 使用 JOIN子句,语法格式如下:

SELECT [ALL|DISTINCT] <表名> [[AS] <列别名>] [, N]
[INTO <新表名>]
FROM <表名1> [[AS] <表别名1>]
[INNER|LEFT|RIGHT|FULL|CROSS] JOIN
<表名2> [[AS] <表别名2>]
ON <连接条件>
[WHERE <条件1>]
[GROUP BY <列名1> [HAVING <条件2>]]
[ORDER BY <列名2> [ASC|DESC]]

对上述命令的说明如下:

  1. INO 表示将查询结果装入新表,<新表名> 即为新表的名称;
  2. INNER JOIN 称为内连接,用来查询满足连接条件的元组;当 JOIN 关键字钱省略连接方式时,默认为此链接;
  3. LEFT JOIN 称为左外连接,用来查询左边数据的全部元组和右边数据表满足连接条件的元组,不符合连接条件的数据自动填入 NULL
  4. RIGHT JOIN称为右外连接,用来查询右边数据的全部元组和左边数据表满足连接条件的元组,不符合连接条件的数据自动填入NULL
  5. FULL JOIN称为全外连接,用于查询左右两边数据表中的所有元组(各只出现一次),不符合连接条件的数据自动填入NULL
  6. CROSS JOIN称为交叉连接,用于将两个数据表的元组逐个匹配,生成新的元组;

2. 内连接查询

内连接查询指使用 INNER JOIN关键字查询;
例子:从数据表 B,O 中查询就读于 “工商” 的学生,列出 ID 和名字;

select B.ID,Name
from B inner join O
on B.ID=O.ID
where  b='工商'

20220201
,B.ID=O.ID 为连接条件,ID 为连接字段,当连接字段间的比加运算符为 “=” 时,称为 等值连接 ,其他情况称为 非等值连接

3. 外连接查询

外连接查询中,参与连接的表具有主次关系,以左外连接为例,查询时会以连接条件左边的数据表为基准,匹配右边的数据表中的数据,符合连接条件的数据直接返回到查询结果中,不符合条件的数据将填入 NULL;右外连接与左外连接相反,全外连接则相当于左外连接与右外连接的数学并集;
例子:查询数据表 B 的所有 课程,并列出 ID

select 课程,O.ID,O.成绩
from O
right join B
on O.ID=B.ID

20220201

4. 交叉查询

使用 CROSS JOIN 关键字查询的是交叉查询,它对连接查询的表没有特殊要求,任意两个数据表都能进行交叉查询操作;
例子:对数据表 B 和数据表 O 进行交叉查询

select *
from B cross join O

20220201
FROM子句中使用 CROSS JOIN关键字对数据表 B 和数据表 O 进行交叉查询,所得的结果的行数是两个数据表的成绩,列数是两个数据表列数之和,相当于对这两个数据表做了广义笛卡尔积运算;

5. 自连接查询

对单个数据表也能进行连接查询,在 FROM 子句中定义表别名的方式与自身进行连接,这称为自连接查询
例子:从数据表 B中查询所年龄比“张旺” 大的学生姓名、年龄

select a.Name,a.Age
from B as a,B as b
where a.Age>b.Age and b.Name='张旺'

20220102
FROM子句中使用 AS关键字将数据表 B 分别命名 a,b,在 WHERE子句中对数据表 a,b 中的属性 Age进行比较,并与限制条件用 AND关键字连接,实现一个数据表的自连接查询;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值