sql分组

MySql下实现先排序后分组

心不动则不痛 提交于 2020-01-16 02:31:36
对比可以发现5.7版本的MySql在执行这条sql时缺少了一个derived操作,通过查阅相关资料了解到MySql 5.7对子查询进行了优化,认为子查询中的order by可以进行忽略,只要Derived table里不包含如下条件就可以进行优化: UNION clause GROUP BY DISTINCT Aggregation LIMIT or OFFSET 这里把链接放上:5.7中Derived table变形记 最后放上相应的解决办法: --方法一,仅适用于低于5.7版本的MySql-- select * from (select * from shop order by price desc) a GROUP BY a.shop_name; --方法二-- select * from (select * from shop order by price desc limit 999999) a GROUP BY a.shop_name; --方法三-- select * from shop a where N > (select count(*) from shop b where b.shop_name = a.shop_name and a.price < b.price) order by a.shop_name,a.price desc; 1 2 3 4 5 6

如何在交易数据中查询各个版本交易量前三的股票?(MySQL分组排名)

安稳与你 提交于 2020-01-15 00:54:19
SQL查询中,根据列A分组,分组后针对列B执行统计函数,是一件常用也很重要功能,如 select T.a, max(T.b) from T order by T.a asc, T.b desc group by T.a select T.a, count(T.b) from T order by T.a asc, T.b desc group by T.a 一直这样写SQL,直到有一天,一个做股票的朋友(非IT人事)和我聊天,说他自己用Python整了点数据,想分析下每个版块成交量前三的股票,问我知不知道怎么用SQL查出来(这是一个分组排名取若干首级的需求)。老实说,这个问题很常见,但是脑子刹那间有点懵逼,回来的路上一直想这个问题,若干年前用SQLServer时,有个分组方法ROW_NUMBER() OVER(),貌似可以实现这个分组排名功能。 语法格式:row_number() over(partition by 分组列 order by 排序列 desc) 与是网上搜了下MySQL 的实现,果然一堆朋友记录过。参照了一篇CSDN微博“ Mysql实现ROW_NUMBER() OVER() ” 的内容,将实现过程记录如下。 先看下表结构: view_market_trade_amt有三列,第一列是指数,第二列是股票代码,第三列是成交量。 需求是将各个指数板块的成交前三的股票查出来

MySQL之指定过滤条件(HAVING)

非 Y 不嫁゛ 提交于 2020-01-12 11:21:45
在 MySQL SELECT 语句中,除了能使用 GROUP BY 子句分组数据外,还可以使用 HAVING 子句过滤分组,在结果集中规定了包含哪些分组和排除哪些分组。 语法格式如下: HAVING <条件> 其中, <条件> 指的是指定的过滤条件。 HAVING 子句和 WHERE 子句非常相似,HAVING 子句支持 WHERE 子句中所有的操作符和语法,但是两者存在几点差异: WHERE 子句主要用于过滤数据行,而 HAVING 子句主要用于过滤分组,即 HAVING 子句基于分组的聚合值而不是特定行的值来过滤数据,主要用来过滤分组。 WHERE 子句不可以包含聚合函数,HAVING 子句中的条件可以包含聚合函数。 HAVING 子句是在数据分组后进行过滤,WHERE 子句会在数据分组前进行过滤。WHERE 子句排除的行不包含在分组中,可能会影响 HAVING 子句基于这些值过滤掉的分组。 【实例】根据 dept_id 对 tb_students_info 表中的数据进行分组,并显示学生人数大于1的分组信息,输入的 SQL 语句和执行结果如下所示。 不进行HAVING条件过滤查询结果如下: 来源: https://www.cnblogs.com/ccstu/p/12182111.html

MySQL之分组查询(GROUP BY)

