SQL Server 数据库之连接查询
1. 概述
当一个查询需要对多个表进行操作时称为连接查询,包括内连接查询、外连接查询、交叉查询和自连接查询等;
2. 连接查询的结构
多个表连接查询能通过以下两种方式实现:
2.1. 使用单表查询的 SQL 命令,在 FROM子句中指明连接的表名,WHERE子句中指明连接的列名及连接条件;
注意: 当所查询的数据表之间具有同名列时,为了避免二义性,要为它们附加表名前缀加以区分,如 “表名.列名” 例子:从数据表 B,O 中查询就读于 “工商” 的学生,列出 ID 和名字;
select B.ID,Name from B,O where B.ID=O.ID and b=工商
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]]
对上述命令的说明如下:
- INO 表示将查询结果装入新表,<新表名> 即为新表的名称;
- INNER JOIN 称为内连接,用来查询满足连接条件的元组;当 JOIN 关键字钱省略连接方式时,默认为此链接;
- LEFT JOIN 称为左外连接,用来查询左边数据的全部元组和右边数据表满足连接条件的元组,不符合连接条件的数据自动填入 NULL;
- RIGHT JOIN称为右外连接,用来查询右边数据的全部元组和左边数据表满足连接条件的元组,不符合连接条件的数据自动填入NULL;
- FULL JOIN称为全外连接,用于查询左右两边数据表中的所有元组(各只出现一次),不符合连接条件的数据自动填入NULL;
- CROSS JOIN称为交叉连接,用于将两个数据表的元组逐个匹配,生成新的元组;
2. 内连接查询
内连接查询指使用 INNER JOIN关键字查询; 例子:从数据表 B,O 中查询就读于 “工商” 的学生,列出 ID 和名字;
select B.ID,Name from B inner join O on B.ID=O.ID where b=工商
,B.ID=O.ID 为连接条件,ID 为连接字段,当连接字段间的比加运算符为 “=” 时,称为 等值连接 ,其他情况称为 非等值连接;
3. 外连接查询
外连接查询中,参与连接的表具有主次关系,以左外连接为例,查询时会以连接条件左边的数据表为基准,匹配右边的数据表中的数据,符合连接条件的数据直接返回到查询结果中,不符合条件的数据将填入 NULL;右外连接与左外连接相反,全外连接则相当于左外连接与右外连接的数学并集; 例子:查询数据表 B 的所有 课程,并列出 ID
select 课程,O.ID,O.成绩 from O right join B on O.ID=B.ID
4. 交叉查询
使用 CROSS JOIN 关键字查询的是交叉查询,它对连接查询的表没有特殊要求,任意两个数据表都能进行交叉查询操作; 例子:对数据表 B 和数据表 O 进行交叉查询
select * from B cross join O
在 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=张旺
在 FROM子句中使用 AS关键字将数据表 B 分别命名 a,b,在 WHERE子句中对数据表 a,b 中的属性 Age进行比较,并与限制条件用 AND关键字连接,实现一个数据表的自连接查询;