MYSQL教程系统(一)-select

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

原文地址:https://www.cnblogs.com/happyuu-2019/p/13719855.html