交叉连接
交叉连接(CROSS JOIN)又称笛卡尔积,由第一个表的每一行与第二个表的每一行连接起来后形成的表。
语法格式:
SELECT * FROM table1 CROSS JOIN table 2;
或
SELECT * FROM table 1, table 2;
内连接
在内连接(INNER JOIN)查询中,只有满足查询条件的记录才能出现在结果集中。
内连接使用比较运算符进行表间某些字段值的比较操作,并将与连接条件相匹配的数据行组成新记录,以消除交叉连接中没有意义的数据行。
内连接有两种连接方式:
● 使用INNER JOIN的显示语法结构
语法格式:
SELECT 目标列表达式1, 目标列表达式2,..., 目标列表达式n,
FROM table1 [INNOR] JOIN table2 ON 连接条件
[WHERE 过滤条件]
使用WHERE子句定义连接条件的隐示语法结构
语法格式:
SELECT 目标列表达式1, 目标列表达式2,..., 目标列表达式n,
FROM table1, table2
WHERE连接条件[AND过滤条件]
说明:
(1)目标列表达式:需要检索的列的名称或别名。
(2)table1, table2:进行内连接的表名。
(3)连接条件:连接查询中用来连接两个表的条件,其格式为:
[<表名1.>] <列名1> <比较运算符> [<表名2.>] <列名2>
其中,比较运算符有:<、<=、=、>、>=、!=、<>。
(4)在使用INNER JOIN的连接中,连接条件放在FROM子句的ON子句中,过滤条件放在WHERE子句中。
(5)在使用WHERE子句定义连接条件的连接中,连接条件和过滤条件都放在WHERE子句中。
内连接是系统默认的,可省略INNER关键字。
经常用到的内连接有等值连接与非等值连接、自然连接和自连接等,下面分别介绍。
等值连接与非等值连接
概念:表之间通过比较运算符“=”连接起来,称为等值连接,而使用其它运算符为非等值连接。
自然连接
自然连接在FROM子句中使用关键字NATURAL JOIN,自然连接在目标列中去除相同的字段名。
自连接
将某个表与自身进行连接,称为自表连接或自身连接,简称自连接,使用自连接需要为表指定多个别名,且对所有查询字段的引用必须使用表别名限定。
举例如下。
【例6.25】查询选修了“1201”课程的成绩高于学号为“191002”的成绩的学生姓名。
mysql> SELECT a.cno, a.sno, a.grade
-> FROM score a, score b
-> WHERE a.grade>b.grade AND a.cno='1201' AND b.cno='1201' AND b.sno='191002'
-> ORDER BY a.grade DESC;
或
mysql> SELECT a.cno, a.sno, a.grade
-> FROM score a JOIN score b ON a.grade>b.grade
-> WHERE a.cno='1201' AND b.cno='1201' AND b.sno='191002'
-> ORDER BY a.grade DESC;
该语句实现了自连接,使用自连接时为一个表指定了两个别名。
查询结果:
+-------+----------+--------+
| cno | sno | grade |
+-------+----------+--------+
| 1201 | 191003 | 93 |
| 1201 | 191001 | 92 |
| 1201 | 196004 | 92 |
| 1201 | 196001 | 84 |
+-------+----------+--------+
4 rows in set (0.00 sec)
外连接
在内连接的结果表,只有满足连接条件的行才能作为结果输出。外连接的结果表不但包含满足连接条件的行,还包括相应表中的所有行。外连接有以下2种:
● 左外连接(LEFT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括左表的所有行,当左表有记录而在右表中没有匹配记录时,右表对应列被设置为空值NULL。
● 右外连接(RIGHT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括右表的所有行,当右表有记录而在左表中没有匹配记录时,左表对应列被设置为空值NULL。