排序查询
一、语法
select 查询列表
from 表
where 筛选条件
order by 排序列表 【asc/desc】
二、特点
- asc:升序,如果不写默认升序
desc:降序 - 排序列表支持单个字段、多个字段、函数、表达式、别名
- order by的位置一般放在查询语句的最后(除limit语句之外)
常见函数
1.字符函数
#length 获取参数值的字节个数
#concat 拼接字符
#upper /lower 大小写转换
#substr\substring:截取从指定索引处指定字符长度的字符
#instr:返回子串第一次出现的索引,如果找不到返回0
#trim去前后空格
#lpad:用指定的字符实现左填充指定长度
#rpad:用指定的字符实现右填充指定长度
#replace 替换
2.数学函数
#round 四舍五入
#ceil 向上取整,返回大于等于该参数的最小整数
#floor 向下取整,返回<=该参数的最大整数
#truncate 截断
#mod 取余
#rand 获取随机数,返回0-1之间的小数
3.日期函数
#now 返回当前时间
#curdate 返回当前系统日期,不包含时间
#curtime 返回当前时间,不包含日期;
#year month。。。可以获取指定的年月日小时分钟秒
#str_to_date:将字符转化为指定日期格式;
#date_format:将日期转化为字符;
#datediff:返回两个日期相差的天数
#monthname 以英文形式返回月
4.其他函数
VERSION 当前数据库服务器的版本
DATABASE 当前打开的数据库
USER当前用户
password返回该字符的密码形式
MD5返回该字符的MD5加密形式
5.流程控制函数
#if(条件表达式,表达式1,表达式2):如果表达式成立,返回表达式1,否则返回表达式2
#case函数的使用一: switch case 的效果
/*
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
…
else 要显示的值n或语句n;
end
/
#case 函数的使用二:类似于 多重if
/
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值1或语句2
。。。
else 要显示的值n或语句n;
end
*/
分组函数
功能:用作统计使用,又称为聚合函数或统计函数或组函数
分类:
sum求和 avg求平均值 max求最大值 min求最小值 count计算个数
特点:
1.sum,avg一般用于处理数值型
max,min,count可以吃力任何类型
2.以上分组函数都忽略null值
3.可以和distinct搭配使用,实现去重的统计
select sum(distinct 字段) from 表;
4.count函数的单独介绍
一般使用count(*)用作统计行数
5.和分组函数一同查询的字段的要求是group by后的字段
分组查询
语法:
select分组函数,列(要求出现在group by后面)
from 表
【where 筛选条件】
group by分组的列表
【order by 子句】
特点:
1.分组查询中的筛选条件分为两类
数据源 / 位置 / 关键字
分组前筛选 /原始表 / group by子句的前面 where
分组后筛选 /分组后的结果表 / group bu子句的后面 having
分组函数做条件肯定是放在having子句中
能用分组前筛选的,就优先考虑分组前
2.group by 子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数用的比较少
3.也可以添加排序(排序放在整个分组查询的最后)
注意:
查询列表必须特殊,要求是分组函数和group by后出现的字段
连接查询
当查询中涉及多个表的字段,需要使用多表连接
select 字段1 ,字段2
from 表1,表2,
含义:又称为多表查询,当查询的字段来自于多个表,就会用到连接查询
笛卡尔乘积现象:表1有m行,表2有n行,结果等于m*n行
发生原因:没有有效的连接条件
如何避免:添加有效的连接条
分类:
按年代分类
sql192标准
sql199标准【推荐】:支持内连接+外连接(左外和右外)+交叉连接
按功能分类:
内连接:等值连接、非等值连接、自连接
外连接:左外连接、右外连接、全外连接
交叉连接
#等值连接
语法:
select 查询列表
from 表1 别名,表2 别名
where 表1.key=表2.key
【and筛选条件】
【group by分组字段】
【having 分组后的筛选】
【order by 排序字段】
/*
多表连接的结果为多表的交集部分
n表连接,至少需要n-1个连接条件
多表的顺序没有需求
一般需要为表起别名
可以搭配前面介绍的所有子句使用、比如排序、分组、筛选
#非等值连接
语法:
select 查询列表
from 表1 别名,表2 别名
where 非等值连接条件
【and筛选条件】
【group by分组字段】
【having 分组后的筛选】
【order by 排序字段】
#自连接