数据库中常见函数
单行函数
一、字符函数
length 获取参数值的字节个数
concat 拼接字符串
substr 截取从指定索引处指定字符长度的字符
instr 返回子串第一次出现的索引,如果找不到返回0
trim 去除前后空格字符
upper 将字符变成大写
lower 将字符变成小写
lpad 左填充
rpad 右填充
replace 替换
二、数学函数
round 四舍五入
ceil 向上取整
floor 向下取整
truncate 截断
mod 取余
rand 获取随机数,返回0-1之间的小数
三、日期函数
now 返回当前系统日期+时间
curdate 返回当前系统日期,不包含时间
curtime 返回当前时间,不包含日期
获取指定部分的年,月, 日,小时,分钟,秒
year
month
monthname 返回英文
day
hour
minute
second
str_to_date 将日期格式的字符转换为指定格式的日期
date_format 将日期转换成字符
datediff 返回两个日期相差的天数
四、其他函数
version 当前数据库服务器的版本
datebase 当前打开的数据库
user 当前用户
password(’字符‘) 返回该字符的密码形式
MD5(’字符‘):返回该字符的MD5加密
五、控制函数
if(条件表达式1,表达式2)如果表达式成立,则返回表达式1,否则返回表达式2.(if else的效果)
case
使用一:switch case 的效果
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1;
when 常量2 then 要显示的值2或语句2;
…
else 要显示的值n或语句n;
end
使用二:多重if的效果
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
…
else 要显示的值n或语句n
end
分组函数
功能:用作统计使用,又称为聚合函数或统计函数或组函数
分类:sum、avg、min、max、count
特点:1. sum、avg一般用于处理数值型
max、min、count可以处理任何类型
-
以上分组函数都忽略null
-
可以和distinct搭配实现去重的运算
-
count具体介绍
count(字段):统计该字段非空值的个数
count(*):统计结果集的行数
count(1):统计结果集的行数
效率上:
MyISAM存储引擎,count(*)最高
InnoDB存储引擎,count(*)和count(1)效率>count(字段)
-
和分组函数一同查询的字段要求是group by后的字段
分组查询
语法:
select 分组函数 分组后的字段(要求出现在group by后面的字段)
from 表名
【where 筛选条件】
group by 分组的字段
【having 分组后的筛选】
【order by 排序列表】
注:查询列表必须特殊,要求是分组函数和group by后出现的字段
特点:
1.分组查询中的筛选条件分为两类
数据源 位置 关键字
分组前筛选 原始表 group by 子句的前面 where
分组后筛选 分组后的结果集 group by 子句的前面 having
注:分组函数做条件肯定是放在having子句中;
能用分组前筛选的,就优先考虑分组前的筛选
- group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),表达式或函数(用的较少)
连接查询
一、含义:又称为多表查询,当查询的字段涉及到多个表时,就会用到多表查询;
select 字段1,字段2
from 表1,表2,,,;
笛卡尔乘积:当查询多个表时,没有添加有效的连接条件,导致多个表所有行实现完全连接;
如何解决:添加有效的连接条件
二、分类
按年代分类:sq192:
等值
非等值
自连接
也支持一部分外连接(用于Oracle、SqlServer、mysql不支持)
sq199(推荐使用)
内连接
等值
非等值
自连接
外连接
左外
右外
全外(mysql不支持)
交叉连接
三、SQL92语法
-
等值连接
语法:
select 查询列表
from 表1 别名,表2,别名
where 表1.key=表2.key
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
特点:
一般为表起别名;
多表的顺序可以调换;
n表连接至少需要n-1个连接条件;
等值连接的结果是多表的交集部分;
2.非等值连接
语法:
select 查询列表
from 表1 别名,表2,别名
where 非等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
3.自连接
语法:
select 查询列表
from 表 别名1,表,别名2
where 等值的连接条件
【and 筛选条件】
【group by 分组字段】
【having 分组后的筛选】
【order by 排序字段】
四、SQL99语法
1.内连接
语法:
select 查询列表
from 表1 别名
【inner】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 子句;
特点:
1)表的顺序可以调换
2)内连接的结果=多表的交集
3)n表连接至少需要n-1个连接条件
2.外连接
语法:
select 查询列表
from 表1 别名
left|right|full【outer】 join 表2 别名 on 连接条件
where 筛选条件
group by 分组列表
having 分组后的筛选
order by 排序列表
limit 子句;
特点:
1)查询结果=主表中所有的行,如果从表和它匹配的将显示匹配行,如果从表没有匹配的则显示null
2)left join 左边的就是主表,right join 右边的就是主表
full join 两边都是主表
3)一般用于查询除了交集部分的剩余的不匹配的行
3.交叉连接
语法:
select 查询列表
from 表1 别名
cross join 表2 别名;
特点:
类似于笛卡尔乘积
子查询
一、含义
嵌套在其他语句内部的select语句称为子查询或内查询
外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多;
外面如果为select语句,则此语句称为外查询或主查询;
二、分类
1、按出现位置
select后面
仅仅支持标量子查询
from后面
表子查询
where或having后面
标量子查询
列子查询
行子查询
exists后面
标量子查询
列子查询
行子查询
表子查询
2、按结果集的行列
标量子查询(单行子查询):结果集为一行一列
列子查询(多行子查询):结果集为多行一列
行子查询:结果集为多行多列
表子查询:结果集为多行多列
三、示例
where或having后面
1、标量子查询
案例:查询最低工资的员工姓名和工资
1)最低工资
select min(salary) from employees
2)查询员工的姓名和工资,要求工资=1)
select last_name,salary
from employees
where salary=(
select min(salary) from employees
);
2、列子查询
案例:查询所有是领导的员工姓名
1)查询所有员工的manager_id
select manager_id
from employees
2)查询姓名,employee_id属于1)列表的一个
select last_name
from employees
where employee_id in (
select manager_id
from employees
);
分页查询
一、应用场景
当要查询的条目数太多,一页显示不完
二、语法
select 查询列表
from 表
limit 【offset,】size;
注:offset代表的是起始的条目索引,默认为0
size代表的是显示的条目数
公式:
假如要显示的页数为page,每一页条目数为size
select 查询列表
from 表
limit (page-)*size,size;
联合查询
一、含义
union 联合 合并:将多条查询语句的结果合并为一个结果
二、语法
查询语句1
union 【all】
查询语句2
union 【all】
……
三、意义
1.将一条比较复杂的查询语句拆分成多条语句
2.适用于查询多个表的时候,查询的列基本一致
应用场景:
要查询的结果来自于多个表,且多个表没有直接的连接关系,但查询的信息一致时;
四、特点
1、要求多条查询语句的查询列数是一致的
2、要求多条查询语句的查询的每一列的类型和顺序最后一致
3、union 关键字默认去重,如果使用union all 可以包含重复项
查询总结
语法:
select 查询列表 (7)
from 表1 别名 (1)
连接类型 join 表2 (2)
on 连接条件 (3)
where 筛选 (4)
group by 分组列表 (5)
having 筛选 (6)
order by 排序列表 (8)
limit 起始条目索引,条目数; (9)