﹥>﹥吖頭↗ 提交于 2020-01-12 11:04:23
在 MySQL SELECT 语句中,允许使用 GROUP BY 子句,将结果集中的数据行根据选择列的值进行逻辑分组,以便能汇总表内容的子集,实现对每个组而不是对整个结果集进行整合。 语法格式如下: GROUP BY { <列名> | <表达式> | <位置> } [ASC | DESC] 语法说明如下: <列名> :指定用于分组的列。可以指定多个列,彼此间用逗号分隔。 <表达式> :指定用于分组的表达式。通常与聚合函数一块使用,例如可将表达式 COUNT(*)AS' 人数 ' 作为 SELECT 选择列表清单的一项。 <位置> :指定用于分组的选择列在 SELECT 语句结果集中的位置,通常是一个正整数。例如,GROUP BY 2 表示根据 SELECT 语句列清单上的第 2 列的值进行逻辑分组。 ASC|DESC :关键字 ASC 表示按升序分组,关键字 DESC 表示按降序分组,其中 ASC 为默认值,注意这两个关键字必须位于对应的列名、表达式、列的位置之后。 注意:GROUP BY 子句中的各选择列必须也是 SELECT 语句的选择列清单中的一项。 对于 GROUP BY 子句的使用,需要注意以下几点。 GROUP BY 子句可以包含任意数目的列,使其可以对分组进行嵌套,为数据分组提供更加细致的控制。 GROUP BY 子句列出的每个列都必须是检索列或有效的表达式

MySQL基础知识点大全

守給你的承諾、 提交于 2020-01-11 20:24:35
一、为什么要学习数据库 二、数据库的相关概念 DBMS、DB、SQL 三、数据库存储数据的特点 四、初始MySQL MySQL产品的介绍 MySQL产品的安装 ★ MySQL服务的启动和停止 ★ MySQL服务的登录和退出 ★ MySQL的常见命令和语法规范 五、DQL语言的学习 ★ 基础查询 ★ 条件查询 ★ 排序查询 ★ 常见函数 ★ 分组函数 ★ 分组查询 ★ 连接查询 ★ 子查询 √ 分页查询 ★ union联合查询 √ 六、DML语言的学习 ★ 插入语句 修改语句 删除语句 七、DDL语言的学习 库和表的管理 √ 常见数据类型介绍 √ 常见约束 √ 八、TCL语言的学习 事务和事务处理 九、视图的讲解 √ 十、变量 十一、存储过程和函数 十二、流程控制结构 数据库的好处 1.持久化数据到本地 2.可以实现结构化查询,方便管理 数据库相关概念 1、DB:数据库,保存一组有组织的数据的容器 2、DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据 3、SQL:结构化查询语言,用于和DBMS通信的语言 数据库存储数据的特点 1、将数据放到表中,表再放到库中 2、一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。 3、表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。 4、表由列组成,我们也称为字段

group by 的实现原理

筅森魡賤 提交于 2020-01-10 20:50:41
转载: https://cloud.tencent.com/developer/article/1513067 写过 Sql 的同学应该都知道 group by 是用来对数据进行分组的,一般与聚合函数一起使用,对分组后的数据进行聚合。虽然大家都在用,但是有些同学还是不太清楚 group by 的底层到底是如何实现分组并且最后进行聚合的。今天就讲讲 group by 的底层实现。 我们直接来看例子,下面有一张表 t,存储了不同日期对应的不同品类的销量,具体数据如下: 现在我们要统计2019年1月1到1月3期间没每个品类的总销量,这个需求我们就可以用 group by 来实现,实现代码如下: select cat ,sum(sales) from t where sale_date between "2019/1/1" and "2019/1/3" group by cat 上面代码中的 group by 具体执行过程是什么样子的呢?我们看一下下面这这张图。 通过上图我们可以看出 group by 会对所有的数据先根据 cat 字段进行分组,然后针对分组后的数据在组内进行聚合运算(计数、求和、求均值等),最后再将聚合后的每组数据进行汇总就得到了我们想要的结果。在上图中大家应该看到了分组模块只有 cat 这一列是标红加粗,sale_date 和 sales 这两列是比较虚的字体

