暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL子查询

brevity分享 2021-08-30
371
SQL查询除了前面介绍的一些外,还有一个比较常用的,就是子查询了,子查询就是出现在其他语句内部的select语句。子查询语句的位置可以在select后面、from后面、where或having后面以及exists后面;按照功能不同可以分为标量子查询、列子查询、行子查询以及表子查询。其中select后面仅仅支持标量子查询,即结果集只有一行一列,from后面支持表子查询,也就是结果集有多行多列,where或having后面支持标量子查询与列子查询,列子查询即结果集为一列多行,也支持行子查询,就是结果集有一行多列,exists后面支持表子查询。子查询都会放在小括号内,而且一般放在条件的右侧,子查询的执行优先于主查询。
    SELECT * FROM employees WHERE salary > (SELECT salary FROM employees WHERE last_name = 'Ernst');
    SELECT last_name,job_id,salary FROM employees WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 110AND salary > (SELECT salary FROM employees WHERE employee_id = 120);
    SELECT last_name,job_id,salary FROM employees WHERE salary = (SELECT MIN(salary) FROM employees);
    SELECT MIN(salary),department_id FROM employees GROUP BY department_id HAVING MIN(salary) > (SELECT MIN(salary) FROM employees WHERE department_id = 30);
    SELECT last_name FROM employees WHERE department_id IN(SELECT DISTINCT department_id FROM departments WHERE location_id IN (1000,1800));
    SELECT employee_id,last_name,salary FROM employees WHERE salary < ANY (SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG'AND job_id <> 'IT_PROG';
    行子查询:
      SELECT * FROM employees WHERE (employee_id,salary) = (SELECT MIN(employee_id),MAX(salary) FROM employees);
      SELECT后面加子查询:
        SELECT d.*,(SELECT COUNT(*) FROM employees e WHERE e.department_id = d.`department_id`) AS 个数 FROM departments d;
        SELECT (SELECT department_name FROM departments d INNER JOIN employees e ON d.department_id = e.department_id WHERE e.employee_id = 110) 部门名;
        FROM后面的子查询:
          SELECT av_dep.*,g.`grade_level` FROM (SELECT AVG(salary) ag,department_id FROM employees GROUP BY department_id) av_dep INNER JOIN job_grades g ON av_dep.ag BETWEEN lowest_sal AND highest_sal;
          EXIST后面的子查询,也叫做相关子查询,与其他子查询不同的是,他不是先执行子查询,而是先执行外查询再进行过滤:
            SELECT department_name FROM departments d WHERE EXISTS(SELECT * FROM employees e WHERE d.department_id = e.`department_id`);
            SELECT bo.* FROM boys bo WHERE NOT EXISTS(SELECT boyfriend_id FROM beauty b WHERE bo.`id` = b.`boyfriend_id`);
            在数据量比较大的时候要使用分页查询来提高效率,示例如下:
              SELECT * FROM employees LIMIT 0,10;
              SELECT * FROM employees LIMIT 10;
              其中0表示要显示记录的起始索引(索引从0开始),10表示要显示的记录条数,LIMIT关键字一定放在SQL语句的最后面,执行顺序也是最后一个。
              联合查询使用UNION关键字,也就是将多条查询语句的结果合并成一个结果,示例如下:
                SELECT * FROM employees WHERE email LIKE '%A%' UNION SELECT * FROM employees WHERE department_id > 100;
                联合查询要求多条查询语句的查询列数是一致的,而且查询的每一列的类型和顺序也要尽量一致;使用UNION默认是去重的,如果不想去重,需要使用UNION ALL。
                文章转载自brevity分享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                评论