sql查询关键字select
数据表可以想象成一张excel表格,由行和列组成,每列有字段代表这一列的内容(但区
别的是,excel字段列(表头)占表中一行,而数据库的表字段不占用一行,数据表存储的
内容就相当于excel表格去掉表头一行)
以下是作为测试讲解设计的数据库表格,表名为test,有三个列表,分别为id,name,age,
sex
查询某一列数据
select列名from表名
selectnamefromtest;#查询name列所有内容
查询多列数据
select列名1,列名2,列名nfrom表名
selectname
,
agefromtest;#查询name和age列所有内容
查询所有列数据
select*from表名
select*fromtest;#查询所有内容
idnameagesex
1阿猫12M
2阿狗32F
3阿三12F
4阿四3M
5阿五4M
6阿六15F
7阿七6F
8阿莎1M
9阿信2M
10阿猫12M
查询不同行数据
selectDISTINCT列名from表名
DISTINCT关键字是用来过滤重复的记录,只保留一条,返回唯一不同的值
DISTINCT关键字只能返回过滤的字段内容,其他非过滤的是不会被显示的
selectDISTINCTagefromtest;#查询不同的age
selectDISTINCTsexfromtest;#查询不同的性别
selectDISTINCTage,sexfromtest;#查询age+sex不同的组合
selectsex
,
DISTINCTagefromtest;#报错,distinct必须放在最前
Q:那如何查询多个字段并显示,但仅仅某个字段是唯一的呢?
查询限制行数数据
默认查询结果是返回全部行数据
select列名1,列名2,列名nfrom表名LIMIT5
select*fromtestLIMIT10;#查询结果不多于10行,默认从第1行开始,等同LIMIT
0,10
select*fromtestLIMIT5,10;#查询结果从第6行开始往后10行,也就是6-15行
(第一行是行0)
排序
默认查询结果的顺序是不确定的,如果想要在结果集上排序,在最后加上关键字ORDER
BY子句
select列名1,列名2,列名nfrom表名ORDERBY列名1,列名2,列名n
select*fromtestorderbyid;#根据id排序
select*fromtestorderbyname,age;#先根据name排序,再根据age排序
升降序
默认排序是升序,如果想要降序,必须制定关键字DESC(降序),ASC(升序,其实没
有多大用处,默认就是升序,所以一般也就不指定了)
select列名1,列名2,列名nfrom表名ORDERBY列名1DESC,列名2,列名
nDESC
select*fromtestorderbyiddesc;#根据id降序排序
select*fromtestorderbynamedesc,age;#先根据name降序排序,再根据age
升序排序
如果想在多个列都进行同一种排序,那么必须在每个列指定关键字
select*fromtestorderbynamedesc,agedesc;#先根据name降序排序,再根
据age降序排序
过滤数据
select列名1,列名2,列名nfrom表名WHERE表达式
select*fromtestwhereid=1;#查询id=1的行
表达式操作符
select*fromtestwhereid>1;
select*fromtestwherename!='阿三';
select*fromtestwhereidbetween1and10;
操作符
说明
=
等于
<>
不等于
!=
不等于
<
小于
<=
小于等于
>
大于
>=
大于等于
BETWEENAND在指定的两个值之间,包含两头
特殊的空值检查ISNULL
空值在mysql中是NULL值,而不是0,空字符串,仅仅包含空格
select*fromtestwhereageISNULL;
逻辑操作符
逻辑操作符就是用来联结或者改变where子句的关键字
select*fromtestwhereage>3andage<10;
select*fromtestwhereage>3orid<10;
select*fromtestwhereage>3orage<2andname='啊三';#注意顺序,and
优先,查询的是age<2的阿三或者age>3的所有人
select*fromtestwhere(age>3orage<2)andname='啊三';#注意顺序,括
号优先,查询的是age>3或者age<2的阿三
任何时候都应该加上括号,更加清晰
select*fromtestwhereagein(3,4,5,6,10);#查询年龄是3,4,5,6,10的行
select*fromtestwhereagenotin(3,4,5,6,10);#查询年龄不是3,4,5,6,10的
行
IN和OR有什么区别呢?
1,在使用长的范围值时候,IN更加简洁
2,操作符少,不用考虑顺序
3,执行块
4,IN可以包含其他select语句
通配符
通配符可以用来匹配值的一部分的特殊字符,使用关键字LIKE操作符,告诉mysql利用
通配符匹配
操作符说明
AND同时满足所有给定条件
OR满足任意一个指定条件
IN
与指定范围的每一个条件都可以匹配
NOT否定之后跟的任何条件,可以与IN,BETWEEN,EXISTS子句取反
通配符说明
select*fromtestwherenameLIKE'阿%';#查询name以阿开头,后面跟任何字
符,不管有多少字符
select*fromtestwherenameLIKE'%dw%';#查询name包含dw,不论他前
面和后面跟着多少任意字符
select*fromtestwherenameLIKE'%';#查询name为任意字符的行,除了name
为NULL
select*fromtestwherenameLIKE'阿
_
'
;
#查询name以阿开头,后面跟1个字
符
使用通配符技巧
使用通配符查询效率比上面所介绍的都要慢,这里给出一些技巧
不要过度使用通配符,如果其他操作符能够达到目的应该使用其他操作符
在确实需要使用通配符时,除非绝对有必要,否则不要把他们用在搜索模式的开始
处,
仔细注意通配符的位置,如果放错地方,可能不会返回想要的数据
正则表达式
正则表达式可以用来查找,提取和替换文本中某些特殊的字符集合,关键字REGEXP,类
似LIKE
但是LIKE和REGEXP不同,LIKE匹配整个字符串,REGEXP匹配子串,利用定位符^$可
以使得和LIKE一样
下面介绍一些常用的正则表达式,mysql正则表达式支持的仅仅是一般所说的正则表达式
的一部分
%
匹配任何字符出席任意次数,包括0,1,多个字符
_
匹配单个任意字符
符号
说明
.
匹配任意1个字符
^
匹配开头
$
匹配结尾
[[:<:]]
词的开始
[[:>:]]
词的结尾
A|B
或的匹配,匹配A或B即可
[ABCDE]匹配多个字符之一,另一种或的匹配,1|2|3实际等同[123]
[^ABCDE]匹配不包含ABCDE的字符
[1-9][a-z]匹配任意数字,任意字母
\\
匹配特殊字符,包括.|-[]和其他特殊字符,\\.匹配.\\\匹配\\\n换行
等等
[:alnum:]任意字母和数字,同[1-9a-zA-Z]
[:alpha:]任意字母,同[a-zA-Z]
[:blank:]空格和制表符,同\\t
[:cntrl:]ASCII控制字符,ASCII0到37和127
[:digit:]任意数字,同[0-9]
[:graph:]与[:print:]相同,不包括空格
[:lower:]任意小写字母,同[a-z]
[:upper:]任意大写字母,同[A-Z]
[:print:]任意可打印字符
[:space:]包括空格在内的任意空白字符,同[\\t\\f\\n\\r\\v]
[:punct:]既不在[:alnum:]又不在[:cntrl:]中的任意字符
[:xdigit:]任意十六进制数字,同[a-fA-F0-9]
*
0个或多个匹配
+
1个或多个匹配
?
0个或1个匹配
{n}
指定数目的匹配
{n,}
不少于指定数目的匹配
{n,m}
不少于n,不超过m的数目匹配
select*fromtestwherenameREGEXP'阿';#查询name中有阿字的行,如果换
成LIKE,则是查询name=阿的行
select*fromtestwherenameREGEXP'^阿$';#查询name=阿的行
select*fromtestwherenameREGEXP'阿.';#查询name中有阿字,且阿字后面
跟着一个任意字符
mysql正则表达式匹配不区分大小写,如果要区分,加上关键字BINARY
select*fromtestwherenameREGEXPBINARY'ABCabc.Dd';
select*fromtestwhereageREGEXP‘10|20’;
select*fromtestwhereageREGEXP‘[123]’;
可以在没有数据表的情况下,测试正则表达式
select'hello'REGEXP'[0-9]';#匹配成功返回1,匹配失败返回0