order
by
是按表中某字段排列表中数据
group
by
是按某些字段分类。
例如按
1按年龄排序表中的记录
select
from
users
order
by
age
2按年龄分类表中数据
(就是求各个年龄的人数)
select
age,count()
as
number1
from
users
group
by
age
#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id"2 $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id3 #方式能够很大程度防止sql注入。4$方式无法防止Sql注入。5$方式一般用于传入数据库对象,例如传入表名6一般能用#的就别用$MyBatis排序时使用order by 动态参数时需要注意,用$而不是#字符串替换默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:ORDER BY ${columnName}这里MyBatis不会修改或转义字符串。重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。
使用order by会引发全局排序
select from baidu_click order by click desc;
使用distribute和sort进行分组排序
select from baidu_click distribute by product_line sort by click desc;
distribute by + sort by就是该替代方案,被distribute by设定的字段为KEY,数据会被HASH分发到不同的reducer机器上,然后sort by会对同一个reducer机器上的每组数据进行局部排序。
order
by
排序查询、asc升序、desc降序
示例:
select
from
学生表
order
by
年龄
查询学生表信息、按年龄的升序(默认、可缺省、从低到高)排列显示
也可以多条件排序、
比如
order
by
年龄,成绩
desc
按年龄升序排列后、再按成绩降序排列
group
by
分组查询、having
只能用于group
by子句、作用于组内,having条件子句可以直接跟函数表达式。使用group
by
子句的查询语句需要使用聚合函数。
示例:
select
学号,SUM(成绩)
from
选课表
group
by
学号
按学号分组、查询每个学号的总成绩
select
学号,AVG(成绩)
from
选课表
group
by
学号
having
AVG(成绩)>(select
AVG(成绩)
from
选课表
where
课程号='001')
order
by
AVG(成绩)
desc
查询平均成绩大于001课程平均成绩的学号、并按平均成绩的降序排列
group
by
是按。。。分组的意思,order
by
是按。。。排序的意思
group
by
单词就是将表按单词分成几个组
order
by
A,B,C
就是
先按A排序,再按B排序,再按C排序
Hive基于HADOOP来执行分布式程序的,和普通单机程序不同的一个特点就是最终的数据会产生多个子文件,每个reducer节点都会处理partition给自己的那份数据产生结果文件,这导致了在HADOOP环境下很难对数据进行全局排序,如果在HADOOP上进行order
by全排序,会导致所有的数据集中在一台reducer节点上,然后进行排序,这样很可能会超过单个节点的磁盘和内存存储能力导致任务失败。
一种替代的方案则是放弃全局有序,而是分组有序,比如不求全百度最高的点击词排序,而是求每种产品线的最高点击词排序。
使用order
by会引发全局排序
select
from
baidu_click
order
by
click
desc;
使用distribute和sort进行分组排序
select
from
baidu_click
distribute
by
product_line
sort
by
click
desc;
distribute
by
+
sort
by就是该替代方案,被distribute
by设定的字段为KEY,数据会被HASH分发到不同的reducer机器上,然后sort
by会对同一个reducer机器上的每组数据进行局部排序。
order
by是全局有序而distribute+sort是分组有序
distribute+sort的结果是按组有序而全局无序的,输入数据经过了以下两个步骤的处理:
1)
根据KEY字段被HASH,相同组的数据被分发到相同的reducer节点;
2)
对每个组内部做排序
由于每组数据是按KEY进行HASH后的存储并且组内有序,其还可以有两种用途:
1)
直接作为HBASE的输入源,导入到HBASE;
2)
在distribute+sort后再进行orderby阶段,实现间接的全局排序;
不过即使是先distribute
by然后sort
by这样的 *** 作,如果某个分组数据太大也会超出reduce节点的存储限制,常常会出现137内存溢出的错误,对大数据量的排序都是应该避免的。
以上就是关于sql order by 和游标的区别。全部的内容,包括:sql order by 和游标的区别。、mybatis的#和$的区别以及order by注入问题、Hive sql下的Order by和Sort by的区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)