• mysql快速精通(四)多表查询


    主打一个实用

    一. 连接查询

    1. 交叉连接

      交叉连接返回两个表的笛卡尔积,即每个表的每一行与另一个表的每一行组合

      语法:

      SELECT *FROM table1 CROSS JOIN table2;
      
    2. 内连接

      查询两张表都存在的数据,即排除两张表的未匹配部分

      语法:

      SELECT 字段名 FROM 左表 INNER JOIN 右表 ON 条件;
      
    3. 外连接

      a. 左外连接

      保留左表部分(包括其未匹配部分),可以通过加上右表对应字段等于空的条件排除交集部分

      语法:

       SELECT 字段名 FROM 左表 LEFT OUTER JOIN 右表 ON 条件
      

      b. 右外连接

      保留右表部分(包括其未匹配部分),可以通过加上左表对应字段等于空的条件排除交集部分

      语法:

       SELECT 字段名 FROM 左表 RIGHT OUTER JOIN 右表 ON 条件
      
    4. 自连接

    自连接算是外连接的一种特殊情况,这里单独提出来,所用语法与交叉连接相似

    自连接是指连接同一个表的两个不同实例,用于在同一个表中比较不同行之间的数据,例如我需要查询表中工资为平均值的员工姓名,由于在where里面不能使用聚合函数,所以无法通过单表实现,但可以借助自连接实现

    SELECT columns
    FROM table1 AS alias1
    JOIN table1 AS alias2 ON alias1.column = alias2.column;
    
    1. 全外连接

    保留两表所有行,在mysql里面需要用UNION实现,UNION会取并集并去除,所以可以直接将左连接与右连接并起来

    语法:

    SELECT columns
    FROM table1
    LEFT JOIN table2 ON table1.column = table2.column
    UNION
    SELECT columns
    FROM table1
    RIGHT JOIN table2 ON table1.column = table2.column
    

    二. 子查询

    1. 单行子查询

    使用单行运算符的子查询,"= > >= < <= != "

    举例:

    select * from emp where salary>(select salary from emp where name='眨眼睛')
    
    1. 多行子查询

    同理,“in、any、all”

    举例

    # 查询工资高于5000的员工(使用in)
    SELECT dept.name FROM dept WHERE dept.id IN (SELECT dept_id FROM emp WHERE salary > 5000)
    
    # 查询工资在眨眼睛以上的所有员工(使用any)
    select name,salary from emp where salary >=any(select salary from emp where name='眨眼睛')
    
    # 查询工资比眨眼睛高的所有员工(使用all)
    select name,salary from emp where salary >all(select salary from emp where name='眨眼睛')
    
    1. 多列子查询
    # 查询部门在纽约并且入职时间在xxx时间以后的员工信息
    SELECT 
        emp.id AS emp_id,
        emp.name AS emp_name,
        emp.salary AS emp_salary,
        dept.id AS dept_id,
        dept.name AS dept_name
    FROM 
        employees emp,
        (SELECT * FROM departments WHERE location = 'New York') AS dept
    WHERE 
        emp.department_id = dept.id
        AND emp.join_date > '2011-01-01';
    
    
  • 相关阅读:
    C++核心编程:P19->STL----常用算法(下)
    Spring MVC拦截器
    学习笔记 - PLE
    数据库列的字段类型和属性
    SpringBoot实现登录拦截
    无人机飞行表演编队的数据链方案介绍
    【Prometheus】mysqld_exporter采集+Grafana出图+AlertManager预警
    模拟堆的实现 java
    二叉树的递归遍历和非递归遍历
    华夏代驾_第一章_项目环境搭建_第一节
  • 原文地址:https://blog.csdn.net/m0_73756108/article/details/140356637