* 功能 拿左表的记录去匹配右表的记录,若符合条件就显示(二张表交集部分) * 语法 1)隐式内连接 select ... from 左表,右表 where 连接条件; 2)显示内连接【推荐】 select ... from 左表 [inner] join 右表 on 连接条件;
-- 隐式 SELECT * FROM dept d,emp e WHERE d.id = e.dept_id AND d.name = '开发部'; -- 显示 SELECT * FROM dept d INNER JOIN emp e ON d.id = e.dept_id WHERE d.name = '开发部';
1. 左外连接 功能 展示左表全部,再去匹配右表,若符合条件显示数据,不符合显示null 语法 select ... from 左表 left [outer] join 右表 on 连接条件; 2. 右外连接 功能 展示右表全部,再去匹配左表,若符合条件显示数据,不符合显示null 语法 select ... from 左表 right [outer] join 右表 on 连接条件;
# 举例
# 左外连接 -- 查询所有员工信息及对应的部门名称 SELECT * FROM emp e LEFT OUTER JOIN dept d ON e.dept_id = d.id; # 右外连接 -- 查询所有部门及对应的员工信息 SELECT * FROM emp e RIGHT OUTER JOIN dept d ON e.dept_id = d.id;
注意:外连接必须加条件
连接条件= 表个数-1
* 功能 一条select查询结果,作为另一条select语法的一部分 * 语法 1)查询结果单值(使用=) SELECT MAX(salary) FROM emp; 2)查询结果单列(使用in) SELECT salary FROM emp; 3)查询结果多列 SELECT * FROM emp; * 规律 子查询结果单列或单值,一般作为条件在where后面使用 select ... from 表名 where 字段 in|= (子查询); 子查结果为多列,一般作为虚拟表在from后面使用 select ... from (子查询) [as] 表别名;
# 子查询结果为单值 -- 举例 查询工资最高的员工是谁? SELECT * FROM emp WHERE salary = (SELECT MAX(salary) FROM emp); # 子查询结果为单列多行 -- 举例 查询工资大于5000的员工 SELECT * FROM dept WHERE id IN(SELECT dept_id FROM emp WHERE salary > 5000); # 子查询结果为多列多行 -- 举例 查询出2011年以后入职的员工信息,包括部门名称 -- 此处将查询语句当作临时表使用 SELECT * FROM (SELECT * FROM emp WHERE join_date >= '2011-1-1') e LEFT OUTER JOIN dept d ON e.dept_id = d.id;