sql查询关键字 select
数据表可以想象成一张excel表格,由行和列组成,每列有字段代表这一列的内容(但区别的是,excel字段列(表头)占表中一行,而数据库的表字段不占用一行,数据表存储的内容就相当于excel表格去掉表头一行)
以下是作为测试讲解设计的数据库表格,表名为test,有三个列表,分别为id, name, age,sex
id | name | age | sex |
1 | 阿猫 | 12 | M |
2 | 阿狗 | 32 | F |
3 | 阿三 | 12 | F |
4 | 阿四 | 3 | M |
5 | 阿五 | 4 | M |
6 | 阿六 | 15 | F |
7 | 阿七 | 6 | F |
8 | 阿莎 | 1 | M |
9 | 阿信 | 2 | M |
10 | 阿猫 | 12 | M |
查询某一列数据
select 列名 from 表名
select name from test; #查询name列所有内容
查询多列数据
select 列名1,列名2,列名n from 表名
select name,age from test; #查询name和age列所有内容
查询所有列数据
select * from 表名
select * from test; #查询所有内容
查询不同行数据
select DISTINCT 列名 from 表名
DISTINCT关键字是用来过滤重复的记录,只保留一条,返回唯一不同的值
DISTINCT关键字只能返回过滤的字段内容,其他非过滤的是不会被显示的
select DISTINCT age from test; #查询不同的age
select DISTINCT sex from test; #查询不同的性别
select DISTINCT age, sex from test; #查询age+sex不同的组合
select sex, DISTINCT age from test; #报错,distinct必须放在最前
Q: 那如何查询多个字段并显示,但仅仅某个字段是唯一的呢?
查询限制行数数据
默认查询结果是返回全部行数据
select 列名1,列名2,列名n from 表名 LIMIT 5
select * from test LIMIT 10; #查询结果不多于10行,默认从第1行开始,等同LIMIT 0,10
select * from test LIMIT 5,10; #查询结果从第6行开始往后10行,也就是6-15行(第一行是行0)
排序
默认查询结果的顺序是不确定的,如果想要在结果集上排序,在最后加上关键字ORDER BY子句
select 列名1,列名2,列名n from 表名 ORDER BY 列名1,列名2,列名n
select * from test order by id; #根据id排序
select * from test order by name, age; #先根据name排序,再根据age排序
升降序
默认排序是升序,如果想要降序,必须制定关键字DESC(降序),ASC(升序,其实没有多大用处,默认就是升序,所以一般也就不指定了)
select 列名1,列名2,列名n from 表名 ORDER BY 列名1 DESC,列名2,列名n DESC
select * from test order by id desc ; #根据id降序排序
select * from test order by name desc, age; #先根据name降序排序,再根据age升序排序
如果想在多个列都进行同一种排序,那么必须在每个列指定关键字
select * from test order by name desc, age desc; #先根据name降序排序,再根据age降序排序
过滤数据
select 列名1,列名2,列名n from 表名 WHERE 表达式
select * from test where id=1 ; #查询id=1的行
表达式操作符
操作符 | 说明 |
= | 等于 |
<> | 不等于 |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
BETWEEN AND | 在指定的两个值之间,包含两头 |
select * from test where id > 1;
select * from test where name != '阿三';
select * from test where id between 1 and 10;
特殊的空值检查 IS NULL
空值在mysql中是NULL值,而不是0,空字符串,仅仅包含空格
select * from test where age IS NULL;
逻辑操作符
逻辑操作符就是用来联结或者改变where子句的关键字
操作符 | 说明 |
AND | 同时满足所有给定条件 |
OR | 满足任意一个指定条件 |
IN | 与指定范围的每一个条件都可以匹配 |
NOT | 否定之后跟的任何条件,可以与IN,BETWEEN,EXISTS子句取反 |
select * from test where age > 3 and age < 10;
select * from test where age > 3 or id < 10;
select * from test where age > 3 or age< 2 and name='啊三'; #注意顺序,and优先,查询的是age<2的阿三或者age>3的所有人
select * from test where (age > 3 or age< 2) and name='啊三'; #注意顺序,括号优先,查询的是age>3 或者 age<2的阿三
任何时候都应该加上括号,更加清晰
select * from test where age in (3,4,5,6,10); # 查询年龄是3,4,5,6,10的行
select * from test where age not in (3,4,5,6,10); # 查询年龄不是3,4,5,6,10的行
IN和OR有什么区别呢?
1,在使用长的范围值时候,IN更加简洁
2,操作符少,不用考虑顺序
3,执行块
4,IN可以包含其他select语句
通配符
通配符可以用来匹配值的一部分的特殊字符 ,使用关键字LIKE操作符,告诉mysql利用通配符匹配
通配符 | 说明 |
% | 匹配任何字符出席任意次数,包括0,1,多个字符 |
_ | 匹配单个任意字符 |
select * from test where name LIKE '阿%'; #查询name以阿开头,后面跟任何字符,不管有多少字符
select * from test where name LIKE '%dw%'; #查询name包含dw,不论他前面和后面跟着多少任意字符
select * from test where name LIKE '%'; #查询name为任意字符的行,除了name为NULL
select * from test where name LIKE '阿_'; #查询name以阿开头,后面跟1个字符
使用通配符技巧
使用通配符查询效率比上面所介绍的都要慢,这里给出一些技巧
- 不要过度使用通配符,如果其他操作符能够达到目的应该使用其他操作符
- 在确实需要使用通配符时,除非绝对有必要,否则不要把他们用在搜索模式的开始处,
- 仔细注意通配符的位置,如果放错地方,可能不会返回想要的数据
正则表达式
正则表达式可以用来查找,提取和替换文本中某些特殊的字符集合,关键字REGEXP,类似LIKE
但是LIKE和REGEXP不同,LIKE匹配整个字符串,REGEXP匹配子串,利用定位符^$可以使得和LIKE一样
下面介绍一些常用的正则表达式,mysql正则表达式支持的仅仅是一般所说的正则表达式的一部分
符号 | 说明 |
. | 匹配任意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 * from test where name REGEXP '阿'; #查询name中有阿字的行,如果换成LIKE,则是查询name=阿的行
select * from test where name REGEXP '^阿$'; #查询name=阿的行
select * from test where name REGEXP '阿.'; #查询name中有阿字,且阿字后面跟着一个任意字符
mysql正则表达式匹配不区分大小写,如果要区分,加上关键字BINARY
select * from test where name REGEXP BINARY 'ABCabc.Dd';
select * from test where age REGEXP ‘10|20’;
select * from test where age REGEXP ‘[123]’;
可以在没有数据表的情况下,测试正则表达式
select 'hello' REGEXP '[0-9]'; #匹配成功返回1,匹配失败返回0