MySql中子查询,左链,右链,内链,关键字join

--内连接

* 功能
    拿左表的记录去匹配右表的记录,若符合条件就显示(二张表交集部分)
* 语法
    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;
原文地址:https://www.cnblogs.com/xiaozhang666/p/13440100.html