今天,重刷了刷leetcode数据库的题目,对数据库连接查询做一个记录。
数据库(join) 内连接、外连接、笛卡尔积
内连接(自身连接)
内连接有隐式内连接和显示内连接两种:
隐式(无join),from后跟多个表名,生成的中间临时表是全部笛卡尔积。最后用where条件筛选
例如:
select A.Name
from Employee as A, Employee as B
where A.ManagerId=B.Id and A.Salary>B.Salary
显示(有join),中间临时表是经过ON子句过滤后的笛卡尔积。最后用where条件筛选
例如:a [INNER] JOIN b ON a.id=b.id
select A.name as Employee
from Employee As A inner join Employee as B on A.ManagerId=B.Id
where A.Salary>B.Salary
差异:隐式生成的是全部笛卡尔积,连接时生成的中间临时表更大。on条件是生成中间临时表的过滤条件;where条件是在临时表生成好后,再对临时表进行过滤的条件。
外连接
外连接有左连接、右连接、全连接三种:
左连接 a LEFT JOIN b ON a.id=b.id
左边为主表,保留所有行(即使在右表没有匹配的行),右表输出满足 on 条件的行,不满足的输出null
select A.FirstName, A.LastName, B.City, B.State</