高级查询

数据统计分析

聚合函数
统计员工平均月收入?

SELECT AVG(sal+IFNULL(comm,0)) AS avg FROM t_emp;
SELECT SUM(sal) FROM t_emp WHERE deptno IN(10,20);
SELECT MAX(comm) FROM t_emp;
SELECT SUM(sal),MAX(sal+IFNULL(comm,0)) FROM t_emp
WHERE deptno IN(10,20);
SELECT MAX(LENGTH(ename)) FROM t_emp;
SELECT min(hiredate) FROM t_emp;
SELECT COUNT(*),COUNT(comm) FROM t_emp;
SELECT count(*) FROM t_emp
WHERE deptno IN(10,20) AND sal>=2000
AND DATEDIFF(NOW(),hiredate)/365 >=15;

下图中第二个命令会出错,因为命令行不知道计算那些AVG(sal)

SELECT count(*) FROM t_emp
WHERE deptno IN(10,20) AND sal>AVG(sal);
SELECT count(*) FROM t_emp
WHERE deptno IN(10,20) AND sal>AVG(sal)
> 1111 - Invalid use of group function
> Time: 0s

因此得使用:分组查询

SELECT deptno,round(AVG(sal)) FROM t_emp GROUP BY deptno;

SELECT deptno,job,COUNT(*),AVG(sal)
FROM t_emp
GROUP BY deptno,job
ORDER BY deptno;


with rollup汇总

SELECT deptno,COUNT(*),AVG(sal),MAX(sal),MIN(sal)
FROM t_emp GROUP BY deptno WITH ROLLUP


SELECT deptno,COUNT(*),GROUP_CONCAT(ename)
FROM t_emp
WHERE sal>=2000
GROUP BY deptno;

分组查询遇到的困难。
WHERE字句优先级优于GROUP BY执行,如果WHERE语句中有聚合函数则错误,因为不知道聚合范围
此时要引入HAVING字句…

SELECT
FROM t_emp
WHERE AVG(sal)>=2000
GROUP BY deptno;
SELECT
FROM t_emp
WHERE AVG(sal)>=2000
GROUP BY deptno
> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM t_empWHERE AVG(sal)>=2000GROUP BY deptno' at line 2
> Time: 0s

使用having语句

SELECT deptno
FROM t_emp
GROUP BY deptno HAVING AVG(sal)>=2000;

SELECT deptno
FROM t_emp
WHERE hiredate>="1982-01-01"
GROUP BY deptno HAVING COUNT(*)>=2


典型错误语句

SELECT deptno
FROM t_emp
WHERE hiredate>="1982-01-01"
GROUP BY deptno HAVING COUNT(*)>=AVG(sal)

表的内外连接

表的内连接,要有ON…(连接条件否则会出现笛卡尔积14*4 = 56个结果)

#查询每名员工的部门信息
SELECT e.empno,e.ename,d.dname
FROM t_emp e join t_dept d ON e.deptno=d.deptno;

#表连接分为内连接和外连接
#衍生语法
SELECT e.empno,e.ename,d.dname
FROM t_emp e join t_dept d WHERE e.deptno=d.deptno;
SELECT e.empno,e.ename,d.dname
FROM t_emp e,t_dept d where e.deptno=d.deptno;
#查询每个员工的工号,姓名,部门名称,底薪,职位,工资等级
SELECT e.empno,e.ename,d.dname,e.sal,e.job,s.grade
FROM t_emp e JOIN t_dept d ON e.deptno=d.deptno
JOIN t_salgrade s ON e.sal BETWEEN s.losal AND s.hisal

#查询SCOTT相同部门员工都有谁
SELECT deptno
FROM t_emp
WHERE ename="SCOTT"
SELECT ename
FROM t_emp
WHERE deptno = (SELECT deptno FROM t_emp WHERE ename="SCOTT")
#子查询非常慢
SELECT ename
FROM t_emp
WHERE deptno = (SELECT deptno FROM t_emp WHERE ename="SCOTT")
AND ename != "SCOTT"
#子查询非常慢
SELECT ename
FROM t_emp
WHERE deptno = (SELECT deptno FROM t_emp WHERE ename="SCOTT")
AND ename != "SCOTT"

表的外连接

左连接

SELECT e.empno,e.ename,d.dname
FROM t_dept d
RIGHT JOIN t_emp e ON e.deptno = d.deptno

SELECT e.empno,e.ename,d.dname
FROM t_dept d
RIGHT JOIN t_emp e ON e.deptno = d.deptno


