SQL 单表查询(下)

简介: SQL 单表查询

正文


3. 常用函数


3.1. 字符串函数


函数 功能
concat([字符串1],[字符串2],…,[字符串n]) 连接字符串
group_concat([字段]) 对分组后的字段进行连接
insert([字符串1], [下标], [个数], [字符串2]) 将[字符串1]中从[下标]开始的[个数]个字符替换为[字符串2]
lower([字符串]) 将[字符串]中的字母转换为小写
upper([字符串]) 将[字符串]中的字母转换为大写
length([字符串]) 计算[字符串]的字节长度
char_length([字符串]) 计算[字符串]的字符长度
lpad([字符串1], [长度], [字符串2]) 在[字符串1]的左边填充[字符串2],使字符串长度达到[长度]
rpad([字符串1], [长度], [字符串2]) 在[字符串1]的右边填充[字符串2],使字符串长度达到[长度]
trim([字符串]) 去掉[字符串]首尾的空格
repeat([字符串],[次数]) 将[字符串]重复[次数]次
replace([字符串1], [字符串2], [字符串3]) 用[字符串3]替换[字符串1]中所有的[字符串2]
substring([字符串], [下标], [长度]) 返回[字符串1]中从[下标]位置其长度为[长度]的子串

举例:

-- concat(工号,姓名)连接字段`工号`和`姓名`
select 工号, 姓名, concat(工号,姓名) from users; 

1.png

--lpad(姓名, 5, 'X')在姓名字段的左边填充字符'L',使其字符长度达到5
--rpad(姓名, 5, 'X')在姓名字段的右边填充字符'R',使其字符长度达到5
select lpad(姓名, 5, 'L'),rpad(姓名, 5, 'R') from users; 

2.png


3.2. 数值函数


函数 功能
abs([数值]) 返回[数值]的绝对值
ceil([数值]) 返回不小于[数值]的最小整数值
floor([数值]) 返回不大于[数值]的最小整数值
mod([数值1], [数值2]) 返回[数值1]/[数值2]的模
rand() 返回一个0~1之间的随机数
round([数值1], [数值2]) 返回[数值1]四舍五入后保留[数值2]位小数的值
truncate([数值1], [数值2]) 返回[数值1]截断后保留[数值2]位小数的值

例如:

-- 返回不小于0.8、-0.8和不大于0.8、-0.8的数值
select ceil(0.8), ceil(-0.8), floor(0.8), floor(-0.8) from users; 

3.png

-- round(3.14159,3)返回3.14159四舍五入后保留3位小数的值
-- truncate(3.14159,3)返回3.14159截断后保留3位小数的值
select round(3.14159,3), truncate(3.14159,3) from users; 

4.png


3.3. 日期和时间函数


函数 功能
curdate() 返回当前日期
curtime() 返回当前时间
now() 返回当前的日期和时间
year([日期]) 计算[日期]的年份
monthname([日期]) 计算[日期]的月份,并返回其英文名
week([日期]) 计算[日期]为一年中的第几周
hour([时间]) 计算[时间]的小时值
minute([时间]) 计算[时间]的分钟值
date_format([日期],[格式]) 将[日期]按[格式]返回
date_add([日期或时间],interval [时间间隔] [间隔类型]) 返回一个[日期或时间]后接一个[时间间隔]的时间值
datediff([时间1],[时间2]) 计算[时间1]和时间[2]之间的间隔天数


例如:

select now(), 
     year(now()), monthname(now()), week(now()), 
       hour(now()), minute(now()); 


5.png


3.3.1. date_format()函数


格式 描述 格式 描述
%M 英文月名 %j 该日期所在一年中的第几天(000-366)
%b 英文月名缩写 %D 该日期所在一月中的第几天(带次序1st,2nd,…,31th)
%c 月数(0-12) %e 该日期所在一月中的第几天(0-31)
%m 月数(01-12) %d 该日期所在一月中的第几天(00-31)
%k 该时间所在的小时(0-23) %i 该时间所在一小时中的分钟数(00-59)
%H 该时间所在的小时(00-23) %f 该时间所在一秒中的微秒数
%h 该时间所在一天中的小时(01-12) %a 该时间所在的星期名的英文缩写
%I 该时间所在一天中的小时(01-12),同%h

例如:

select now(), date_format(now(), '%M %m %D');


6.png


3.3.2. date_add()函数


间隔类型 描述 间隔类型 描述
microsecond 微秒 second
minute 分钟 hour 小时
day week 星期
month quarter 季度(一个季度三个月)
year second_microsecond 秒+微秒(写成浮点数形式
例如10.1表示间隔10秒加1微秒)
minute_microsecond 分+微秒 minute_second 分+秒
hour_microsecond 小时+微秒 hour_second 小时+秒

例如:

-- 间隔一个季度
select now(), date_add(now(), interval 1 quarter); 


7.png

-- 间隔1分2秒
select now(), date_add(now(), interval 1.2 minute_second); 

8.png


3.4. 流程控制函数


3.4.1. if 流程函数


根据表达式的真假值做出判断。

语法:

-- 如果[表达式]为真,则返回[true返回值],否则返回[false返回值]
if ([表达式], [true返回值], [false返回值]);