SQL语句--分组的Top查询

白昼怎懂夜的黑 提交于 2020-01-10 03:33:34
分组的Top查询: 代码 SELECT ROW_NUMBER() OVER (order by a.Host,EnterTimes DESC)as RowNumber,--SELECT IDENTITY(int,1,1) as RowNumber,a.Host,a.PageURL,a.EnterTimes,a.BounceTimes INTO #TempEntryUrlListFROM( SELECT Host --Host ,EntranceURL as PageURL --页面地址 ,count(EntranceURL) as EnterTimes --进入次数 ,sum(CASE WHEN IsBounce=1 THEN 1 ELSE 0 END ) AS BounceTimes --跳出次数 FROM UserLoyalty WITH(nolock) GROUP BY Host,EntranceURL) a 需要对以上#TempEntryUrlList临时表做查询:按照Host分组,查询每个Host的EnterTimes的Top 100数据: 代码 Select *FROM #TempEntryUrlList AWhere EXISTS (SELECT COUNT(1) FROM #TempEntryUrlList WHERE Host = A.Host AND

SQL语句之-计算字段/分组

孤人 提交于 2020-01-09 04:29:09
五、计算字段 1、拼接字段 MySQL:使用函数concat SqlServer:使用加号+ oracle:使用|| SELECT CONCAT(vend_name,'(',vend_country,')') FROM vendors ORDER BY vend_name 使用别名AS SELECT CONCAT(vend_name,'(',vend_country,')') AS vend_title FROM vendors ORDER BY vend_name 2、算数计算:支持+、—、*、/,用()区分优先级 SELECT prod_id,quantity,item_price, quantity*item_price AS expanded_price FROM orderitems WHERE order_num = 20008 六、分组 1、过滤分组 WHERE过滤行,而HAVING过滤分组。 SELECT vend_id, COUNT(*) AS num_prods FROM products GROUP BY vend_id; SELECT cust_id,COUNT(*) AS num_orders FROM orders GROUP BY cust_id HAVING COUNT(*)>=2; SELECT vend_id,prod_price,COUNT(*

SQL分组查询

末鹿安然 提交于 2020-01-09 01:05:19
SQL分组查询 一.分组查询 1.使用group by进行分组查询 在使用group by关键字时,在select列表中可以指定的项目是有限制的, select语句中仅许以下几项 : 被分组的列 为每个分组返回一个值得表达式,例如用一个列名作为参数的聚合函数 group by的使用在这只写几个例子吧: 例1: select courseID,avg(score) as 课程平均成绩 from score group by courseID 例2: select studentID as 学员编号,courseID as 内部测试,avg(score) as 内部测试平均成绩 from score group by studentID,courseID 2.使用having子句进行分组筛选 where子句只能对没有分组统计前的数据行进行筛选,对分组后的条件的筛选必须使用having子句 例: select studentID as 学员编号,courseID as 内部测试,avg(score) as 内部测试平均成绩 from score group by studentID,courseID having avg(score)>60 在select语句中,where、group by、having子句和统计函数的执行次序如下: where子句从数据源中去掉不符合去搜索条件的数据

SQL Server T-SQL高级查询

情到浓时终转凉″ 提交于 2020-01-08 11:48:59
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 高级查询在数据库中用得是最频繁的,也是应用最广泛的。 Ø 基本常用查询 --select select * from student; --all 查询所有 select all sex from student; --distinct 过滤重复 select distinct sex from student; --count 统计 select count(*) from student; select count(sex) from student; select count(distinct sex) from student; --top 取前N条记录 select top 3 * from student; --alias column name 列重命名 select id as 编号, name '名称', sex 性别 from student; --alias table name 表重命名 select id, name, s.id, s.name from student s; --column 列运算 select (age + id) col from student; select s.name + '-' + c.name from classes c, student s