答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段必须在GROUP BY后边出现,否则会报错:“ORA-00979: not a GROUP BY expression”。而MySQL则不同,如果SELECT出来的字段在GROUP BY后面没有出现,那么会随机取出一个值,而这样查询出来的数据不准确,语义也不明确。所以,作者建议在写SQL语句的时候,应该给数据库一个非常明确的指令,而不是让数据库去猜测,这也是写SQL语句的一个非常良好的习惯。

下面给出一个示例。有一张T_MAX_LHR表,数据如下图所示,有3个字段ARTICLE、AUTHOR和PRICE。请选出每个AUTHOR的PRICE最高的记录(要包含所有字段)。

ARTICLE https://www.cndba.cn/lhrbest/article/2029

AUTHOR

PRICE

0003

https://www.cndba.cn/lhrbest/article/2029

C

1.69 https://www.cndba.cn/lhrbest/article/2029

0004

B

19.95

0005

A

6.96 首先给出建表语句:

CREATE TABLE T_MAX_LHR (ARTICLE VARCHAR2(30),AUTHOR VARCHAR2(30),PRICE NUMBER); --Oracle

--CREATE TABLE T_MAX_LHR (ARTICLE VARCHAR(30),AUTHOR VARCHAR(30),PRICE FLOAT); --MySQL oracle通用

INSERT INTO T_MAX_LHR VALUES ('0001','B',3.99);

INSERT INTO T_MAX_LHR VALUES ('0002','A',10.99);

INSERT INTO T_MAX_LHR VALUES ('0003','C',1.69);

INSERT INTO T_MAX_LHR VALUES ('0004','B',19.95);

INSERT INTO T_MAX_LHR VALUES ('0005','A',6.96);

COMMIT;

SELECT * FROM T_MAX_LHR;

在Oracle中的数据:

LHR@orclasm > SELECT * FROM T_MAX_LHR;

ARTICLE  AUTHOR        PRICE

-------- -------- ----------

0001     B              3.99

0002     A             10.99

0003     C              1.69

0004     B             19.95

0005     A              6.96

在MySQL中的数据:

mysql> SELECT * FROM T_MAX_LHR;

+---------+--------+-------+

| ARTICLE | AUTHOR | PRICE |

+---------+--------+-------+

| 0001    | B      |  3.99 |

| 0002    | A      | 10.99 |

| 0003    | C      |  1.69 |

| 0004    | B      | 19.95 |

| 0005    | A      |  6.96 |

+---------+--------+-------+

5 rows in set (0.00 sec)

分析数据后,正确答案应该是:

ARTICLE

AUTHOR

PRICE

0002

A https://www.cndba.cn/lhrbest/article/2029

10.99

0003

C

1.69

0004

B

19.95对于这个例子,很容易想到的SQL语句如下所示:

SELECT T.ARTICLE,T.AUTHOR,MAX(T.PRICE) FROM T_MAX_LHR T GROUP BY T.AUTHOR;

SELECT * FROM T_MAX_LHR T GROUP BY T.AUTHOR;

在Oracle中执行上面的SQL语句报错:

LHR@orclasm > SELECT T.ARTICLE,T.AUTHOR,MAX(T.PRICE) FROM T_MAX_LHR T GROUP BY T.AUTHOR;

SELECT T.ARTICLE,T.AUTHOR,MAX(T.PRICE) FROM T_MAX_LHR T GROUP BY T.AUTHOR

*

ERROR at line 1:

ORA-00979: not a GROUP BY expression

LHR@orclasm > SELECT * FROM T_MAX_LHR T GROUP BY T.AUTHOR;

SELECT * FROM T_MAX_LHR T GROUP BY T.AUTHOR

*

ERROR at line 1:

ORA-00979: not a GROUP BY expression

在MySQL中执行同样的SQL语句不会报错:

mysql> select version();

+-------------------------------------------+

