MySQl心得4--2--数据库查询2(三)

2014-11-24 09:39:24 · 作者: · 浏览: 2
业的学生成为一组。group by子句的语法格式如下:group by {col_name | expr| position} [ASC | DESC], ... [WITH ROLLUP]
说明:
group by子句后通常包含列名或表达式。MySQL对GROUP BY子句进行了扩展,可以在列的后面指定ASC(升序)或DESC(降序)。GROUP BY可以根据一个或多个列进行分组,也可以根据表达式进行分组,经常和聚合函数一起使用。
例1:将XSCJ数据库中各专业名输出。
SELECT 专业名 FROM XS GROUP BY 专业名;
例2: 求XSCJ数据库中各专业的学生数。
SELECT 专业名,COUNT(*) AS '学生数'
FROM XS GROUP BY 专业名;
使用带rollup操作符的GROUP BY子句: 指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行。
例: 在XSCJ数据库上产生一个结果集,包括每个专业的男生人数、女生人数、总人数,以及学生总人数。
SELECT 专业名, 性别, COUNT(*) AS '人数'
FROM XS GROUP BY 专业名,性别 with rollup;
使用了ROLLUP操作符后,将对GROUP BY子句中所指定的各列产生汇总行,产生的规则是:按列的排列的逆序依次进行汇总。如本例根据专业名和性别将XS表分为4组,使用ROLLUP后,先对性别字段产生了汇总行(针对专业名相同的行),然后对专业名与性别均不同的值产生了汇总行。所产生的汇总行中对应具有不同列值的字段值将置为NULL。
6. having子句(使用分组后在进行挑选)
使用having子句的目的与where子句类似,having与where的区别:WHERE子句是用来在FROM子句之后选择行,where是对原始记录进行挑选;而HAVING子句用来在GROUP BY子句后选择行,对分组后的记录进行挑选。
www.2cto.com
语法格式: having 选择条件;
条件的定义和WHERE子句中的条件类似,不过HAVING子句中的条件可以包含聚合函数,而WHERE子句中则不可以。
SQL标准要求HAVING必须引用GROUP BY子句中的列或用于聚合函数中的列。不过,MySQL支持对此工作性质的扩展,并允许HAVING引用SELECT清单中的列和外部子查询中的列。
例: 查找XSCJ数据库中平均成绩在85分以上的学生的学号和平均成绩。
SELECT 学号, AVG(成绩) AS '平均成绩'
FROM XS_KC GROUP BY 学号 HAVING AVG(成绩) >=85;
7. order by字句
在一条SELECT语句中,如果不使用order by子句,结果中行的顺序是不可预料的。使用ORDER BY子句后可以保证结果中的行按一定顺序排列。 语法格式:ORDER BY {col_name | expr | position} [ASC | DESC] , ...
说明:ORDER BY子句后可以是一个列、一个表达式或一个正整数。正整数表示按结果表中该位置上的列排序。关键字asc表示升序排列,desc表示降序排列, 系统默认值为ASC。
例: 将通信工程专业的学生按出生日期先后排序。
SELECT 学号,姓名,专业名,出生日期 FROM XS
WHERE 专业名 = '通信工程' ORDER BY 出生日期;
注意:当对空值排序时,ORDER BY子句将空值作为最小值对待,按升序排列的话将空值放在最上方,降序放在最下方。
如果是按多个字段排序,先按第一个字段排,当第一个字段的值相同时,再按第二个排;如果第一个字段都不相同,则第二个字段用不着;order by语句在limit语句之前。
8. limit字句
LIMIT子句是SELECT语句的最后一个子句,主要用于限制被SELECT语句返回的行数。 语法格式:LIMIT {[offset,]row_count | row_count OFFSET offset}
说明:如果记录特别多可以用limit语句分页!
语法格式中的offset和row_count都必须是非负的整数常数,offset指定返回的第一行的偏移量,row_count是返回的行数。例如,“LIMIT 5”表示返回SELECT语句的结果集中最前面5行,而“LIMIT3,5”则表示从第4行开始返回5行。
www.2cto.com
值得注意的是初始行的偏移量为0而不是1。
例: 查找XS表中学号最靠前的5位学生的信息。
SELECT 学号, 姓名, 专业名, 性别, 出生日期, 总学分
FROM XS ORDER BY 学号 LIMIT 5;
为了与PostgreSQL兼容,MySQL也支持LIMIT row_count OFFSET offset语法。所以将上面例子中的LIMIT子句换成“limit 5 offset 3”,结果一样。
作者 tianyazaiheruan