查询每个部门的名称和人数

#外接练习1
#查询每个部门的名称和人数
SELECT d.dname, count(*)
FROM t_dept d LEFT JOIN t_emp e
ON d.deptno = e.deptno
GROUP BY d.deptno
SELECT d.dname, count(d.deptno)
FROM t_dept d LEFT JOIN t_emp e
ON d.deptno = e.deptno
GROUP BY d.deptno

通过union合并,这条命令没有统计到 陈浩

#查询每个部门的名称和人数,如果没有部门的员工,部门名称用Null替代
#通过union合并之后
(SELECT d.dname, count(d.deptno)
FROM t_dept d RIGHT JOIN t_emp e
ON d.deptno = e.deptno
GROUP BY d.deptno) UNION
(SELECT d.dname, count(e.deptno)
FROM t_dept d LEFT JOIN t_emp e
ON d.deptno = e.deptno
GROUP BY d.deptno)


需要把陈浩统计上去

#这样就把陈浩(无部门)统计上了
(SELECT d.dname, count(*)
FROM t_dept d RIGHT JOIN t_emp e
ON d.deptno = e.deptno
GROUP BY d.deptno) UNION
(SELECT d.dname, count(e.deptno)
FROM t_dept d LEFT JOIN t_emp e
ON d.deptno = e.deptno
GROUP BY d.deptno )


查询每个员工的编号,姓名,部门,月薪,工资等级,工龄,上司编号,上司姓名,上司部门

SELECT e.empno,e.ename,d.dname,e.sal + IFNULL(e.comm, 0),s.grade,FLOOR(DATEDIFF(NOW(),e.hiredate) / 365),t.empno AS mgrno, t.ename AS mname,t.dname AS mdname
FROM t_emp e LEFT JOIN t_dept d ON e.deptno = d.deptno
LEFT JOIN t_salgrade s ON e.sal BETWEEN s.losal AND s.hisal
LEFT JOIN
(SELECT e1.empno,e1.ename,d1.dname
FROM t_emp e1 JOIN t_dept d1
ON e1.deptno = d1.deptno) t ON e.mgr = t.empno


注意and和where的区别

SELECT
e.empno,e.ename,d.dname
FROM t_emp e LEFT JOIN t_dept d
ON e.deptno = d.deptno
AND e.deptno = 10;


where

SELECT
e.empno,e.ename,d.dname
FROM t_emp e LEFT JOIN t_dept d
ON e.deptno = d.deptno
WHERE e.deptno = 10;

子查询语法规则

where子查询

#查询底薪超过公司平均底薪的员工信息
#where子查询是相关子查询费时间
SELECT empno,ename,sal
FROM t_emp
WHERE sal >=(SELECT AVG(sal) FROM t_emp)


from子查询

#from 子查询只会执行一次,查询效率高
SELECT e.empno,e.ename,e.sal,t.avg
FROM t_emp e JOIN
(SELECT deptno,AVG(sal) as avg FROM t_emp GROUP BY deptno) t
ON e.deptno = t.deptno AND e.sal>=t.avg

#SELECT子查询
SELECT e.empno,e.ename,
(SELECT dname FROM t_dept   WHERE deptno = e.deptno)
FROM t_emp e


多行子查询,比较时可以用IN
查询和f m在同一个部门的人

#子查询2
#多行子查询
#比较时可以用 in
SELECT ename
FROM t_emp
WHERE
deptno IN
(SELECT deptno FROM t_emp WHERE ename IN("FORD","MARTIN"))
AND ename NOT IN("FORD","MARTIN")

查询比f和m底薪高的员工信息

#查询比f and m 底薪高的员工信息
SELECT ename
FROM t_emp
WHERE sal>=ALL
(SELECT sal FROM t_emp WHERE ename IN("FORD","MARTIN"))
AND ename NOT IN("FORD","MARTIN")

关键字exist
查询工资等级3和4的员工信息

#关键字exist
SELECT empno,ename,sal,comm
FROM t_emp
WHERE EXISTS(
SELECT * FROM t_salgrade
WHERE sal BETWEEN losal AND hisal
AND grade IN(3,4)
)