| version()                                 |

+-------------------------------------------+

| 5.6.21-enterprise-commercial-advanced-log |

+-------------------------------------------+

mysql> SELECT T.ARTICLE,T.AUTHOR,MAX(T.PRICE) FROM T_MAX_LHR T GROUP BY T.AUTHOR;

+---------+--------+--------------+

| ARTICLE | AUTHOR | MAX(T.PRICE) |

+---------+--------+--------------+

| 0002    | A      |        10.99 |

| 0001    | B      |        19.95 |

| 0003    | C      |         1.69 |

+---------+--------+--------------+

3 rows in set (0.00 sec)

mysql> SELECT * FROM T_MAX_LHR T GROUP BY T.AUTHOR;

+---------+--------+-------+

| ARTICLE | AUTHOR | PRICE |

+---------+--------+-------+

| 0002    | A      | 10.99 |

| 0001    | B      |  3.99 |

| 0003    | C      |  1.69 |

+---------+--------+-------+

3 rows in set (0.00 sec)

虽然执行不报错,可以查询出数据,但是从结果来看数据并不是最终想要的结果,甚至数据是错乱的。下面给出几种正确的写法(在Oracle和MySQL中均可执行):

(1)使用相关子查询

SELECT *

FROM T_MAX_LHR T

WHERE (T.AUTHOR, T.PRICE) IN (SELECT NT.AUTHOR, MAX(NT.PRICE) PRICE

FROM T_MAX_LHR NT

GROUP BY NT.AUTHOR)

ORDER BY T.ARTICLE;

SELECT *

FROM T_MAX_LHR T

WHERE T.PRICE = (SELECT MAX(NT.PRICE) PRICE

FROM T_MAX_LHR NT

WHERE T.AUTHOR = NT.AUTHOR)

ORDER BY T.ARTICLE;

(2)使用非相关子查询

SELECT T.*

FROM T_MAX_LHR T

JOIN (SELECT NT.AUTHOR, MAX(NT.PRICE) PRICE

FROM T_MAX_LHR NT

GROUP BY NT.AUTHOR) T1

ON T.AUTHOR = T1.AUTHOR

AND T.PRICE = T1.PRICE

ORDER BY T.ARTICLE;

(3)使用LEFT JOIN语句

SELECT T.*

FROM T_MAX_LHR T

LEFT OUTER JOIN T_MAX_LHR T1

ON T.AUTHOR = T1.AUTHOR

AND T.PRICE < T1.PRICE

WHERE T1.ARTICLE IS NULL

ORDER BY T.ARTICLE;

在Oracle中的执行结果:

LHR@orclasm > SELECT T.*

2    FROM T_MAX_LHR T

3    LEFT OUTER JOIN T_MAX_LHR T1

4      ON T.AUTHOR = T1.AUTHOR

5     AND T.PRICE < T1.PRICE

6   WHERE T1.ARTICLE IS NULL

7   ORDER BY T.ARTICLE;

ARTICLE  AUTHOR        PRICE

-------- -------- ----------

0002     A             10.99

0003     C              1.69

0004     B             19.95

在MySQL中的执行结果:

mysql> SELECT T.*

->   FROM T_MAX_LHR T

->   LEFT OUTER JOIN T_MAX_LHR T1

->     ON T.AUTHOR = T1.AUTHOR

->    AND T.PRICE < T1.PRICE

->  WHERE T1.ARTICLE IS NULL

->  ORDER BY T.ARTICLE;

+---------+--------+-------+

| ARTICLE | AUTHOR | PRICE |

+---------+--------+-------+

| 0002    | A      | 10.99 |

| 0003    | C      |  1.69 |

| 0004    | B      | 19.95 |

+---------+--------+-------+

3 rows in set (0.00 sec)

真题2、Oracle和MySQL中的分组(GROUP BY)后的聚合函数分别是什么?

