您的位置:首页 > 数据库 > MySQL

MySQL必知必会笔记(一)

2015-08-10 15:31 567 查看
检索不同的行
检索出来的数据不重复DISTINCT关键字,顾名思义返回不同的值

SELECT
DISTINCT columnOne
FROM table;
//检索出来的columnOne没有重复值

DISTINCT关键字应用于所有列而不仅是前置它的列

SELECT
DISTINCT vend_id,prod_price......要求vend_id,prod_price这两列都不出现重复的

限制结果条数

sql语句后面加入下面sql语句

LIMIT 5 显示结果的前5条

LIMIT 3,4 从行3开始的后4行

LIMIT 4
OFFSET 3 从行3开始的后4行

排序检索数据

子句 Sql语句是由子句构成,有些子句是必须的,有些事可选的。一个子句通常是由一个关键字和所提供的数据组成。

按单列排序

SELECT columnOne
FROM table ORDER BY columnOne;

SELECT columnOne
FROM table ORDER BY columnTwo; //用非检索列也是可以的,如根据columnTwo

按多列排序

SELECT columnOne,columnTwo,columnThire
FROM products ORDER BY prod_price,prod_name;

排序是先根据前面的columnOne排序 ,如果一样再根据后面的columnTwo排序

指定排序方向

ASC 升序 默认 DESC 降序 关键字仅作用到直接位于前面的列名

SELECT columnOne,columnTwo,columnThire
FROM table ORDER BY columnOne
ASC, columnTwo
DESC; //先按columnOne正排序
再按columnTwo倒序排序

过滤数据

使用WHERE
语句

SELECT columnOne,columnTwo
FROM table WHERE columnOne = 3;

WHERE子句操作符

操作符 说明

= 等于

<> 不等于(数字比较)

!= 不等于(数字和字符串比较)

< 小于

> 大于

<= 小于等于

> 大于

>= 大于等于

BETWEEN 在指定的两个指之间
必须指定2个值。这两个值必须使用AND连接

SELECT columnOne,columnTwo,
FROM table WHERE columnOne
BETWEEN 3 AND 8;
// 检索columnOne值为3到8之间的行

空值检查

SELECT 语句中有一个子句检查具有NULL值的列,IS NULL子句。

SELECT columnOne
FROM table WHERE columnOne
IS NULL;
//检索 columnOne值为NULL的行

注意:在数据库中NULL是不能被匹配和不匹配的语句找出来,所以一定要注意表中是否存在NULL值

数据过滤

组合WHERE子句

组合方式

AND组合 和
OR组合

必须满足所有条件

SELECT columnOne,columnTwo,columnThire
FROM table WHERE columnOne = 2009
AND columnTwo <= 10; //检索columnOne =2009
且 columnTwo <= 10
的行

满足任意一个条件

SELECT columnOne,columnTwo,columnThire
FROM table WHERE columnOne = 2009
OR columnTwo <= 10;//检索columnOne =2009
或 columnTwo <= 10
的行

计算次序

先计算AND再计算OR,不要过分依赖默认计算次序,可以使用括号改变计算次序,它能消除歧义。

IN操作符 IN操作符用来指定范围,范围中的每个条件进行匹配。IN取合法值的逗号分隔的清单。

SELECT columnOne,columnTwo
FROM table WHERE columnOne
IN (1002,1005,1006) ORDER
BY columnTwo;
//检索columnOne为1002或1005或1006的行并且按columnTwo分组

IN操作符完成与OR相同的功能,优点如下:

1 使用长的合法选项清单时,IN操作符的预防更清楚且直观

2 使用IN时,计算的次序更容易管理(以为使用的操作符更少)

3 IN操作符一般比OR操作符执行更快

4 IN操作符最大的优点可以包含其他SELECT语句,使得能够更动态的创建WHERE子句。

NOT操作符 WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件

SELECT columnOne,columnTwo
FROM table WHERE columnOne
NOT IN (1002,1005,1006)
ORDER BY columnTwo;
//检索columnOne不为1002或1005或1006的行并且按columnTwo分组

MySQL支持使用NOT对IN、BETWEEN和EXISTS子句取反。

用通配符进行过滤

LINK操作符

通配符:用来匹配值的一部分的特殊字符。

搜索模式:又字面值、通配符或两者组成构成的搜索条件

%
任何字符出现任何位置区分大小写


//检索以jet开头的词或句子

SELECT columnOne,columnTwo
FROM table WHERE columnOne
LINK ' jet% ';

//检索以jet结尾的词或句子

SELECT columnOne,columnTwo
FROM table WHERE columnOne
LINK ' %jet ';

//检索以jet包含的词或句子

