MySQL基础(三)

子查询

概念:

  • 出如今其余语句内部的select语句,称为子查询或内查询。 而内部嵌套其余select语句的查询,称为主查询或外查询。

什么是子查询

分类:

  • 按照子查询出现的位置:
    • 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] JOIN2
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,能够包含重复项。
相关文章
相关标签/搜索