例如:

-- 若字段值为‘刘晨’,则返回‘是’,否则返回‘否’
select 姓名, if(姓名='刘晨', '是', '否') from users; 


9.png


3.4.2. ifnull 流程函数


ifnull用于判断表达式是否为空。

语法:

-- 若[表达式1]不为null,就返回[表达式1]的值,若[表达式1]为null,就返回[表达式2]的值
ifnull([表达式1], [表达式2])


例如:

-- (左图) 查询某单位人员的联系方式,有些人没有办公电话,只有手机号,这时会出现信息冗余
select 姓名, 办公电话, 手机号 from users
-- (右图) 若使用ifnull()函数来处理,可以消除这些信息冗余
-- ifnull(办公电话, 手机号) 若有办公电话,则显示办公电话,若没有办公电话,就用手机号代替
select 姓名, ifnull(办公电话, 手机号) from users

10.png


3.4.3. case 流程函数


case流程函数可以帮助数据库使用人员根据情况从多个选项中作出选择。

语法:

-- case表达式可以根据[表达式1]的结果[值1]、[值2]、...、[值n]
-- 返回相应的[返回值1]、[返回值2]、...、[返回值n]
-- 如果[表达式1]的结果不在[值1]、[值2]、...、[值n]中,则返回[默认返回值]
case [表达式1]
  when [值1] then [返回值1]
  when [值2] then [返回值2]
  ...
  when [值n] then [返回值n]
  else [默认返回值]
end

例如:

-- 用case表达式对性别进行中英文转换
select 姓名, 性别,
  case 性别
  when '男' then 'male'
  when '女' then 'female'
  else 'unknown'
end
from users


11.png


3.5. 聚合函数


聚合函数用于对一组数进行运算,然后返回一个结果,需要注意的是,除了count()以外,其他的聚合函数在计算时会忽略null值。

常用的聚合函数有:

聚合函数 作用
count([列名]) 计算某一列有多少行
avg([列名]) 计算某一列数值的平均值
sum([列名]) 计算某一列数值的和
max([列名]) 求出某一列的最大值
min([列名]) 求出某一列的最小值

例如:

select count(*), avg(年龄), sum(年龄), max(年龄), min(年龄) from users

12.png


3.6. 数据库属性函数


属性函数 功能
database() 返回当前数据库名
version() 返回当前数据库版本
user() 返回当前登录用户的用户名
inet_aton([IP地址]) 返回IP地址的数字表示
inet_ntoa([IP数]) 将IP的数字表示转换为IP地址
password([密码]) 返回加密后的[密码]
md5([字符串]) 返回[字符串]的MD5值(32位的16进制串)

例如:

-- IP地址'192.168.1.1'与其数字表示的相互转换
select inet_aton('192.168.1.1'), inet_ntoa(3232235777);

13.png


4. group by 分组查询


分组查询可以将值相同的字段分在同一个组,常和各种函数一起使用。关键词是group by,写在where子句之后。


如果要对分组后的结果进行条件过滤,要使用having关键字,having就是group by中的where,但是having子句中可以使用聚合函数,where中不行。


语法:

select [字段],[函数1],[函数2],...,[函数n] 
  from [表名] 
  group by [字段] 
  having [表达式];

需要注意的是,select中两个的[字段]必须相同,因为对数据按[字段]进行分组以后,其他的字段都会被打乱,无法直接查询出来。

例如:

-- (右图)对分组后的姓名字段值进行连接,并统计每一个分组的年龄总和
select 年龄, group_concat(姓名), sum(年龄) from users group by 年龄;

14.png

-- 带having子句的分组查询
-- 首先对分组后的姓名字段值进行连接,并统计每一个分组的年龄总和
-- 然后从中选出年龄小于30的分组,返回
select 年龄, group_concat(姓名), sum(年龄) 
  from users 
  group by 年龄
  having 年龄 < 30;


15.png

相关文章
|
6月前
|
SQL
SQL数据查询——单表查询和排序
SQL数据查询——单表查询和排序
65 0
|
12月前
|
SQL 数据库
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(二):简单单表查询
本篇文章介绍一些SQL开发基础的内容,讲解的主要内容是:***NULL空值的运算、coalesce比nvl的优势、拼接列实现批量脚本、如何通过rownum限制返回的行数以及如何正确的使用rownum从表中随机返回 n 条记录。***
【SQL开发实战技巧】系列(二):简单单表查询
|
SQL 关系型数据库 MySQL
【sql语句基础】——查(select)(单表查询顺序补充)
【sql语句基础】——查(select)(单表查询顺序补充)
【sql语句基础】——查(select)(单表查询)
【sql语句基础】——查(select)(单表查询)
【sql语句基础】——查(select)(单表查询)
|
SQL 数据库 索引
【T-SQL基础】01.单表查询-几道sql查询题
【T-SQL基础】01.单表查询-几道sql查询题
136 0
【T-SQL基础】01.单表查询-几道sql查询题
|
SQL Oracle 关系型数据库
Oracle 单表查询SQL
本文目录 1. 简介 2. select 2.1 直接查询类 2.2 查询结果处理 2.3 非常特殊的NULL 2.4 相当特殊的group by
109 0