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 ...
随机推荐
- SQL Server null知多少?
null是什么? 不知道.我是说,他的意思就是不知道(unknown). 它和true.false组成谓词的三个逻辑值,代表“未知”.与true和false相比,null最难以令人捉摸,因为它没有明确 ...
- fc-san
在SAN网络中,所有的数据传输在高速.高带宽的网络中进行,SAN存储实现的是直接对物理硬件的块级存储访问,提高了存储的性能和升级能力. 早期的SAN采用的是光纤通道(FC,Fibre Channel) ...
- angularjs中provider,factory,service的区别和用法
angularjs中provider,factory,service的区别和用法 都能提供service,但是又有差别 service 第一次被注入时实例化,只实例化一次,整个应用的生命周期中是个单例 ...
- OpenGL学习进程(13)第十课:基本图形的底层实现及算法原理
本节介绍OpenGL中绘制直线.圆.椭圆,多边形的算法原理. (1)绘制任意方向(任意斜率)的直线: 1)中点画线法: 中点画线法的算法原理不做介绍,但这里用到最基本的画0<=k ...
- JS原生基础终结篇 (帅哥)
闭包 基础 面向对象基础 1.1 闭包 在程序语言中,所谓闭包,是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久型变量值能力的段落.这些外部执行域的非 ...
- MongoDB 使用Index
Index 能够提高查询的性能,如果没有Index,MongoDB必须扫描整个collection,从collection的第一个doc开始,直到最后一个doc,即使第一个doc之后的所有doc都不满 ...
- EF-DbUpdateException解决方案
图二:
- Android图片处理
相信做Android开发的小伙伴对于Android图片压缩.裁剪一定有很深的印象,今天我将带领大家一起学习一下这个看着高深莫测的知识,以便再以后的学习.工作中可以帮助到大家. 首先我们看一下这个问题出 ...
- Android 如何制作九宫格图片(.9.png)
对于编程人员来说,尤其是前端设计设计师,九宫格图片是必须的(.9.png),对于初学者来说不知道这个九宫格图片有什么用,其实这个九宫格图片实际常用在Android的button组件.要上下拉升的背景图 ...
- 手动实现jQuery Tools里面tab功能
平时开发中用的Javascript类库都是jQuery,用到插件或者第三方类库能从jQuery Tools里面找到,基本不用其他的.当然有时同事喜欢使用jQuery UI里面的插件.并且jQuery ...