DQL语言(数据查询语言)
1、单表查询
(1)无条件查询
查询所有行中信息
查询行中的所有字段
select * from 表名;
查询行中的部分字段
select 字段名,字段名,字段名 from 表名;
例如:
select name,sex from stu;
(2)有条件查询
1.比较运算符条件查询
> 大于
select * from 表名 where 字段>值;
< 小于
select * from 表名 where 字段<值;
= 等于
select * from 表名 where 字段=值;
>= 大于等于
<= 小于等于
!= 不等于
select * from 表名 where 字段 != 值;
2.模糊查询 like
like实现模糊查询,需要 通配符 配合
% : 匹配任意长度的任意字符 '张%'
_ : 匹配单个任意字符 '张__'
模糊查询
select * from 表名 where 字段 like '%关键词'
select * from 表名 where 字段 like '_关键词_'
3.范围查询 between and
select * from 表名 where 字段 between 最小值 and 最大值;
注意: 包含最小值和最大值。
字段 >=最小值 and 字段 <=最大值
4.空值查询
查询字段值为null的数据
select * from 表名 where 字段 is null;
查询非空
select * from 表名 where 字段 is not null;
5.多条件查询
多条与 (多个条件必须同时满足) and
select * from 表名 where 条件1 and 条件2 and 条件3;
多条件或 (多个条件满足其一即可) or
select * from 表名 where 条件1 or 条件2 or 条件3;
(3)去除重复结果查询
distinct 去除重复结果
select distinct 字段 from 表名 where 条件;
注意: 如果distinct之后跟多个字段,
则判断的是 多个字段的组合 整体不重复.
(4)分组查询
分组:
根据group by之后指定的分组字段进行分组操作。
分组字段中值相同的划分为一组.
select 分组字段,聚合函数 from 表名 group by 分组字段;
查询:
分组之后进行条件筛选(对组进行筛选),使用having
select 分组字段,聚合函数 from 表名 group by 分组字段 having 条件;
注意: 分组后,在select 之后只查 分组字段或聚合函数,
having之后的条件通过 分组字段或聚合函数设定。
(5)排序查询
order by 对查询结果进行排序(默认升序排序)
select * from 表名 order by 字段名;
select * from 表名 where 条件 order by 字段名;
降序排列 desc :
select * from 表名 order by 字段名 desc;
select * from 表名 where 条件 order by 字段名 desc;
多字段排序:
查询结果先按照第一个排序字段进行排序,
如果有相同的,则相同部分按照第二个排序字段排序,
如果还有相同部分,则相同部分继续按照第三个排序字段排序,
依次类推.
select * from 表名 order by 字段1,字段2,字段3;
注意:
如果排序字段要进行降序排序,则在对应排序字段之后使用desc
(6)分页查询
limit 分页查询:对查询结果进行分页查询.查询结果从0开始排序。
select * from 表名 limit 起始查询位置,查询的数量;
起始查询位置: (页码-1)*每页展示数量
查询数量: 每页展示数量
例如: 每页展示10行数据
则 第一个页
limit 0,10
第二页
limit 10,10
第三页
limit 20,10
(7)函数(即方法)查询
①聚合函数(通常配合分组使用的函数)
1、count统计函数:即统计组内数据的行数。
count(*)
count(字段名)
以上两种方式的区别:
count(*) 通过全字段匹配来进行统计(避免某些字段下null值的影响)
count(字段名) 通过一个字段进行数据通,若该字段下有null,
则null会排除在统计之外。
2、max函数统计字段下的最大值
max(字段名)
查询整表中该字段下的最大值
select max(字段名) from 表名;
查询每一组中指定字段下的最大值
select max(字段名) from 表名 group by 字段名;
3、min函数统计指定字段下的最小值
min(字段名)
查询整表中该字段下的最小值
select min(字段名) from 表名;
查询每一组中指定字段下的最小值
select min(字段名) from 表名 group by 字段名;
4、sum函数统计指定字段下的值之和
sum(字段名)
查询整表中该字段下的所有值之和
select sum(字段名) from 表名;
查询每组中指定字段下的所有值之和
select sum(字段名) from 表名 group by 字段名;
5、avg函数统计指定字段下的平均值
avg(字段名)
查询整表中该字段下的平均值
select avg(字段名) from 表名;
查询每组中指定字段下的平均值
select avg(字段名) from 表名 group by 字段名;
②数学函数
1、向上取整
(只要有小数部分,则都进行+1操作。取大于或等于当前数字的最小整数)
ceil(字段名)
ceil(数字)
2、向下取整(舍弃小数部分。取小于等于当前数字的最大整数)
floor(字段名)
floor(数字)
3、四舍五入取整
round(字段名)
round(数字)
4、取模(即求余数) mod
mod(数字1,数字2)
mod(字段1,字段2)
5、次幂 pow
pow(n,m)
即求数字 n 的m次方
例如:
pow(2,3) --2的3次方 8
③字符串函数
提供对字符串值进行操作的函数
1、获取字符串长度(字符长度)
char_length(字符串)
char_length(字段名)
2、获取字符串的字节长度
length(字符串)
length(字段名)
3、截取字符串:起始位置从1开始计算
substring(字符串,起始位置,截取长度)
substring(字段名,起始位置,截取长度)
substr(字符串,起始位置,截取长度)
substr(字段名,起始位置,截取长度)
4、替换字符串中的内容
replace(字符串,目标内容,新内容)
replace(字段名,目标内容,新内容)
5、拼接字符串
concat(字符串1,字符串2)
concat(字段1,字段2)
6、把英文字符全部转为大写形式
upper(字符串)
upper(字段名)
7、把英文字符全部转为小写形式
lower(字符串)
lower(字段名)
④日期函数
1、获取当前系统日期
now()
2、获取日期中的具体属性信息
获取年
year(日期)
year(字段名)
获取月
month(日期)
month(字段名)
获取日
day(日期)
day(字段名)
获取时
hour(日期)
hour(字段名)
获取分
minute(日期)
minute(字段名)
获取秒
second(日期)
second(字段名)
3、计算日期之间相差的天数
datediff(日期1, 日期2)
datediff(字段1,字段2)
4、日期加减
date_add(日期,interval 数字 类型 )
date_add(字段名,interval 数字 类型 )
adddate(日期,interval 数字 类型 )
adddate(字段名,interval 数字 类型 )
类型可以为:
year : 年
month :月
day : 日
hour:时
minute:分
second:秒
数字为正数,则进行加
数字为负数,则进行减
⑤转换函数
1、把日期类型的值转换为指定格式的字符串。
date_format(日期值,'展示的格式')
date_format(字段名,'展示的格式')
2、把日期字符串 解析成 日期值。
str_to_date('日期字符串','字符解析的格式')
str_to_date(字段名,'字符解析的格式')
格式: %Y 年 %m 月 %d 日
%Y年%m月%d日
%Y/%m%d
%Y.%m.%d
⑥空值替换函数(把null用指定新值替代)
ifnull(null,新值)
ifnull(字段名,新值)
(8)算术运算符查询
+ - * / %
方式一:
select 21+32 from dual;
方式二:
select 字段名+值 from 表名;
方式三:
select * from 表名 where 字段+值=值;
例如:
select * from student where year(now())-year(birth) >=18
2、多表查询
(1)普通多表查询
1、在from之后书写多个表名,表名之间使用‘,’ 隔开
select * from 表1,表2,表3;
2、设置多表之间数据连接的条件
select * from 表1,表2 where 表1.字段 = 表2.字段;
select * from 表1,表2,表3 where 表1.字段=表2.字段 and 表2.字段 = 表3.字段
(2)外连接查询
①左外连接查询 left join
select * from 表1 left join 表2 on 表1.字段=表2.字段
左表部分数据全部展示,右表部分只展示根左表有关联的信息,无关联的右表信息不展示。如果左表信息在右表中无连接信息,则右表部分用 null 填充。
②右外连接查询 right join
select * from 表1 right join 表2 on 表1.字段 = 表2.字段;
右表数据全部展示,左表部分只展示根右表有关联的信息,无关联的左表信息不展示。如果右表信息在左表中无连接信息,则左表部分用 null 填充。
(3)内连接查询 inner join(只查询两表中能够连接的信息)
select * from 表1 inner join 表2 on 表1.字段 = 表2.字段;
(4)子查询
一个查询语句中包含其它的查询语句
以内部查询语句产生的查询结果,作为外部查询语句条件字段值
select * from 表1 where 字段 = (select 字段 from 表2 where 条件);
把两个内部查询语句产生的结果作为临时表进行查询,
查询时需要给查询结果命名别名 作为临时表名。
select * from (select 字段,字段 from 表1 where 条件) 别名1,(select 字段,字段 from 表2 wher 条件) 别名2 where 别名1.字段 = 别名2.字段;
(5)别名
表别名: 给表命名一个别称.
形式:
表名 as 别名
简写
表名 别名
select * from 表名1 别名1,表2 别名2 where 别名1.字段 = 别名2.字段;
字段别名:
给查询结果中的内容,指定一个别名,该别名只能在查询结果产生之后使用。
字段 as 别名
字段 别名
(6)in 查询
in 字段的值满足()中任意一个值,即满足条件
select * from 表名 where 字段 in (select 字段 from 表名);
注意:如果in () 中使用子查询语句,则该语句只能进行单字段查询。
not in 查询 不在指定范围之内
select * from 表名 where 字段 not in (select 字段 from 表名);
(7)exists 查询
替代 in
select * from 外表 where exists (select * from 内表 where 内表.字段 = 外表.字段);
替代not in
select * from 外表 where not exists (select * from 内表 where 内表.字段 = 外表.字段);