sql多表连接
1、内连接
(1)普通内连接
格式:
select * from 表1 INNER JOIN 表2 on 表1.关联字段1=表2.关联字段2
如:
select * from dept INNER JOIN emp on dept.dept1=emp.dept2
(2)隐藏连接
格式:select * from 表1,表2 where 表1.关联字段1=表2.关联字段2
如:select * from dept,emp where dept.dept1=emp.dept2
2、左连接
格式:
select * from 表1 left JOIN 表2 on 表1.关联字段1=表2.关联字段2
select * from dept left JOIN emp on dept.dept1=emp.dept2
3、右连接
格式:
select * from 表1 right JOIN 表2 on 表1.关联字段1=表2.关联字段2
select * from dept right JOIN emp on dept.dept1=emp.dept2
4、左独有
格式:
select * from 表1 left JOIN 表2 on 表1.关联字段1=表2.关联字段2 WHERE 右表字段 is null
如:select * from dept left JOIN emp on dept.dept1=emp.dept2 WHERE name is null
5、右独有
格式:
select * from 表1 right JOIN 表2 on 表1.关联字段1=表2.关联字段2 WHERE 左表字段 is null
如:
select * from dept right JOIN emp on dept.dept1=emp.dept2 WHERE
dept1 is null
6、全外连接(union)
1)内连接+左独有+右独有
select * from dept INNER JOIN emp on dept.dept1=emp.dept2
union
select * from dept left JOIN emp on dept.dept1=emp.dept2 where
name is null
union
select * from dept right JOIN emp on dept.dept1=emp.dept2 WHERE
dept1 is null
(2)左连接+右独有
如:
select * from dept left JOIN emp on dept.dept1=emp.dept2
UNION
select * from dept right JOIN emp on dept.dept1=emp.dept2 WHERE
dept1 is null
(3)右连接+左独有
select * from dept right JOIN emp on dept.dept1=emp.dept2
UNION
select * from dept left JOIN emp on dept.dept1=emp.dept2 where
name is null
二、子查询
1、表子查询:
查询出来的结果是一行一列
.It技术部入职员工的员工号
如:select dept1 from dept where dept_name="IT技术" 结果一行一列
如:
select sid from emp where dept2=(select dept1 from dept where dept_name="IT技术")
2、列子查询
查询出来的结果是一列多行(一列值)
It技术和 财务 部入职员工的员工号
select dept1 from dept where dept_name="IT技术" or dept_name='财务' 一列多行
如:select sid from emp where dept2 in(select dept1 from dept where dept_name="IT技术" or dept_name='财务')
多个值,用in
3、行子查询
查询的结果是一行多列
select age,incoming from emp where name="牛八"
select * from emp where (age,incoming) in(select age,incoming from emp where name="牛八")
4、表子查询
一般接在from后面
临时表
select * from (select * from dept INNER JOIN emp on dept1=dept2 where dept_name="销售"
)s where s.incoming>8000
s就是临时表
select * from (select * from dept INNER JOIN emp on dept1=dept2)a
where a.incoming>8000
求出年龄大于50岁的部门名称和姓名
select * from emp WHERE age>50; 多行多列
select dept_name,name from dept INNER JOIN (select * from emp WHERE age>50)m
on dept.dept1=m.dept2

浙公网安备 33010602011771号