数据库查询之复杂查询

分组函数
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;       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端SkyRain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值