04数据库的高级查询相关推荐

  1. 【MySQL】数据库的高级查询

    前言 上次我们讲了数据库的基本查询,这次继续接上来数据库的高级查询.高级查询是建立在基础查询的基础上面的,如果你还没有看过建议你先去学习数据库的基础查询. 传送门:MySQL数据库的基本查询 数据库的 ...

  2. 8 .数据库-查-高级查询

    8 .数据库-查-高级查询 聚合函数 为了要给数据做统计,例如算出某个字段的最大值,所以MYSQL给出了很多聚合函数来供给用户做统计.运算操作: 注意:运算函数字段类型要是数值类型!不是也可以 但会返 ...

  3. mysql数据库高级查询笔记_MySQL数据库基础——高级查询

    MySQL数据库入门--day08 高级查询 一.聚合函数: 在实际开发过程中经常需要对数据进行统计,为此MySQL中提供了一些函数来实现某些功能如下表所示: 聚合函数 1.COUNT()函数: CO ...

  4. MongoDB数据库(3.mongodb数据库的高级查询)

    1. 按照条件查询所有数据:  db.集合名称.find(条件)       (1)  例:  db.test_01.find({age=20})           查找test_01集合中的age ...

  5. Oracle篇--04 Oracle SQL高级查询、分页查询

    1.子查询 子查询是一条SELECT语句,但它是嵌套在其他SQL语句中的,为的是给该SQL提供数据以支持其执行操作. 查看谁的工资高于CLARK?select ename,sal from emp w ...

  6. Oracle数据库——SQL高级查询

    一.涉及内容 1.掌握SELECT语句的多表连接查询. 2.掌握SELECT语句的子查询. 二.具体操作 (一)根据Oracle数据库scott方案下的emp表和dept表,完成下列操作: 1.查询所 ...

  7. 查看oracle数据库启动状态,Oracle数据库的状态查询

    1 状态查询 启动状态 SQL语句 结果 nomount select status from v$instance; STARTED select open_mode from v$database ...

  8. sql查询计算机系学生的学号和姓名,实验5数据库的简单查询操作答案.docx

    (6) 从学生信息表中查询计算机系年龄小于 (6) 从学生信息表中查询计算机系年龄小于 20 的学生的信息 SQL 代码如下: (2) (2) 从学生信息表中查询所有学生的姓名和学号信息并分别 实验 ...

  9. oracle 游标查询数据库,Oracle数据库使用游标查询结果集所有数据

    --Oracle使用游标查询结果集所有数据 DECLARE myTabelName NVARCHAR2(200):=''; --表名 myTableRowComment NVARCHAR2(200): ...

最新文章

  1. 【连载】优秀程序员的 45 个习惯之习惯35
  2. iOS Sprite Kit教程之申请和下载证书
  3. g++ 编译pybind
  4. 防止重复提交保证幂等的几种解决方案
  5. Unable to compile class for JSP的解决方法
  6. margin 和 padding 的使用区别
  7. dockerfile的详细介绍
  8. 一种改进的高光谱图像CEM目标检测算法
  9. ASP.NET 5 Beta8 已经发布
  10. springboot2稳定版本_重要版本Spring Boot 2.3.0发布 - spring.io
  11. 为什么阿里巴巴不允许使用Executors?
  12. 云小课 | 使用ROMA API,API管理从此不用愁
  13. Neo4j fails creating index,创建索引失败
  14. PHP执行系统外部命令函数:exec()、passthru()、system()、shell_exec()
  15. J1939协议之通俗易懂----简介
  16. 软考高级 真题 2016年上半年 信息系统项目管理师 论文
  17. GitHub AI 编程工具自动写代码神器Copilot插件体验
  18. dw怎么在框架中加入网页_Dreamweaver如何用框架建立网站
  19. 《风暴英雄》游戏体验
  20. python绘制黑白棋盘_python – 在二维数组中创建一个黑白棋盘

热门文章

  1. 【Level 08】U08 Positive Attitude L2 Into the world of a bookworm
  2. 【英语学习】【WOTD】ratiocination 释义/词源/示例
  3. 笑着学会Linux 系统之故障排查
  4. C++开源矩阵计算工具——Eigen的简单用法(二)
  5. jDom 和dom4j 输出的中文乱码的解决方案
  6. python生成sql文件_Python 数据库Insert语句脚本生成工具(SQL Server)
  7. 写一段代码提高内存占用_记录一次生产环境中Redis内存增长异常排查全流程!...
  8. java B2B2C Springcloud多租户电子商城系统- Gateway 之Predict篇...
  9. 3-AIV--使用ContentProvider获得所有图片路径
  10. [IOS]开源库RegexKitLite正则表达式的使用