JavaEE之数据库基础
数据库
1. 交叉连接(cross join)
交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。
例如:下面的语句1和语句2的结果是相同的。
语句1:隐式的交叉连接,没有CROSS JOIN。
1 | SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAME |
语句2:显式的交叉连接,使用CROSS JOIN。
1 | SELECT O.ID,O.ORDER_NUMBER,C.ID, |
语句1和语句2的结果是相同的,查询结果如下:
a
表:
id | name |
---|---|
1 | 张三 |
2 | 李四 |
3 | 王五 |
b
表:
id | job | parent_id |
---|---|---|
1 | java | 1 |
2 | php | 2 |
3 | php | 4 |
1. 内连接(INNER JOIN
)
内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。
显式内连接
1 | SELECT a.*,b.* FROM a INNER JOIN b ON a.id=b.parent_id |
隐式内连接
1 | SELECT a.*,b.* FROM a,b WHERE a.id=b.parent_id //只能用where |
结果:
id | name | id1 | job | parent_id |
---|---|---|---|---|
1 | 张三 | 1 | java | 1 |
2 | 李四 | 2 | php | 2 |
2. 左连接(LEFT JOIN
)
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
1 | SELECT a.*,b.* FROM a LEFT JOIN b ON a.id=b.parent_id |
id | name | id1 | job | parent_id |
---|---|---|---|---|
1 | 张三 | 1 | java | 1 |
2 | 李四 | 2 | php | 2 |
3 | 王五 | null |
null |
null |
3. 右连接(RIGHT JOIN
)
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
1 | SELECT a.*,b.* FROM a RIGHT JOIN b ON a.id=b.parent_id |
id | name | id1 | job | parent_id |
---|---|---|---|---|
1 | 张三 | 1 | java | 1 |
2 | 李四 | 2 | php | 2 |
null |
null |
3 | php | 4 |
4.完全连接(FULL JOIN
,UNION
)
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
1 | SELECT a.*,b.* FROM a FULL JOIN b ON a.id=b.parent_id //MYSQL不支持full join |
id | name | id1 | job | parent_id |
---|---|---|---|---|
1 | 张三 | 1 | java | 1 |
2 | 李四 | 2 | php | 2 |
3 | 王五 | null |
null |
null |
null |
null |
3 | php | 4 |
5.交叉连接(CROSS JOIN
)
1 | SELECT a.*,b.* FROM a CROSS JOIN b WHERE a.id=b.parent_id |
ON后面的条件(ON条件)和WHERE条件的区别:
- ON条件:是过滤两个链接表笛卡尔积形成中间表的约束条件。
- WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件。在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。
从这里可以看出,将WHERE条件移入ON后面是不恰当的。推荐的做法是:
ON只进行连接操作,WHERE只过滤中间表的记录。
总结
- 查两表关联列相等的数据用内连接。
- Col_L是Col_R的子集时用右外连接。
- Col_R是Col_L的子集时用左外连接。
- Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。
- 求差操作的时候用联合查询。
多个表查询的时候,这些不同的连接类型可以写到一块。例如:
1 | SELECT T1.C1,T2.CX,T3.CY |
上面这个SQL查询是多表连接的一个示范。