专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

MySQL基础(三)

子查询

概念:

  • 出现在其他语句内部的select语句,称为子查询或内查询。 而内部嵌套其他select语句的查询,称为主查询或外查询。

89_1.png

分类:

  • 按照子查询出现的位置:
    • select后面:仅仅支持标量子查询。
    • from后面:支持表子查询。
    • where或having后面:支持标量子查询或列子查询,行子查询。
    • exists后面(又称为相关子查询):支持表子查询。
  • 按结果集的行列数不同:
    • 标量子查询(结果集只有一行一列)
    • 列子查询(结果集只有一列多行)
    • 行子查询(结果集有一行多列)
    • 表子查询(结果集,一般为多行多列)

where或having后面:

特点:

  • ①子查询放在小括号内。
  • ②子查询一般放在条件的右侧。
  • ③标量子查询,一般搭配单行操作符使用(>、<、>=、<=、<>)。
  • ④列子查询,一般搭配多行操作符使用(in、any/some、all)。

标量子查询:

  • 查询谁的工资比Abel高。
SELECT
    last_name 
FROM
    employees 
WHERE
    salary > ( SELECT salary FROM employees WHERE last_name = 'Abel' );

  • 返回job_id和141号员工相同,salary比143号员工多的员工姓名、job_id和工资。
SELECT
    last_name,
    job_id,
    salary 
FROM
    employees 
WHERE
    job_id = ( SELECT job_id FROM employees WHERE employee_id = 141 ) 
    AND salary > ( SELECT salary FROM employees WHERE employee_id = 143 );

  • 返回公司工资最少的员工的last_name、job_id和salary。
SELECT
    last_name,
    job_id,
    salary 
FROM
    employees 
WHERE
    salary = ( SELECT min( salary ) FROM employees );

  • 查询最低工资大于50号部门最低工资的部门id和其最低工资。
SELECT
    department_id,
    MIN( salary ) 
FROM
    employees 
GROUP BY
    department_id 
HAVING
    min( salary ) > ( SELECT min( salary ) FROM employees WHERE department_id = 50 );

列子查询:

  • 返回location_id是1400或1700的部门中的所有员工姓名。
SELECT
    last_name 
FROM
    employees 
WHERE
    department_id IN ( SELECT DISTINCT department_id FROM departments WHERE location_id IN ( 1400, 1700 ) );

  • 返回其它工种中比job_id为’IT_PROG’工种任一工资低的员工的员工号、姓名、job_id以及salary。
SELECT
    employee_id,
    last_name,
    job_id,
    salary 
FROM
    employees 
WHERE
    salary < ANY ( SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG' ) and job_id !=  'IT_PROG';

  • 返回其它工种中比job_id为’IT_PROG’工种所有工资低的员工的员工号、姓名、job_id以及salary。
SELECT
    employee_id,
    last_name,
    job_id,
    salary 
FROM
    employees 
WHERE
    salary < ALL ( SELECT DISTINCT salary FROM employees WHERE job_id = 'IT_PROG' ) and job_id !=  'IT_PROG';

行子查询(用的较少):

  • 查询员工编号最小并且工资最高的员工信息。
SELECT * FROM employees 
WHERE ( salary, employee_id ) = (( SELECT max( salary ) FROM employees ),( SELECT min( employee_id ) FROM employees ) 
);

select后面:

  • 查询每个部门的员工个数。
SELECT d.*,( SELECT count(*) FROM employees e WHERE e.department_id = d.department_id ) as '员工个数'
FROM
    departments d;

from后面:

  • 查询每个部门的平均工资的工资等级。
SELECT
    temp.department_id,
    jg.grade_level 
FROM
    ( SELECT department_id AS department_id, avg( salary ) AS `avg` FROM employees GROUP BY department_id ) temp
    INNER JOIN ( SELECT grade_level, highest_sal, lowest_sal FROM job_grades ) jg ON temp.avg BETWEEN jg.lowest_sal 
    AND jg.highest_sal;

exists后面:

  • 语法:
exists(完成的查询语句)

结果:0或1

  • 查询有员工的部门名。
SELECT
    department_name 
FROM
    departments d 
WHERE
    EXISTS ( SELECT * FROM employees e WHERE d.department_id = e.department_id );

分页查询

  • 语法:
SELECT 查询列表
FROM 表 [join type] JOIN 表2
ON 连接条件
WHERE 筛选条件
GROUP BY 分组字段
HAVING 分组筛选条件
ORDER BY 排序字段
LIMIT 起始索引(从0开始),每页显示条数。

  • 示例:查询前5条员工信息。
 SELECT
    * 
FROM
    employees 
    LIMIT 0,5;

union联合查询

概念:

  • 将多条查询语句的结果合并成一个结果。

语法:

查询语句1
UNION
查询语句2
……;

应用示例:

  • 查询部门编号>90或邮箱包含a的员工信息。
SELECT * FROM employees WHERE last_name LIKE '%a%'  
UNION
SELECT * FROM employees WHERE department_id > 90 ;

特点:

  • ①要求多条查询语句的查询列数是一致的。
  • ②要求多条查询语句的每一列的类型和顺序最好是一致的。
  • ③union关键字默认是去重,如果使用union all,可以包含重复项。

文章永久链接:https://tech.souyunku.com/42662

未经允许不得转载:搜云库技术团队 » MySQL基础(三)

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们