正则表达式
MySQL 的正则表达式使用 REGEXP 这个关键字来指定正则表达 式的匹配模式,REGEXP 操作符所支持的匹配模式如表所示
在 info 表中查询以 字母‘l’开头的 name 字段并打印对应的 id、name 和 score 记录。
mysql> select id ,name,score from info where name regexp '^l';
+----+------+-------+
| id | name | score |
+----+------+-------+
| 2 | lisi | 80.00 |
+----+------+-------+
1 row in set (0.00 sec)
查询以an结尾的name字段,并打印出相应的id和score
mysql> select id ,score from info where name regexp 'an$';
+----+-------+
| id | score |
+----+-------+
| 1 | 80.00 |
+----+-------+
1 row in set (0.00 sec)
查询name字段中带an的,并显示id、name、score对应的信息
mysql> select id,name,score from info where name regexp 'an';
+----+----------+-------+
| id | name | score |
+----+----------+-------+
| 1 | zhangsan | 80.00 |
| 3 | wangwu | 70.00 |
| 5 | tianqi | 80.00 |
+----+----------+-------+
3 rows in set (0.00 sec)
查看name字段中以z开头,n结尾的
mysql> select * from info where name regexp '^z.+n$';
+----+----------+-------+---------+
| id | name | score | address |
+----+----------+-------+---------+
| 1 | zhangsan | 80.00 | beijing |
+----+----------+-------+---------+
1 row in set (0.00 sec)
查找name字段带有zh或ba的数据,并显示出其id,name,score字段信息
mysql> select id,name,score from info where name regexp 'zh|ba';
+----+----------+-------+
| id | name | score |
+----+----------+-------+
| 1 | zhangsan | 80.00 |
| 4 | zhaoliu | 60.00 |
| 6 | heiba | 70.00 |
+----+----------+-------+
3 rows in set (0.00 sec)
验证*在正则中的作用
查看name字段含有ti的,i可以出现或者不出现
mysql> select id,name,score from info where name regexp 'ti*';
+----+--------+-------+
| id | name | score |
+----+--------+-------+
| 5 | tianqi | 80.00 |
+----+--------+-------+
1 row in set (0.00 sec)
查看带有t的记录,t可有可无
mysql> select id,name,score from info where name regexp 't*';
+----+----------+-------+
| id | name | score |
+----+----------+-------+
| 1 | zhangsan | 80.00 |
| 2 | lisi | 80.00 |
| 3 | wangwu | 70.00 |
| 4 | zhaoliu | 60.00 |
| 5 | tianqi | 80.00 |
| 6 | heiba | 70.00 |
+----+----------+-------+
6 rows in set (0.00 sec)
查看name字段以h-l开头的数据
mysql> select id,name,score from info where name regexp '^[h-l]';
+----+-------+-------+
| id | name | score |
+----+-------+-------+
| 2 | lisi | 80.00 |
| 6 | heiba | 70.00 |
+----+-------+-------+
2 rows in set (0.00 sec)
^在括号里面表示取反
mysql> select id,name,score from info where name regexp '[^zhangsan]';
+----+---------+-------+
| id | name | score |
+----+---------+-------+
| 2 | lisi | 80.00 |
| 3 | wangwu | 70.00 |
| 4 | zhaoliu | 60.00 |
| 5 | tianqi | 80.00 |
| 6 | heiba | 70.00 |
+----+---------+-------+
5 rows in set (0.00 sec)
二、运算符
MySQL 的运算符用于对记录中的字段值进行运算。MySQL 的运算符共有四种,分别是:算术运算符、比较运算符、逻辑运算符和位运算符。
2.1 算术运算符
- 如果两者都是整数,则按照整数值进行比较。
- 如果一个整数一个字符串,则会自动将字符串转换为数字,再进行比较。(在程序中,一般是不会吧这两者进行相比较的)
- 如果两者都是字符串,则按照字符串进行比较。
- 如果两者中至少有一个值是 NULL,则比较的结果是 NULL。
- 与linux返回值表达相反,linux 中运行正常返回值是0,运行异常返回值是非0
不等于(<>,!=)
不等于号有两种写法,分别为<>或者!=,
用于针对数字、字符串和表达式不相等的比较
BETWEEN AND
BETWEEN AND 比较运算通常用于判断一个值是否落在某两个值之间
least 和greates
LEAST:当有两个或者多个参数时,返回其中的最小值。如果其中一个值为 NULL,则 返回结果就为 NULL
GREATEST:当有两个或者多个参数时,返回其中的最大值。如果其中一个值为NULL, 则返回结果就为 NULL
IN 和 NOT IN
LIKE 和 NOT LIKE
LIKE:用来匹配字符串,如果匹配成功则返回1,否则返回0
LIKE支持两种通配符:‘%’用于匹配任意数目的字符(*匹配的是前面一个字符),‘_'只能匹配一个字符
NOT LIKE:跟LIKE相反,如果匹配任意数目成功则返回1,否则返回0
2.3 逻辑运算符
逻辑运算符又被称为布尔运算符,通常用来判断表达式的真假,如果为真返回 1,否则 返回 0,真和假也可以用 TRUE 和 FALSE 表示。MySQL 中支持使用的逻辑运算符有四种, 具体如表所示
1. 逻辑非
逻辑运算符中最简单的运算符就是逻辑非,逻辑非使用 NOT 或!表示。逻辑非将跟在 它后面的逻辑测试取反,把真变为假,把假变为真。如果 NOT 后面的操作数为 0 时,所得值为 1;如果操作数为非 0 时,所得值为 0;如果操作数为 NULL 时,所得值为 NULL。
2.逻辑与
当所有的操作数都为非0值且不为null时,返回值为1,否则为0(null与0比较特殊)
null and 0 返回值为0
逻辑与使用 AND 或者&&表示
3.逻辑或
逻辑或通常使用 OR
逻辑或表示包含的操作数,任意一个非零值并且不是NULL值时,返回1,否则返回0
当有一个操作数为NULL时,如果另一个操作数为非0值,则返回值为1,否则为NULL
如两个操作数均为NULL,则返回值为NULL
4.逻辑异或(XOR)
两个非NULL值为操作数,如果两者都是0 或者都是非0,则返回0
如果一个为0,另一个为非0,则返回结果为1
当任意一个值为NULL时,返回值为NULL
5.位运算符
位运算符实际上是对二进制数进行计算的运算符。MySQL 内位运算会先将操作数变成二进制格式(1010 1111),然后进行位运算,最后在将计算结果
从二进制变回到十进制格式,方便用户查 看。MySQL 支持 6 种位运算符,具体如表所示
以上不管哪种运算符,在使用过程中都有优先级问题。运算符的优先级决定了不同的运 算符在计算过程中的先后顺序。级别高的运算符会先进行计算,如果运算符的级别相同, MySQL 会按照顺序从左到右依次进行计算
三连接查询
MySQL 的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的 共同字段,进行数据的拼接。
首先,要确定一个主表作为结果集,然后将其他表的行有选择 性的连接到选定的主表结果集上
使用较多的连接查询包括:内连接、左连接和右连接
3.1## 内连接
内连查询:通过inner join的方式将两张指定的相同字段的记录行输出
3.2左连接
- 左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示
- 左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参 考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行
- 左连接中左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为 NULL
3.3 右连接
右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。
右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配
在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹 配的行,这些记录在左表中以 NULL 补足