SQL如何使用order by语句查询数据表的多字段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL如何使用order by语句查询数据表的多字段相关的知识,希望对你有一定的参考价值。
假如我有一个数据表tab,里面有id、name,number,规格,部门等字段,现在我需要查询出所有字段的数据,并且按nane和number进行分组,请问sql语句怎么写啊?
是group by
先说说ORDER BY和GROUP BY的功能
假设一个表tab有一个id字段、一个Name字段,内容如下
id Name
3 张三
5 李四
1 王五
1 赵六
ORDER BY是排序
select id from tab order by id这条SQL的结果应该是
id
1
1
3
5
GROUP BY是分组,相同的组别仅显示一次
select id from tab group by id这条SQL的结果应该是
id
1
3
5
另外在select后接N个字段,比如id,Name两个字段,然后Group By后接id
select id,Name from tab group by id这样的SQL是会报错的,因为你必须将group by以外的字段,用聚合函数聚合起来(如max,min,Count等)
然后回到上面的问题:
如果题主的原意是用GROUP BY,按nane和number字段分组,那么其他字段你打算如何聚合,是用MAX取最大值、MIN取最小值、Count统计出现的次数、还是利用自定义函数(mysql和ORACL有系统自带函数)来将其拼接文本
如果题主的原意是用ORDER BY,按nane和number字段排序
--ASC是正序排列,DESC是倒序排列,不填写的情况下默认ASC
我是想用group by,而且其他字段我只需要原样输出就可以了,不做处理,其他字段是字符型的,也不能使用聚合函数
我是想用group by,而且其他字段我只需要原样输出就可以了,不做处理,其他字段是字符型的,也不能使用聚合函数
追答id Name
3 张三
5 李四
1 王五
1 赵六
拿这个例子说:比如group by id,那么id = 1的记录将仅显示一次,这条记录里面的Name字段如何显示,是显示'王五'还是'赵六'或者是'王五,赵六'这些都是必须在SELECT后面指明的,否则SQL就会报错。当然如果你不显示Name字段,自然就没有这个问题了。
ORDER BY 语句默认按照升序对记录进行排序。
如果您希望按照降序对记录进行排序,可以使用 DESC 关键字。
例子详解:
原始的表 (用在例子中的):
Orders 表:
Company OrderNumber
IBM 3532
Apple 4698
例子
以字母顺序显示公司名称:
SELECT Company, OrderNumber FROM Orders ORDER BY Company
结果:
Company OrderNumber
Apple 4698
IBM 3532 参考技术B order by是排序 group by 是分组
select * from tab group by name,number追问
提示列id无效,没有包含在聚合函数或group by子句中
追答你用的是什么数据库,或者说你的表是不是有问题呢?这个在access和mysql中都是很正常的。
追问我用的是用sql数据库
追答那你试试用group_concat()来写写试试
select id,name,number,group_concat('规格'),group_concat('部门') from tab group by name,number
这样试试,有可能是按二个字段分类会有这种问题吧。不过mysql里到是没有发现过这个问题。
谢谢,我先试试看
NumberFormatException: Invalid int类型不匹配异常——使用SQL数据库查询语句select * from blacknumber order by _id desc l
异常:类型不匹配
05-06 08:12:38.151: E/AndroidRuntime(14904): java.lang.NumberFormatException: Invalid int: "18600000099"
05-06 08:12:38.151: E/AndroidRuntime(14904): at com.itheima.mobilesafe74.activity.BlackNumberActivity$Myadapter.getView(BlackNumberActivity.java:122)
1 public List<BlackNumberInfo> find(int index) 2 { 3 // 先要拿到数据库对象 4 SQLiteDatabase db = blackNumberOpenHelper.getWritableDatabase(); 5 // db.rawQuery()中第一个参数就是sql语句,第二个参数是?对应的值 6 Cursor cursor = db.rawQuery("select * from blacknumber order by _id desc limit ?,20;", new String[]{index+""}); 7 // 为了一次性拿到所有查到的字段,创建一个集合封装 8 List<BlackNumberInfo> blackNumberList = new ArrayList<BlackNumberInfo>(); 9 while (cursor.moveToNext()) 10 { 11 // 将查询的两个字段封装到一个java bean中 12 BlackNumberInfo blackNumberInfo = new BlackNumberInfo(); 13 blackNumberInfo.phone = cursor.getString(0); 14 blackNumberInfo.mode = cursor.getString(1); 15 // 每次循环都将这个Javabean封装到集合中 16 blackNumberList.add(blackNumberInfo); 17 } 18 cursor.close(); 19 db.close(); 20 return blackNumberList; 21 }
代码第六行
select * from blacknumber
代表查询所有的字段
而
数据库中的字段有_id,phone,mode三个
所以当调用代码13,14行
blackNumberInfo.phone = cursor.getString(0);
blackNumberInfo.mode = cursor.getString(1);
0对应的其实是_id而不是phone
1对应的其实是phone而不是mode
所以出现问题
修改SQL查询语句解决这个问题:
第六行改为
Cursor cursor = db.rawQuery("select phone,mode from blacknumber order by _id desc limit ?,20;", new String[]{index+""});
即可
以上是关于SQL如何使用order by语句查询数据表的多字段的主要内容,如果未能解决你的问题,请参考以下文章
当sql语句中where,order by,group by同时使用查询sql语句中三者的顺序
SQL数据库中查询语句Order By和Group By有啥区别
在SQL Server的子查询视图内联函数等数据库对象中,不应该单独使用ORDER BY语句