答案:在Oracle中,可以用WM_CONCAT函数或LISTAGG分析函数;在MySQL中可以使用GROUP_CONCAT函数。示例如下:

首先给出建表语句:

CREATE TABLE T_MAX_LHR (ARTICLE VARCHAR2(30),AUTHOR VARCHAR2(30),PRICE NUMBER); --Oracle

--CREATE TABLE T_MAX_LHR (ARTICLE VARCHAR(30),AUTHOR VARCHAR(30),PRICE FLOAT); --MySQL oracle通用

INSERT INTO T_MAX_LHR VALUES ('0001','B',3.99);

INSERT INTO T_MAX_LHR VALUES ('0002','A',10.99);

INSERT INTO T_MAX_LHR VALUES ('0003','C',1.69);

INSERT INTO T_MAX_LHR VALUES ('0004','B',19.95);

INSERT INTO T_MAX_LHR VALUES ('0005','A',6.96);

COMMIT;

SELECT * FROM T_MAX_LHR;

在MySQL中:

mysql> SELECT T.AUTHOR, GROUP_CONCAT(T.ARTICLE), GROUP_CONCAT(T.PRICE)

->   FROM T_MAX_LHR T

->  GROUP BY T.AUTHOR;

+--------+-------------------------+-----------------------+

| AUTHOR | GROUP_CONCAT(T.ARTICLE) | GROUP_CONCAT(T.PRICE) |

+--------+-------------------------+-----------------------+

| A      | 0002,0005               | 10.99,6.96            |

| B      | 0001,0004               | 3.99,19.95            |

| C      | 0003                    | 1.69                  |

+--------+-------------------------+-----------------------+

3 rows in set (0.00 sec)

在Oracle中:

LHR@orclasm >  SELECT T.AUTHOR, WM_CONCAT(T.ARTICLE) ARTICLE, WM_CONCAT(T.PRICE)  PRICE

2    FROM T_MAX_LHR T

3   GROUP BY T.AUTHOR;

AUTHOR   ARTICLE         PRICE

-------- --------------- ---------------

A        0002,0005       10.99,6.96

B        0001,0004       3.99,19.95

C        0003            1.69

LHR@orclasm >  SELECT T.AUTHOR,

2          LISTAGG(T.ARTICLE, ',') WITHIN GROUP(ORDER BY T.PRICE) ARTICLE,

3          LISTAGG(T.PRICE, ',') WITHIN GROUP(ORDER BY T.PRICE) PRICE

4     FROM T_MAX_LHR T

5    GROUP BY T.AUTHOR;

AUTHOR   ARTICLE         PRICE

-------- --------------- ---------------

A        0005,0002       6.96,10.99

B        0001,0004       3.99,19.95

C        0003            1.69

原作者不知道是谁了,这个图不是小麦苗画的。

