数据检索
查询语句
1.基本查询语句
-- 查询全部的字段
select * from 表名 as '表的别名'
2.查询数量限制
select [DISTINCT] 列名 as '展现出来的列名', ....
from 表名 as '给表起的别名'
limit 开始行(从0开始), 取得行数 / limit 取得行数 offset 开始行(从0开始),
3.使用完全限定名
select 表名.字段1名, 表名.字段2名, ...
from 数据库名.表名;
4.排序数据
不排序的情况下,数据并不是随机顺序显示,【而是以它在底层表中出现的顺序显示】,可以是数据最初添加到表中的顺序。
4.1 基本升序/降序排序
-- 默认按照升序排序,显示从小到大
select * from 表名 as 表别名 order by 列名;
select * from 表名 as 表别名 order by 列名 asc;
-- 显示使用降序排序
select * from 表名 as 表别名 order by 列名 desc;
-- 按多个字段进行排序
-- 先按照列名1降序排序,然后再按照列名2升序排列
-- 【注意点】如果想在多个列上降序,必须对每个列指定desc关键字
select * from 表名 as 表别名 order by 列名1 desc 列名2;
4.2 order by 和 limit 配合找最高值或最低值
-- 取最大值
select * from 表名 as 表别名 order by 列名 desc limit 1;
-- 取最小值
select * from 表名 as 表别名 order by 列名 [asc] limit 1;
5.where过滤
5.1 子句操作符
符号 | 含义 |
---|---|
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
>= | 大于等于 |
between … and … | 在…和…之间 |
is null | …为空 |
5.2 NULL与不匹配
当想要选出某列不具有/具有特定值的行时,不返回该列为空的行。
5.3 AND 与 OR 操作符
and操作符优先级高于or操作符
5.4 IN 操作符
-- 用于指定条件范围
select * from 表名 as 表别名 where 列名 IN (值1, 值2, ...)
5.5 NOT 操作符
用于在where子句中否定后跟条件的关键字
【tips】MySQL支持使用NOT对IN、BETWEEN和EXISTS子句取反;与多数其他DBMS允许使用NOT对各种条件取反有很大的差别。
5.6 LIKE 操作符
通配符:% 可以表示任意字符出现任意次数
通配符:_ 可以表示一个字符
【区分大小写匹配】根据MySQL的配置方式,匹配是可以区分大小写的。
【注意NULL】%不能与NULL进行匹配
【使用技巧】
1)尽量避免使用通配符;
2)尽量不要把通配符至于搜索模式的开始处,搜索起来是最慢的;
3)注意通配符防止的位置,放错地方则无法返回正确的结果。
6.正则表达式 REGEXP操作符
-- 1.正则表达式的基本使用【REGEXP 】
-- 只要列名所代表的列中包含模式串即返回该记录(不区分大小写)
select * from 表名 as 表别名 where 列名 REGEXP '模式串';
-- 2.正则表达式区分大小写 【BINARY】
select * from 表名 as 表别名 where 列名 REGEXP BINARY '模式串';
-- 3.进行多个模式串的匹配【| 符号】
select * from 表名 as 表别名 where 列名 REGEXP '模式串1|模式串2|...';
-- 4.使用[]定义一组单个字符,只匹配[]中的一个字符【[]符号】
select * from 表名 as 表别名 where 列名 REGEXP '[123] 模式串';
-- 5.匹配范围【-符号】
-- [0-9] [1-5] [a-z]等等都是合法的
select * from 表名 as 表别名 where 列名 REGEXP '[0-9] 模式串';
-- 6.模式串中的转义字符 用于匹配. - | [] \等特殊字符【\\符号】
-- 如果想找到包含'.'的记录, 下面的写法会匹配所有的记录
select * from 表名 as 表别名 where 列名 REGEXP '.';
-- 应该使用\\符号进行转义
select * from 表名 as 表别名 where 列名 REGEXP '\\.';
select * from 表名 as 表别名 where 列名 REGEXP '\\-';
-- 匹配反斜杠\本身
select * from 表名 as 表别名 where 列名 REGEXP '\\\';
-- 小结: 多数正则表达式使用一个\转移特殊字符,而MySQL使用两个\\
-- MySQL本身解释一个\,正则表达式库解释另一个\
正则表达式\符号用于引用元字符
元字符 | 说明 |
---|---|
\\f | 换页 |
\\n | 换行 |
\\r | 回车 |
\\t | 制表 |
\\v | 纵向制表 |
预定义字符类集
类 | 说明 |
---|---|
[:alnum:] | 任意字母和数字[a-zA-Z0-9] |
[:digit:] | 任意数字[0-9] |
[:xdigit:] | 任意十六进制数字[0-9] |
[:alpha:] | 任意字符 [a-zA-Z] |
[:lower:] | 任意小写字母[a-z] |
[:upper:] | 任意小写字母[A-Z] |
[:blank:] | 空格和制表[\\t] |
[:space:] | 包括空格在内的任意空白字符[\\f\\n\\r\\t\\v] |
[:print:] | 任意可打印字符 |
[:graph:] | 任意可打印字符,但不包括空格 |
[:cntrl:] | ASCII控制字符 ASCII 0到31和127 |
[:punct:] | 既不在[:alnum:] 又不在[:cntrl:]中的任意字符 |
重复元字符(匹配多个重复字符)
元字符 | 说明 |
---|---|
* | 匹配0个或多个前面出现的字符 |
+ | 匹配1个或多个前面出现的字符 |
? | 匹配0个或1个前面出现的字符 |
{n} | 匹配n个 前面出现的字符 |
{n, } | 匹配不少于n个前面出现的字符 |
{n, m} | 匹配不少于n个 ,不多于m个前面出现的字符 |
定位元字符
元字符 | 说明 |
---|---|
^ | 文本的开始位置, 同时可以在集合中用于否定该集合 |
$ | 文本的结束位置 |
[[:<:]] | 词的开始位置 |
[[:>:]] | 词的结束位置 |
简单的正则表达式测试
-- 可以使用select语句进行简单的正则表达式测试 匹配返回1 不匹配返回0
select '待匹配串' REGEXP '模式串';
-- 例如 下面语句返回0, 因为hello中没有一个数字;
select 'hello' REGEXP '[0-9]';