SELECT columnOne,columnTwo
FROM table WHERE columnOne
LINK ' %jet% ';

//检索以e开头,以u
结尾的词或句子

//检索' e%u ';

%还可以匹配0字符,注意尾空格会影响搜索模式的结果。

_
匹配单个字符


SELECT columnOne,columnTwo
FROM table WHERE columnOne
LINK '_abc'

//匹配aabc eabc eabc
等前面一个字母的词

让like区分大小写的方法

在WHERE和列名之间加BINARY关键字,或者再建立表时就指定区分大小写name varhar(50) binary

使用通配符是有代价的,提供以下的技巧

不要过度的使用通配符

除非是必要的,否则通配符不要用在搜索模式的开始处

仔细注意通配符的位置。不要放错位置

用正则表达式进行搜索

仅支持正则表达式的一小部分

基本字符匹配

检索列prod_name包含1000
的所有行


SELECT columnOne
FROM table WHERE columnOne
REGEXP '1000'
ORDER BY columnOne

. 匹配任意一个字符1000 2000 3000 a000

SELECT columnOne
FROM table WHERE columnOne
REGEXP '.000'
ORDER BY columnOne

正则匹配不区分大小写
,如想区分匹配可在REGEXP
后面加上BINARY关键字


进行OR匹配

为搜索两个或n个字符串之一

SELECT columnOne
FROM table WHERE columnOne
REGEXP '1000|2000|3000' ;

匹配单个字符

SELECT columnOne
FROM table WHERE columnOne
REGEXP '[123] Ton';
//匹配1 Ton
或2 Ton或3 Ton

当有非匹配的内容时使用[],它是
| 的另一种形式,如1|2|3 Ton这时匹配的只有3带有Ton

如果想要得到非匹配的内容可以使用[^123]的形式

匹配范围 [0-9] [a-z][A-Z]

SELECT columnOne
FROM table WHERE columnOne
REGEXP '[1-5] Ton' ;

匹配特殊字符

想要匹配 . [ ] | 这些字符串怎么办呢,可以在这些字符前加 \\ 进行转义,第一个\ mysql自己解释,第二个给正则解释的

元字符 说明

\\\ \

\\f 换页

\\n 换行

\\r 回车

\\t 制表

\\v 纵向制表

匹配字符串类

自己经常使用的数字、所有字母或所有数字字母字符等的匹配。为了方便工作,可以使用预定义的字符集,称为字符集:

类 说明

[:alnum:] 任意字母和数字,同[0-9a-zA-Z]

[:alpha:] 任意字符,同[a-zA-Z]

[:blank:] 空格和制表,同\\t

[:cntrl:] ASCII控制字符,ASCII0到31和127

[:digit:] 任意数字 同[0-9]

[:graph:] 与[:print:]相同,但不包括空格

[:lower:] 任意小写字母,同[:a-z:]

[:print:] 任意可打印字符

[:punct:] 既不在[:alnum:]有不在[:cntrl:] 的字符

[:space:] 包括空格在内的任意空白字符,同[\\f\\n\\r\\t\\v]

[:upper:] 任意大写字母[A-Z]

[:xdigit:] 任意十六进制数字,同[a-fA-F0-9]

匹配多个实例

以前的匹配都是单次匹配。如果存在一个匹配,改行就检索出来,如果不存在,检索不出任何行。但有时需要对匹配的数目进行更强的控制。

重复元字符

元字符 说 明

* 0个或多个匹配

+ 1个或多个匹配

? 0个或1个匹配

{n}
指定数目匹配

{n,}
不少于n个匹配

{n,m}
匹配数目的范围 m不超过255

列:SELECT columnOne
FROM table WHERE columnOne
REGEXP '\\([0-9] sticks?)\\';

Sticks?匹配的是 stick 或sticks(?号决定前面的s出现一次或0次)

列:SELECT columnOne
FROM table WHERE columnOne
REGEXP '[[:digit:]]'
ORDER BY columnOne;

[:digit:]匹配任意的数字,{4}要求前面匹配的数字出现4次

定位符

前面的所有例子都是匹配一个串中的任意位置的文本。为了匹配特定位置的文本

元字符 说 明

^ 文本的开始

$ 文本的结束

[[:<:]] 词的开始

[[:>:]] 词的结束
例如:你要找一个数(包括以小数点开始的数)开始的所有产品,怎么办,前面都是在行内任意位置匹配。所以不行

SELECT columnOne FROM table
WHERE columnOne REGEXP '^[0-9\\ . ]';

简单的正则测试,可以不在数据库操作的情况下练习

SELECT 'hello' REGEXP '[0-9]';
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: