MYSQL教程系统(一)-select

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容