分组函数
COUNT(列名/*): 查询出满足条件的记录行数
MAX(列名): 查询指定列上的最大值
MIN(列名): 查询指定列上的最小值
SUM(列名): 查询指定列上的所有数据的总和
AVG(列名): 查询指定列上的评价值(Average)
示例:查询所有员工的数量
SELECT COUNT(eid) FROM emp;
SELECT COUNT(*) FROM emp;
查询出每个部门的员工数量
SELECT COUNT(*),dept_id FROM emp GROUP BY dept_id;
查询出所有员工工资中的最大值
SELECT MAX(salary) FROM emp;
查询出每个部门的编号及该部门的工资最大值、最小值、平均值
SELECT dept_id, MAX(salary), MIN(salary), AVG(salary)
FROM emp
GROUP BY dept_id ;
查询出每个部门的编号及该部门所有员工的工资总和
SELECT dept_id, SUM(salary) AS s
FROM emp
GROUP BY dept_id;
子查询
在一条查询语句中再嵌入另一条查询,被嵌入的查询称为“子查询”。
示例:查询出Market部门的所有员工的所有信息
步骤1:根据部门名称查询其编号
SELECT did FROM dept WHERE dname='Market';
步骤2:根据部门编号查询员工信息
SELECT * FROM emp WHERE dept_id=10;
整合步骤1和步骤2:
SELECT * FROM emp WHERE dept_id=(
SELECT did FROM dept WHERE dname='Market'
);
练习:查询出工资比Tiger少的员工的所有信息
步骤1:查询Tiger的工资——根据员工姓名查工资
SELECT salary FROM emp WHERE ename='Tiger';
步骤2:查询工资比18000少的员工信息
SELECT * FROM emp WHERE salary<18000;
整合:
SELECT * FROM emp WHERE salary<(
SELECT salary FROM emp WHERE ename='Tiger'
);
跨表查询
跨表/多表查询,一次查询得到的结果集中的列来自于不同的表;
跨表查询一定要防止出现笛卡尔积——必须指定两个表中的相等条件。
示例:查询每个员工的姓名及其所在部门的名称
SELECT ename, dname
FROM emp, dept; //错误,会出现“笛卡尔积”
--------------- SQL-92标准--------------------
SELECT ename, dept_id, dname, did
FROM emp, dept
WHERE emp.dept_id = dept.did; //防止出现笛卡尔积
提示: SQL-92标准中的跨表查询无法显示连接条件为NULL的记录行,
如员工的部门编号为NULL,该记录无法显示
--------------- SQL-99标准——--------------------
SQL-99中的 内连接——作用等同于SQL-92中的跨表查询:
SELECT ename, dname
FROM emp INNER JOIN dept
ON emp.dept_id = dept.did;
SQL-99中的 左外连接——会显示出左侧表中所有的记录:
SELECT ename, dname
FROM emp LEFT OUTER JOIN dept
ON emp.dept_id = dept.did;
SQL-99中的 右外连接——会显示出右侧表中所有的记录:
SELECT ename, dname
FROM emp RIGHT OUTER JOIN dept
ON emp.dept_id = dept.did;
SQL-99中的 全连接——会显示出两侧表中所有的记录:
SELECT ename, dname
FROM emp FULL JOIN dept
MySQL不支持全连接,如何解决?
提示:使用结果集的 合并操作可以类似的实现“全连接查询”效果。
SELECT ename, dname
FROM emp LEFT OUTER JOIN dept
ON emp.dept_id = dept.did
UNION
SELECT ename, dname
FROM emp RIGHT OUTER JOIN dept
ON emp.dept_id = dept.did;
COUNT(列名/*): 查询出满足条件的记录行数
MAX(列名): 查询指定列上的最大值
MIN(列名): 查询指定列上的最小值
SUM(列名): 查询指定列上的所有数据的总和
AVG(列名): 查询指定列上的评价值(Average)
示例:查询所有员工的数量
SELECT COUNT(eid) FROM emp;
SELECT COUNT(*) FROM emp;
查询出每个部门的员工数量
SELECT COUNT(*),dept_id FROM emp GROUP BY dept_id;
查询出所有员工工资中的最大值
SELECT MAX(salary) FROM emp;
查询出每个部门的编号及该部门的工资最大值、最小值、平均值
SELECT dept_id, MAX(salary), MIN(salary), AVG(salary)
FROM emp
GROUP BY dept_id ;
查询出每个部门的编号及该部门所有员工的工资总和
SELECT dept_id, SUM(salary) AS s
FROM emp
GROUP BY dept_id;
子查询
在一条查询语句中再嵌入另一条查询,被嵌入的查询称为“子查询”。
示例:查询出Market部门的所有员工的所有信息
步骤1:根据部门名称查询其编号
SELECT did FROM dept WHERE dname='Market';
步骤2:根据部门编号查询员工信息
SELECT * FROM emp WHERE dept_id=10;
整合步骤1和步骤2:
SELECT * FROM emp WHERE dept_id=(
SELECT did FROM dept WHERE dname='Market'
);
练习:查询出工资比Tiger少的员工的所有信息
步骤1:查询Tiger的工资——根据员工姓名查工资
SELECT salary FROM emp WHERE ename='Tiger';
步骤2:查询工资比18000少的员工信息
SELECT * FROM emp WHERE salary<18000;
整合:
SELECT * FROM emp WHERE salary<(
SELECT salary FROM emp WHERE ename='Tiger'
);
跨表查询
跨表/多表查询,一次查询得到的结果集中的列来自于不同的表;
跨表查询一定要防止出现笛卡尔积——必须指定两个表中的相等条件。
示例:查询每个员工的姓名及其所在部门的名称
SELECT ename, dname
FROM emp, dept; //错误,会出现“笛卡尔积”
--------------- SQL-92标准--------------------
SELECT ename, dept_id, dname, did
FROM emp, dept
WHERE emp.dept_id = dept.did; //防止出现笛卡尔积
提示: SQL-92标准中的跨表查询无法显示连接条件为NULL的记录行,
如员工的部门编号为NULL,该记录无法显示
--------------- SQL-99标准——--------------------
SQL-99中的 内连接——作用等同于SQL-92中的跨表查询:
SELECT ename, dname
FROM emp INNER JOIN dept
ON emp.dept_id = dept.did;
SQL-99中的 左外连接——会显示出左侧表中所有的记录:
SELECT ename, dname
FROM emp LEFT OUTER JOIN dept
ON emp.dept_id = dept.did;
SQL-99中的 右外连接——会显示出右侧表中所有的记录:
SELECT ename, dname
FROM emp RIGHT OUTER JOIN dept
ON emp.dept_id = dept.did;
SQL-99中的 全连接——会显示出两侧表中所有的记录:
SELECT ename, dname
FROM emp FULL JOIN dept
ON emp.dept_id = dept.did;
注:SQL标准不为本文章终点介绍值内容,
MySQL不支持全连接,如何解决?
提示:使用结果集的 合并操作可以类似的实现“全连接查询”效果。
SELECT ename, dname
FROM emp LEFT OUTER JOIN dept
ON emp.dept_id = dept.did
UNION
SELECT ename, dname
FROM emp RIGHT OUTER JOIN dept
ON emp.dept_id = dept.did;