SQL语句分组排序,多表关联排序
SQL语句分组排序,多表关联排序总结几种常见的方法:
案例一:
在查询结果中按人数降序排列,若人数相同,则按课程号升序排列?
分析:单个表内的多个字段排序,一般可以直接用逗号分割实现。
select * from tableA order by col1 desc,col2 asc;
-- 先按col1降序,相同则按col2 升序
案例二:
T-SQL查询班级信息:班级人数+班级信息,按人数多少排序?
-- 创建测试数据
create table stu(sid int primary key identity(1,1),sname varchar(50),sage int,scid int foreign key references class(cid))
create table class(cid int primary key identity(1,1),code varchar(50),cname varchar(50),cgrade varchar(50))
insert into stu values('张三',19,1)
insert into stu values('李四',20,2)
insert into stu values('王五',21,2)
insert into class values('c001','','一年级')
insert into class values('c002','','一年级') -- 按人数分组排序查询
select
class.cgrade,
class.code,
class.cname,
count(stu.sid) as 人数
from
class JOIN stu
ON (class.cid = stu.scid)
group by
class.cgrade,
class.code,
class.cname
order by
count(stu.sid) desc
案例三:
SQL 查询统计每个用户组发文章数量并按数量排序?
有三个表 文章表 记录文章标题、内容、发布人 发布时间,用户表 记录用户组id 用户名 密码,用户组表 记录id 用户组名称
问题是 现在要查询每个用户组发布文章的数量,并且按着数量排序。不知道怎么搞呀 大神们
还要查询 每个月中发文排行榜....
SELECT COUNT(1) AS 数量, c.用户组名称
FROM 文件表 a INNER JOIN 用户表 b ON a.发布人 = b.用户名
INNER JOIN 用户组表 c ON b.用户组id = c.id
GROUP BY c.id, c.用户组名称
ORDER BY 数量
案例四:“圈子广场”页面需要展示圈子列表,查询某类型圈子,其中需要按圈子名称搜索,同时按照圈子人数排序。
数据库表结构大致如下:
圈子表“CMSocial”,字段包括:圈子主键 CMSocialID,圈子名称 SocialName,圈子状态 SocialState等;
圈子类型关系表“CMSocialCategoryRelation”,字段包括 关系主键 CMSocialCategoryRelationID,圈子类型外键 CMSocialCategoryID,圈子外键 CMSocialID;
圈子成员表“CMSocialMember”,字段包括:关系主键 CMSocialMemberID,成员外键 MemberID,圈子外键 CMSocialID,圈子成员状态 MemberState等;
USE [Community]; SELECT
S.CMSocialID,
S.SocialName,
S.SocialDescription,
S.SocialLogo,
S.SocialAuthority,
S.SocialOwner,
S.Integral,
S.SocialState,
S.IsAvailable,
COUNT(DISTINCT SM.CMSocialMemberID) AS 'MemberNumber' /*圈子成员数*/
FROM CMSocial AS S
INNER JOIN (SELECT DISTINCT CMSocialID FROM CMSocialCategoryRelation WHERE CMSocialCategoryID IN('','')) AS SCR ON S.CMSocialID = SCR.CMSocialID /*内连接圈子类型*/
LEFT JOIN (SELECT * FROM CMSocialMember WHERE CMSocialMember.IsDelete<>1 AND CMSocialMember.IsAvailable=1) AS SM ON S.CMSocialID = SM.CMSocialID /*左连接圈子成员*/
WHERE S.IsAvailable=1 AND S.SocialState=0 AND S.SocialName LIKE N'%创业圈%' /*圈子名称匹配查询*/
GROUP BY
S.CMSocialID,
S.SocialName,
S.SocialDescription,
S.SocialLogo,
S.SocialAuthority,
S.SocialOwner,
S.Integral,
S.SocialState,
S.IsAvailable
ORDER BY
COUNT(DISTINCT SM.CMSocialMemberID) DESC; /*圈子成员数排序*/
SQL 2005版本以后支持ROW_NUMBER()获取行号,于是进一步升级,使他支持分页,支持记录总数:
参考:
/* 最内层输入分页参数之前靠count(*) over ()获得记录总数,然后把这个值作为记录的一列传出来。*/
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT
c1,
c2,
count(*) over () tot_cnt
FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
这里总结一个SQL分页的万能SQL语句分页壳子
USE [Community]; DECLARE @pageindex INT /*页码*/
DECLARE @pagesize INT /*页数据量*/
SELECT @pageindex = 3,@pagesize = 1 SELECT A.*
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY ASub.ID DESC) AS RowNumber,* FROM
(
…… /*这里写自己的查询语句*/
) AS ASub
) AS A
WHERE RowNumber BETWEEN ((@PageIndex-1)*(@PageSize) + 1) AND (@PageIndex)*(@PageSize)
整合上面的分页SQL语句壳子,实现分页效果:
USE [Community]; DECLARE @pageindex INT /*页码*/
DECLARE @pagesize INT /*页数据量*/
SELECT @pageindex = 3,@pagesize = 1 SELECT A.*
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY ASub.MemberNumber DESC) AS RowNumber,* FROM
(
SELECT
S.CMSocialID,
S.SocialName,
S.SocialDescription,
S.SocialLogo,
S.SocialAuthority,
S.SocialOwner,
S.Integral,
S.SocialState,
S.IsAvailable,
COUNT(DISTINCT SM.CMSocialMemberID) AS 'MemberNumber', /*圈子成员数*/
COUNT(*) OVER() 'RecordNumber' /*结果总数*/
FROM CMSocial AS S
INNER JOIN (SELECT DISTINCT CMSocialID FROM CMSocialCategoryRelation WHERE CMSocialCategoryID IN('','')) AS SCR ON S.CMSocialID = SCR.CMSocialID /*内连接圈子类型*/
LEFT JOIN (SELECT * FROM CMSocialMember WHERE CMSocialMember.IsDelete<>1 AND CMSocialMember.IsAvailable=1) AS SM ON S.CMSocialID = SM.CMSocialID /*左连接圈子成员*/
WHERE S.IsAvailable=1 AND S.SocialState=0 AND S.SocialName LIKE N'%创业圈%' /*圈子名称匹配查询*/
GROUP BY
S.CMSocialID,
S.SocialName,
S.SocialDescription,
S.SocialLogo,
S.SocialAuthority,
S.SocialOwner,
S.Integral,
S.SocialState,
S.IsAvailable
) AS ASub
) AS A
WHERE RowNumber BETWEEN ((@PageIndex-1)*(@PageSize) + 1) AND (@PageIndex)*(@PageSize)
SQL语句分组排序,多表关联排序的更多相关文章
- sql语句之条件,分页,排序
sql语句之条件,分页,排序
- 使用SQL语句清空数据库所有表的数据
使用SQL语句清空数据库所有表的数据 近来发现数据库过大,空间不足,因此打算将数据库的数据进行全面的清理,但表非常多,一张一张的清空,实在麻烦,因此就想利用SQL语句一次清空所有数据.找到了三种方法进 ...
- 使用sql语句复制一张表
如何使用sql语句复制一张表? 方法一:第一步:先建一张新表,新表的结构与老表相等. create table newbiao like chengjibiao(老表名); 第二步:将老表中的值复制到 ...
- sql 语句 获取某张表某列字段最短的某几行数据
sql 语句 获取某张表某列字段最短的某几行数据 SELECT C_name,C_code FROM Catalog where LEN(C_code)=LEN((SELECT top 1 C_cod ...
- 【转载】C#常用数据库Sqlserver通过SQL语句查询数据库以及表的大小
在Sqlserver数据库中,一般我们查看数据库的大小可以通过查找到数据库文件来查看,但如果要查找数据表Table的大小的话,则不可通过此方法,在Sqlserver数据库中,提供了相应的SQL语句来查 ...
- mysql / pgsql 使用sql语句查询数据库所有表注释已经表字段注释
mysql使用sql语句查询数据库所有表注释已经表字段注释(转载) 场景: 1. 要查询数据库 "mammothcode" 下所有表名以及表注释 /* 查询数据库 ‘mammo ...
- 使用Sql语句快速将数据表转换成实体类
开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...
- 查看oracle的sql语句历史记录和锁表的情况
查看oracle的sql语句历史记录和锁表的情况 (2012-01-04 20:59:59) 转载▼ 标签: 杂谈 分类: database 查询sql的历史记录 select * from v$sq ...
- 使用sql语句备份一张表
如何使用sql语句复制一张表? 方法一:第一步:先建一张新表,新表的结构与老表相等. create table newtable like oldtable; 第二步:将老表中的值复制到新标中. in ...
随机推荐
- Android5.1.1 - APK签名校验分析和修改源码绕过签名校验
Android5.1.1 - APK签名校验分析和修改源码绕过签名校验 作者:寻禹@阿里聚安全 APK签名校验分析 找到PackageParser类,该类在文件“frameworks/base/cor ...
- 浅谈Android应用保护(零):出发点和背景
近几年来,无线平台特别是Android平台的安全逐渐成为各厂商关注的重点.各种新的思路和玩法层出不穷.所以,笔者基于前一段时间的学习和整理,写了这系列关于Android应用安全和保护的文章. 这5篇文 ...
- js模块化历程
这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生与变迁,展望ES6模块化标准的未来.经历过这段历史的人或许会感到沧桑,没经历过的人也应该知道这段历史. 无模块时代 在ajax还未提出 ...
- 跟我一起数据挖掘(22)——spark入门
Spark简介 Spark是UC Berkeley AMP lab所开源的类Hadoop MapReduce的通用的并行,Spark,拥有Hadoop MapReduce所具有的优点:但不同于MapR ...
- 如何创建一个RESTful WCF Service
原创地址:http://www.cnblogs.com/jfzhu/p/4044813.html 转载请注明出处 (一)web.config文件 要创建REST WCF Service,endpoin ...
- Android开发学习之路-下拉刷新怎么做?
因为最近的开发涉及到了网络读取数据,那么自然少不了的就是下拉刷新的功能,搜索的方法一般是自己去自定义ListView或者RecyclerView来重写OnTouch或者OnScroll方法来实现手势的 ...
- MFC的定时器OnTimer
本文总结来源出自鸡啄米,感谢鸡啄米.来源:http://www.jizhuomi.com/software/232.html 定时器简介 定时器,可以帮助开发者或者用户定时完成某项任务.在使用定时器时 ...
- [CentOs7]搭建ftp服务器(3)——上传,下载,删除,重命名,新建文件夹
摘要 上篇文章介绍了如何为ftp添加虚拟用户,本篇将继续实践如何上传,下载文件. 上传 使用xftp客户端上传文件,如图所示 此时上传状态报错,查看详情 从错误看出是应为无法创建文件造成的.那么我们就 ...
- jQuery源码分析系列(34) : Ajax - 预处理jsonp
上一章大概讲了前置过滤器和请求分发器的作用,这一章主要是具体分析每种对应的处理方式 $.ajax()调用不同类型的响应,被传递到成功处理函数之前,会经过不同种类的预处理(prefilters). 预处 ...
- JBOSS.71.1.Final安装配置
对于JBOSS大家了解多少,相信做Java开发的小童鞋对于Tomcat一定不陌生,而今天为大家介绍的JBOSS也是一款服务器软件,相比Tomcat,JBOSS对于高级的JavaEE相对来说更强大一点, ...