DQL数据查询语言
查询
desc 表名; // 查询表的结构
select * from 表名; // 查询表中的所有数据
select 字段名 from 表名; // 查询表中指定字段的数据
select 字段名 as 别名 from 表名; // 给查询出来的字段起别名,如果别名中是中文或者含有空格,可以用单引号''括起来
// 条件查询
select 字段名 from 表名 where 条件;
// >= 大于等于 <= 小于等于 > 大于 < 小于
// between ... and .. 在...之间
// is null 为空; is not null 不为空
// and 并且 or 或者 in 包含(相当于多个or); 前面加not表示非
// like 模糊查询,%代表任意字符,_代表一个字符
排序
// 排序(默认升序asc),[]里的表示可要可不要
select 字段名 from 表名 [where 条件] order by 排序字段 [asc]; //升序
select 字段名 from 表名 [where 条件] order by 排序字段 desc; // 降序
select 字段名 from 表名 [where 条件] order by 排序字段1,排序字段2; // 多个字段排序,只有当第一个排序字段相等时才启用第二个排序字段
数据处理函数
单行处理函数
lower(字段名)
转换小写
upper(字段名)
转换大写
substr(被截取的字段, 起始下标, 截取的长度)
取子串,起始下标从1开始
concat(拼接字段1,拼接字段2)
字符串拼接
length(字段名)
取长度
trim('')
去空格
round(数值, 保留的小数位数)
四舍五入
rand()
生成随机数
round(rand()*100, 0)
100以内的随机数
ifnull(数据, 被当做哪个值)
可以将null转换成一个具体值
注意:NULL只要参与运算,最终结果一定是NULL。为了避免这个现象,需要使用ifnull函数。
ifnull(字符串, 0)
把出现的null当作0处理
case..when..then..when..then..else..end
当什么时候怎么做,当什么时候怎么做
str_to_date('日期字符串','格式')
将字符串转换成日期
例如:str_to_date(‘01-01-1970’,‘%d-%m-%Y’)
如果日期字符串格式是 %Y-%m-%d,就不需要使用str_to_date函数,会自动进行类型转换
date_format(日期字段名,'格式')
格式化日期
例如:date_format(birth,‘%m/%d/%Y’) 这个会把birth字段日期类型转换成 01/01/1970 格式字符串
如果日期字符串格式是 %Y-%m-%d,就不需要使用date_format函数,会自动格式化日期
now()
获取系统当前时间,带有时分秒信息,是datetime类型
format
设置千分位
分组函数(多行处理函数)
特点:输入多行,输出一行。使用前必须先分组,如果没有分组,整张表默认为一组。分组函数在使用时会自动忽略null。分组函数不能直接使用在where子句中,但是可以在having子句中使用。
sum(字段名)
求和
avg(字段名)
平均值
max(字段名)
最大值
min(字段名)
最小值
count(字段名)
计数
注意:
count(具体字段)
表示统计该字段下所有不为NULL的元素的总数。
count(*)
表示统计表中的总行数。
分组查询
// 分组查询,字段名 写分组字段和分组函数,其它的没意义
select 字段名 from 表名 [where 条件] group by 分组字段;
select 字段名 from 表名 [where 条件] group by 分组字段1,分组字段2; // 多个字段联合分组
// 使用having对分组后的数据进一步过滤
select 字段名 from 表名 [where 条件] group by 分组字段 having 条件; // 优先使用where,where实现不了,再考虑having
总结:关键字的执行顺序
select 字段名 from 表名 where 条件 group by 分组字段 having 条件 order by 排序字段;
// 执行顺序:
// 1.from
// 2.where
// 3.group by
// 4.having
// 5.select
// 6.order by
distinct关键字
作用:去除查询结果的重复记录
// 去重
select distinct 字段名 from 表名;
// 去除查询结果中字段2的重复记录
select 字段1,distinct 字段2 from 表名;
// 去除字段1,字段2联合的重复记录
select distinct 字段1,字段2 from 表名;
// 统计去重后的字段个数
select count(distinct 字段名) from 表名;
连接查询
内连接:等值连接、非等值连接、自连接
外连接:左外连接、右外连接
全连接
当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积,这种现象被称为:笛卡尔积现象。
内连接
select
...
from
表1
join
表2
on
表1和表2的连接条件
// 条件是等量关系,所以被称为等值连接。
// 条件不是一个等量关系,称为非等值连接。
// 表1、表2是同一张表,同一张表的不同字段进行等值连接,称为自连接。
外连接
// 左外连接(表1是主表)
select
...
from
表1
left join
表2
on
表1和表2的连接条件
// 右外连接(表2是主表)
select
...
from
表1
right join
表2
on
表1和表2的连接条件
子查询
select语句中嵌套select语句,被嵌套的select语句称为子查询。
from子句中的子查询,可以将子查询的查询结果当作一张临时表。
子查询可以在以下场景中提供数据
union合并查询结果集
union的效率要高一些。
对于表连接来说,每连接一次新表,则匹配的次数满足笛卡尔积,成倍的翻,X * Y * Z 。
使用union可以减少匹配的次数。在减少匹配次数的情况下,还可以完成两个结果集的拼接。(union把乘法变成了加法运算 X * Y + X * Z)
select 字段名 from 表名 where 条件
union
select 字段名 from 表名 where 条件;
注意:union在进行结果集合并的时候,要求两个结果集的列数相同。结果集合并时列和列的数据类型也要一致。
limit(非常重要)
作用:将查询结果集的一部分取出来。通常使用在分页查询当中。
用法:
完整用法:limit startIndex, length
startIndex是起始下标,length是长度。
起始下标从0开始。
limit 0,5; //取前5
缺省用法:limit 5; //取前5
注意:mysql当中limit在order by之后执行
分页
每页显示5条记录
第1页:limit 0,5 [0 1 2 3 4]
第2页:limit 5,5 [5 6 7 8 9]
第3页:limit 10,5 [10 11 12 13 14]
第4页:limit 15,5 [15 16 17 18 19]
...
//每页显示pageSize条记录
第pageNo页:limit (pageNo - 1) * pageSize, pageSize