oracle和mysql查询_Oracle和MySQL分组查询GROUP BY相关推荐

  1. MySQL对数据表进行分组查询(GROUP BY)

    MySQL对数据表进行分组查询(GROUP BY) GROUP BY关键字可以将查询结果按照某个字段或多个字段进行分组.字段中值相等的为一组.基本的语法格式如下: GROUP BY 属性名 [HAVI ...

  2. Python之Pandas:利用Pandas函数实现对表格文件的查之高级查询(类似sql,分组查询等)之详细攻略

    Python之Pandas:利用Pandas函数实现对表格文件的查之高级查询(类似sql,分组查询等)之详细攻略 目录 利用Pandas函数实现对表格文件的查之高级查询(类似sql) 1.分组查询

  3. oracle 与mysql查询_oracle与mysql分页查询语句sql

    如果我们是通过JDBC的方式访问数据库,那么就有必要根据数据库类型采取不同的SQL分页语句,对于MySql数据库,我们可以采用limit语句进行分页,对于Oracle数据库,我们可以采用rownum的 ...

  4. 一、MySQL查询学习笔记(基础查询、条件查询、排序查询、常见函数、分组查询 详解)

    DQL语言的学习 一.基础查询 语法: **SELECT 要查询的东西 [FROM 表名];**类似于Java中 :System.out.println(要打印的东西); 特点: ①通过select查 ...

  5. mysql怎么分组查询所有数据库_Mysql-4 分组查询与子查询

    1.查询结果的分组操作 a.分组允许把数据分为多个组,以便能对每个组进行聚集计算 b.分组是在select语句的group by 子句中建立的 注意:group by 只是创建分组,但并不保证分组里面 ...

  6. mysql的查询、子查询、连接查询、groud by分组查询

    一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组).order by(排序).limit(限制结果数)  1.where常用运算符: 比较运算符 &g ...

  7. MySQL查询的进阶操作--分组查询

    目录 分组查询介绍 案例 一般案例 添加筛选条件的案例 分组后添加筛选条件案例 按表达式或函数分组案例 按多个字段分组案例 添加排序案例 分组查询介绍 3.group by 子句支持单个字段分组,多个 ...

  8. orcle mysql 查询_Oracle与Mysql的高级查询与难点sql

    一.连接查询 1. 内连接 内连接用于返回满足连接条件的所有记录.默认情况下,在执行连接查询时如果没有指定任何连接操作符,那么这些连接查询都属于内连接. Sql 代码 1. SELECT a.dnam ...

  9. java oracle数据库高效分页查询_Oracle学习之分页查询数据

    Oracle的分页是不同于MySQL的,今天我们来讨论一下Oracle的分页,首先得知道两个概念 rowid和rownum 什么鬼?有鸟用啊? 我们从字面的英文翻译可以知道rowid是 "行 ...

  10. oracle从入门到精通(4)------运算符,分组查询,函数

    oracle入门到精通(4) --------------------------------------------- 1.运算符 2.分组查询 3.函数 --------------------- ...

最新文章

  1. 浏览器拦截弹出窗口 IE Firefox……浏览器
  2. 1024. 科学计数法 (20)
  3. NuGet:添加EntityFramework
  4. 学java里面包括php_【学习java和PHP区别你知道多少】
  5. (转)解决Google Adsense广告只显示英文的问题
  6. Android 高效开发调试神器 JRebel
  7. python双线性插值函数_OpenCV ——双线性插值(Bilinear interpolation)
  8. hikaricp mysql_JAVA连接数据库 #03# HikariCP
  9. Qt:QtFileDialog打开文件选择对话框选择文件
  10. mybatis中获取当前时间_MySQL NOW和SYSDATE函数:获取当前时间日期
  11. Android 9.0打开wifi时关闭热点流程
  12. oracle查询是否包含英文字符串,oracle字符串载取及判断是否包含指定字符串
  13. C fork introduce
  14. python 白噪声检验-Python中的白噪声时间训练
  15. ClassNames
  16. 我的世界服务器拔刀修复,我的世界拔刀剑怎么修复武器攻略分享
  17. python获取小图在大图中的坐标和相似度
  18. C++整型int转字符串string
  19. python将汉字转为拼音字母_科学网—[转载]python中文汉字转拼音 - 陈明杰的博文...
  20. 一缕黑暗中的火光-----------UML事物--------------优雅的建模语言

热门文章

  1. XP与Ubuntu双系统的问题
  2. 监测磁盘文件是否被修改程序
  3. 给eth0增加一个IP
  4. 单核工作法18:简化协作(下)
  5. 科大星云诗社动态20210806
  6. 【云炬mysql数据库笔记】 Work1
  7. 云炬Android开发笔记 使用新版本Android studio快速Build低版本项目的仓库代码(标红部分)
  8. MNIST机器学习入门(学习记录)——1
  9. Go进阶(9): For Range 性能研究
  10. VTK修炼之道21:图像基本操作_彩色图像生成灰度图像