目录
select
1. 查找不同行 distinct
select distinct num from test1;
2. 限制输出行数 limit
select num from test1 limit 5;#限制输出的行数最多5行
select num
from test1 limit 5,5;#第一个五表示从第五行开始,第二个五表示输出五行
#注意行号是从0开始的,所以limit1,1相当于从第二行开始的一行
#mysql还有一种平替语法,limit 4 offset 3 == limit 3,4
- 运行结果:
select * from test1 limit 2,1;
3. 排序 order by
- 根据order by的列来排序输出
select *
from test1 order by num;
#按照num的大小升序输出,默认为升序
select *
from test1
order by num desc; #加上desc之后为降序
select *
from test1
order by num,name; #按照num和name排序,先看num,如果相同再看name
select *
from test1
order by num,name desc; #这里的降序是只针对name的,num还是升序,所以要全降序,需要每个地方都加desc
select * name
from test1
order by age
limit 1;
#limit和order by结合可以输出最小和最大的值
4. 筛选where
,条件符and
和or
select *
from test1
where age=10;#输出所有年龄为10的信息
where... order by ... #order by要在where 之后要不会出错
select *
from test1
where age <> 10;#输出年龄不等于10的信息
select *
from test1
where age between 10 and 20;#输出年龄在10-20之间的信息
select *
from test1
where age is null;#检查是否有空值
select *
from test1
where age>10 and age<20;#符号 and 表示并,需要同时满足
select *
from test1
where age<10 or age>20;#符号 or 表示或,至少满足其中一个即可
select *
from test1
where age<10 or age>20 and name='111';
#and的优先级是高于or的,所以这个条件可以翻译为,name为'111'并且age>20的,或者age<10的
#解决方法是加括号确定优先级
5. in
操作符,和not
In
- in操作符给定取值区间,然后判断是否在区间内
select *
from test1
where age in (10,20,30);#找出age为10,20,30的信息
- 其实可以发现,in和or很类似,之间完全可以互相转换
- 那为什么要使用In,有如下优点
not
- not的作用就是否定
select *
from test1
where age not in (10,20,30);#找出age不为10,20,30的信息
6.通配符like
,(%) (_)
- 用来匹配一部分值的特殊字符
( % )
%
可以表示任意数量的字符
select *
from test2
where tnum like '0%';#查询后缀有0的内容,%可以表示任意数量的字符,任意数量可以是0
select *
from test2
where tnum like '110%';#前缀有110的内容
select *
from test2
where tnum like '%0%';#某个位置有0
select *
from test2
where tnum like '1%0';#以1开头0结尾
( _ )
- 与%类似,但是只能表示一个字符,并且不能为空
select *
from test2
where tnum like '%1_';#表示1前面可以有任意个字符,后面必须有一个字符
+ 通配符使用所需要注意的
7. 正则表达式
regexp
select *
from test2
where tnum regexp '10'; // 相当于 where tnum like '%10%';
select *
from test2
where tnum regexp '00.1';// .表示可以代替任意一个字符
select *
from test2
where tnum regexp '00[123]';//相当于in,001 002 003,看看那个能匹配上
# [^123] 就是除了123意外的数
# 还可以简化写[1-3],就是[123]的简化版
- 关于为什么有like还使用regexp
OR
匹配
select *
from test2
where tnum regexp '00|1';#和or差不多
转义字符
- 一个字符串为'adw.we',我们想通过'.'来找到他,然后输出,然后如果我们
regexp '.'
,会输出全部内容,因为这里的'.'被认为是代替一个字符了,所以我们要写成regexp '\\.'
,如果是'\'这样的字符,则需要写成'\\\'
定位符
select *
from test2
where tnum regexp '^[0-9\\.]'; #只有在第一个是其中数字时才匹配
计算字段
拼接concat
select concat(num,'(',name,')') //有点像规定输出格式
from test2;
- Trim函数,LTrim函数去除对应列左边的空格,RTrim右边的空格
select RTrim(tnum)
from test2;
别名
- 我们可以将表名替换成一个别名
select concat(num,'(',name,')') as hh
from test2;
函数
- 调用文本处理函数来实现某些功能
比如:
select upper(str)//upper的功能是将字符转化为大写
from test3;
- 其他常用的文本处理函数
日期处理函数
-
常用的函数
-
一般表示日期的数据类型类datetime,顾名思义就是日期+时间,具体格式为yyyy-mm-nn
select *
from test4
where dat='2002-04-05';
- 问:上面这种写法是否可靠?
答: 不可靠,假如其中有一项数据为'2002-04-05 11:30:30',也就是时间不为00:00:00,那么就无法匹配,所以在匹配时应该只让日期匹配,所以就要用date()
函数,取其中的日期,同理还有time()
函数,取其中的时间 - 与一些关系符结合
select *
from test4
where date(dat) between '2002-07-01' and '2002-07-31'; //匹配7月份所有数据
select *
from test4
where year(dat)=2002 and month(dat)=7;//也是匹配七月份所有数据,另一种写法
数值处理函数
- 常用的数值处理函数
聚集函数
-
常用函数
-
用法
avg
select avg(num) as avg_num//输出num这一列的平均值
from test1;
count
select count(num) as count_num//输出num列的行数
from test1;
max min
-
返回一列中最大的(最小的)
-
min类似
-
聚集函数中的列,默认为
ALL
,也就是选择全部的行,如果前面加上distinct
,则只会选择不同的行