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字段排序



    select * from tab ordey by name ASC,number ASC
    --ASC是正序排列,DESC是倒序排列,不填写的情况下默认ASC

追问

我是想用group by,而且其他字段我只需要原样输出就可以了,不做处理,其他字段是字符型的,也不能使用聚合函数

我是想用group by,而且其他字段我只需要原样输出就可以了,不做处理,其他字段是字符型的,也不能使用聚合函数

追答

id Name
3 张三
5 李四
1 王五
1 赵六
拿这个例子说:比如group by id,那么id = 1的记录将仅显示一次,这条记录里面的Name字段如何显示,是显示'王五'还是'赵六'或者是'王五,赵六'这些都是必须在SELECT后面指明的,否则SQL就会报错。当然如果你不显示Name字段,自然就没有这个问题了。

参考技术A ORDER BY 语句用于根据指定的列对结果集进行排序。

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语句

oracle中在in子查询语句中order by排序能否用?

sql ORDER BY 多个字段,排序变慢几十倍,求解?

sql语句order by 用法,自定义规则