用distinct关键字只能过滤查询字段中所有字段内容相同的(记录集相同),另外distinct关键字会排序,效率很低。
如:
select distinct name from t1 能消除重复记录,但只能取一个字段,现在要同时取id,name这2个字段的值。 select distinct id,name from t1 可以取多个字段,但只能消除这2个字段值全部相同的记录 所以用distinct达不到想要的效果,用group by 可以解决这个问题。 例如要显示的字段为A、B、C三个,而A字段的内容不能重复可以用下面的语句: select A, min(B),min(C),count(*) from [table] where [条件] group by A having [条件] order by A desc 为了显示标题头好看点可以把select A, min(B),min(C),count(*) 换称select A as A, min(B) as B,min(C) as C,count(*) as 重复次数 显示出来的字段和排序字段都要包括在group by 中 但显示出来的字段包有min,max,count,avg,sum等聚合函数时可以不在group by 中 如上句的min(B),min(C),count(*) 一般条件写在where 后面 有聚合函数的条件写在having 后面 如果在上句中having加 count(*)>1 就可以查出记录A的重复次数大于1的记录 如果在上句中having加 count(*)>2 就可以查出记录A的重复次数大于2的记录 如果在上句中having加 count(*)>=1 就可以查出所有的记录,但重复的只显示一条,并且后面有显示重复的次数----这就是所需要的结果,而且语句可以通过hibernate
查询出那些数据是重复的: select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1 将上面的>号改为=号就可以查询出没有重复的数据了。
(1).
wm_concat(column)函数实现字段合并。
shopping:
-----------------------------------------
u_id goods num
------------------------------------------
1 苹果 2
2 梨子 5
1 西瓜 4
3 葡萄 1
3 香蕉 1
1 橘子 3
=======================
想要的结果为:
--------------------------------
u_id goods_sum
____________________
1 苹果,西瓜,橘子
2 梨子
3 葡萄,香蕉
---------------------------------
select u_id, wmsys.wm_concat(goods) goods_sum
from shopping
group by u_id
想要的结果2:
--------------------------------
u_id goods_sum
___________________
1 苹果(2斤),西瓜(4斤),橘子(3斤)
2 梨子(5斤)
3 葡萄(1斤),香蕉(1斤)
---------------------------------
使用oracle wm_concat(column)函数实现:
select u_id, wmsys.wm_concat(goods || '(' || num || '斤)' ) goods_sum
from shopping
group by u_id
(2)
把多行转换 wmsys.wm_concat //数据库内部函数:把多行转换成一合并列
例如:
select b.fchannel_id from sinocms_bindle_channel b where b.channel_id='1000000027'
结果:
1 1000000029
2 1000000030
3 1000000031
4 1000000032
5 1000000033
6 1000000034
把多行转换成一合并列
select wmsys.wm_concat(b.fchannel_id) from sinocms_bindle_channel b where b.channel_id='1000000027'
结果:1000000029,1000000030,1000000031,1000000032,1000000033,1000000034
====
=====
4、说明:创建新表
create table tabname(col1 type1 [not null][primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
=======================================================
=========================================================
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
1.按姓氏笔画排序:
Select * From TableName Order ByCustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多