连接表
连接
- 连接用于检索存储在多个表中的数据
- 连接是一种机制,用来在一条SELECT 语句中关联表,可连接多个表返回一组输出
内连接(等值连接)
- 基于两个表之间的相等测试,称为内连接(inter join)或等值连接(equijoin)
-- ANSI规范首选 INTER JOIN 语法
SELECT column_name1,column_name2,column_name3
FROM table1 INTER JOIN table2 INTER JOIN table3
ON table1.column_name1 = table2.column_name1;
-- 简单的等值语法
SELECT column_name1,column_name2,column_name3
FROM table1,table2
WHERE table1.column_name1 = table2.column_name1;
- 通过WHERE 子句实现表的连接
- 在连接两个表时,实际是将第一个表中的每一行与第二个表中的每一行进行配对
- 引用的列可能出现歧义时,必须使用完全限定列名
- SQL 不限制一条SELECT 语句中可以连接表的数目,但连接的表越多,性能就下降得越厉害
笛卡尔积(cartesian product)
由没有连接条件的表关系返回的结果为笛卡尔积,检索出的行的数目将是第一个表中的行数乘以第二个表中的行数。返回笛卡尔积的连接,也称叉连接。
使用表别名
- SQL 除了可对列名和计算字段使用别名,还允许给表名起别名
- 表别名只在查询执行中使用,与列别名不同的是表别名不返回到客户端
- 使用表别名可缩短SQL 语句,并允许在一条SELECT 语句中多次使用相同的表
SELECT column_name1,column_name2
FROM table1 AS T1, table2 AS T2
WHERE T1.column_name3 = T2.column_name3;
自连接(self-join)
- 自连接通常作为外部语句,用来替代从相同表中检索数据的子查询语句
- 大多DBMS处理连接的速度往往比处理子查询快
SELECT T1.column_name1,T1.column_name2
FROM table1 AS T1,table2 AS T2
WHERE T1.column_name1 = T2.column_name1
AND T2.column_name = 'str';
自然连接(natural join)
- 标准的连接(即内连接)返回所有的数据,相同的列甚至多次出现
- 自然连接排除多次出现,使每一列值返回一次
- 自然连接一般通过对一个表使用通配符(SELECT *),而对其他表的了使用明确的子集来完成
外连接(outer join)
- 外连接包含了那些在相关表中没有关联的行
- SELECT 语句使用OUTER JOIN 语句指定外连接类型
- 使用OUTER JOIN 语法时,必须使用LEFT 或RIGHT 关键字指定包括其所有行的表
- 左外连接(LEFT OUTER JOIN)指出OUTER JOIN 左边的表,右外连接反之
- 调整FROM 或WHERE 子句中表的顺序,可“互换”左右外连接
SELECT table1.column_name1,table1.column_name2,table2.column_name3
FROM table1 LEFT OUTER JOIN table2
ON table1.column_name1 = table2.column_name1;
使用带聚集函数的连接
SELECT table1.column_name1,
COUNT(table2.column_name2) AS num
FROM table1 LEFT OUTER JOIN table2
ON table1.column_name1 = table2.column_name1
-- 此处应使用GROUP BY,否则报错
GROUP BY table1.column_name1;