Mysql数据库(八)——mysql高阶语句(中)
一、正则表达式(同shell脚本的正则表达式)
- MysQL正则表达式通常是在检索数据库记录的时候,根据指定的匹配模式匹配记录中符合要求的特殊字符串。
- MysQL的正则表达式使用REGEXP这个关键字来指定正则表达式的匹配模式
- REGEXP操作符所支持的匹配模式如下
匹配模式 | 描述 |
---|---|
^ | 匹配文本的开始字符 |
$ | 匹配文本的结束字符 |
. | 匹配任何单个字符 |
* | 匹配零个或多个在它前面的字符 |
+ | 匹配前面的字符 1 次或多次 |
字符串 | 匹配包含指定的字符串 |
p1Ip2 | 匹配 p1 或 p2 |
[…] | 匹配字符集合中的任意一个字符 |
[^…] | 匹配不在括号中的任何字符 |
{n} | 匹配前面的字符串 n 次 |
{n,m} | 匹配前面的字符串至少 n 次,至多m 次 |
1、以"."代替任意一个字符
2、匹配前面字符多次
3、匹配前面字符至少一次
4、匹配字符串
5、匹配包含或者关系的记录
6、匹配指定字符集中的任意一个
二、运算符
- MysQL的运算符用于对记录中的字段值进行运算。
- MysQL的运算符共有四种,分别是:算术运算符、比较运算符、逻辑运算符和位运算符。
1、算数运算
运算符 | 描述 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 取余 |
- 在除法运算中,除数不能为0,若除数是0,则返回的结果为 null 。
- 如果有多个运算符,按照先乘除后加减的优先级进行运算,相同优先级的运算,没有先后顺序
2、比较运算符
- 字符串的比较默认不区分大小写,可使用 binary 来区分
常用比较运算符 | 说明 |
---|---|
= | 等于 |
!=或<> | 不等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
is null | 判断是否为null |
is not null | 判断是否不为null |
between and | 两者之间 |
greatest | 两个或多个参数时返回最大值 |
least | 两个或多个参数时返回最小值 |
in | 在集合中 |
①、等于(=)
- 等号(=)用来判断数字、字符串和表达式是否相等的,如果相等则返回1,如果不相等则返回0。
- 如果比较的两者有一个值是NULL,则比较的结果就是NULL。
- 其中字符的比较是根据ASCII码来判断的,如果ASCIl码相等,则表示两个字符相同;如果ASCII码不相等,则表示两个字符不相同。例如字符串(字母)比较: (‘a’ > ‘b’)其实比较的是底层ASCll码需要关注的ASCII码有:a、A、0
- 如果两者都是整数,则按照整数值进行比较。
- 如果一个整数一个字符串,则会自动将字符串转换为数字,再进行比较。
- 如果两者都是字符串,则按照字符串进行比较。
- 如果两者中至少有一个值是NULL,则比较的结果是NULL
②、不等于(!=或<>)
- 用于针对数字、字符串和表达式不相等的比较,如果不相等则返回1,如果相等则返回0
- 不等于(!=,<>)无法用于判断是否为null
③、大于、大于等于、小于、小于等于
- 大于(>)运算符用来判断左侧的操作数是否大于右侧的操作数,若大于返回1,否则返回0,同样不能用于判断NULL
- 小于(<)运算符用来判断左侧的操作数是否小于右侧的操作数,若小于返回1,否则返回0,同样不能用于判断NULL
- 大于等于(>=)判断左侧的操作数是否大于等于右侧的操作数,若大于等于返回1,否则返回0,不能用于判断NULL
- 小于等于(<=)判断左侧的操作数是否小于等于右侧的操作数,若小于等于返回1,否则返回0,不能用于判断NULL
④、判断一个值为/不为null(is null,is not null)
- IS NULL判断一个值是否为NULL,如果为NULL返回1,否则返回0
- IS NOT NULL判断一个值是否不为NULL,如果不为NULL返回1,否则返回0
⑤、两者之间(between … and …)
- 通常用于判断一个值是否在某两个值之间。例如,判断某数字是否在另外两个数字之间,也可以判断某英文字母是否在另外两个字母之间,条件符合返回1,否则返回0
⑥、当有两个或者多个参数时,返回其中最大/最小值,如果其中有一个为null,则返回null(least、greatest)
⑦、在/不在集合中(in/not in)
- in 判断一个值是否在集合中,在则返回1,否则返回0
- not in 判断一个值是否不在集合中,不在则返回1,在则返回0
⑧、通配符匹配
- LIKE用来匹配字符串,如果匹配成功则返回1,反之返回0
- LIKE支持两种通配符:‘g’用于匹配任意数目的字符,而’_'只能匹配一个字符。
3、逻辑运算符
- 逻辑运算符又被称为布尔运算符,通常用来判断表达式的真假,如果为真返回1,否则返回0,真和假也可以用TRUE和FALSE表示。
- MySQL中支持使用的逻辑运算符有四种
- not 或 ! :逻辑非
- and 或 && :逻辑与
- or :逻辑或
- xor :逻辑异或
①、逻辑非(not 或 !)
- 逻辑非将跟在他后面的值取反,如果NOT后面的操作数为0时,所得值为1
- 如果操作数为非0时,所得值为0
- 如果操作数为NULL时,所得值为NULL
②、逻辑与(and 或 &&)
- 当所有操作数都为非零值并且不为NULL时,返回值为1
- 当一个或多个操作数为0时,返回值为0
- 操作数中有任何一个为NULT时,返回值为NULL
③、逻辑或(or)
- 当两个操作数都为非NULL值时,如果有任意一个操作数为非零值,则返回值为1,否则结果为0
- 当有一个操作数为NULL时,如果另一个操作数为非零值,则返回值为1,否则结果为NULL
- 假如两个操作数均为NULL时,则返回值为NULL。
④、逻辑异或(xor)
- 当任意一个操作数为NULL时,返回值为NULL
- 对于非NULL的操作数,如果两个操作数都是非0值或者都是0值,则返回值为0
- 如果一个为0值,另一个为非0值,返回值为1
4、位运算符
- 位运算符是在二进制数上进行计算的运算符
- 位运算会先将操作数变成二进制数,进行位运算
- 然后再将计算结果从二进制数变回十进制数
位运算符 | 描述 |
---|---|
& | 按位与 |
I | 按位或 |
^ | 按位异或 |
! | 取反 |
<< | 左移 |
>> | 右移 |
- 按位与:对应的二进制位都为1,则运算结果为1,否则为0
- 按位或:对应的二进制位有一个为1则为1,否则为0
- 按位异或:对应的二进制位不同时,运算结果为1,否则为0
- 取反:对应的二进制数逐位反转,0取反为1,1取反为0
5、优先级
- !
- ~
- ^
- *、/、%
- +、-
- <<、>>
- &
- |
- =、<=>、>=、>、<=、<、<>、!=、like、regexp、in
- between、case、when、then、else
- not
- &&、and
- or、xor
- :=
三、连接查询
- MysQL的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。
- 首先,要确定一个主表作为结果集,然后将其他表的行有选择性的连接到选定的主表结果集上。
- 使用较多的连接查询包括:内连接、左连接和右连接
1、内连接
- MySQL中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。
- 通常在 from 子句中使用关键字 inner join 来连接多张表,并使用 on 子句设置连接条件
- 内连接是系统默认的表连接,所以在 from 子句后可以省略 inner 关键字,只使用关键字 join ,同时有多个表时,也可以连续使用 inner join 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表
select 字段 from 表1 inner join 表2 on 表1.字段=表2.字段
2、左连接
- 左连接也可以被称为左外连接,在 from 子句中用 left join 或者 left out join 关键字来表示。
- 左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。
- 左连接中,左表的记录会全部表示出来,而右表只会显示符合搜索条件的记录,不足的地方均为 null
3、右连接
- 右连接也被称为右外连接,在 from 子句中用 right join 或者 right out join 关键字来表示。
- 右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配
总结
1、算数运算符
- 算法运算中,除法运算/的结果类型为decimal,其余为Int
- 多个运算符时,先乘除后加减
2、比较运算符
- 判断结果正确为1,不正确则为0
①、等于
- 字母是按照ASCII码的数值来进行判断
- 有一个为NULL,则为NULL
②、不等于、大于、大于等于、小于、小于等于
- 无法判断NULL
③、判断一个值为/不为null
- 判断成立则为1,不成立则为0
④、两者之间
- 判断范围是包含范围的两个数值的
- 也可以用来判断英文字母
⑤、通配符匹配
- like支持两种通配符,‘g’ 用于匹配任意数目字符,而 ‘_’ 只能匹配一个字符
3、逻辑运算符
- 是用来判断表达式的真假,真为1,假为0
①、逻辑非(not 或 !)
- NULL则为NULL
- 非0时则为0
- 0时则为1
- 注:整体判断时需要使用单引号进行整体判断
- 例如 select !1+1 的结果为1,而 select !‘1+1’ 则为0
②、逻辑与(and 或 &&)
- 都非0,且不为NULL,则为1
- 有一个或多个0,则为0
- 非0时,有NULL,则为NULL
③、逻辑或(or)
- 有NULL时:
- 全是NULL则为NULL
- 不全是NULL时:有0则为NULL,非0则为1
- 无NULL时:
- 非0则为1
- 有0时:不全是0则为1,全是0则为0
④、逻辑异或(xor)
- 有NULL则为NULL
- 非NULL时
- 全是0或者全是非0则为0
- 不全是0则为1
4、位运算符
- 按位与:对应的二进制位都为1,则运算结果为1,否则为0
- 按位或:对应的二进制位有一个为1则为1,否则为0
- 按位异或:对应的二进制位不同时,运算结果为1,否则为0
- 取反:对应的二进制数逐位反转,0取反为1,1取反为0
5、连接查询
- 内连接是默认的表连接,可省略inner ,只用 jion ,查询的结果为两表相同字段。最好不要超过三张表。
- 左连接中主表在左边,主表内容会全部显示出来,在从表中没匹配到的以NULL显示出来
- 右连接中主表在右边,主表内容会全部显示出来,在从表中没匹配到的以NULL显示出来