深入理解mysql语句(二)

一、正则表达式

匹配描述
^匹配文本的开始字符
$匹配文本的结束字符
.匹配任何单个字符
*匹配零个或多个在它前面的字符
%匹配所有
+匹配前面的字符1次或多次
?匹配前一个字符0次或一次
a|b匹配a或b
[…]匹配字符集合中的任意一个字符
[^…]匹配不在括号中的任何字符
{n}匹配前面的字符串 n 次
{n,m}匹配前面的字符串至少 n 次,至多 m 次

实例

#查询以g开头的name信息
mysql> select id,name from wz where name regexp '^g';
+----+----------+
| id | name     |
+----+----------+
|  4 | ganjiang |
+----+----------+
1 row in set (0.00 sec)

#查询以g结尾的name信息
mysql> select id,name from wz where name regexp 'g$';
+----+------------+
| id | name       |
+----+------------+
|  4 | ganjiang   |
|  6 | zhangliang |
+----+------------+
2 rows in set (0.00 sec)

#查询含有ji的name信息
mysql> select id,name from wz where name regexp 'ji';
+----+----------+
| id | name     |
+----+----------+
|  2 | yuji     |
|  3 | jialuo   |
|  4 | ganjiang |
|  7 | anjila   |
+----+----------+
4 rows in set (0.00 sec)

#查询以yu开头,i结尾的,且中间任一字符的数据
mysql> select id,name from wz where name regexp 'yu.i';
+----+------+
| id | name |
+----+------+
|  2 | yuji |
+----+------+
1 row in set (0.00 sec)

#查询含有an或ao的name信息
mysql> select id,name from wz where name regexp 'an|ao';
+----+------------+
| id | name       |
+----+------------+
|  1 | xiaoqiao   |
|  4 | ganjiang   |
|  5 | luban      |
|  6 | zhangliang |
|  7 | anjila     |
+----+------------+
5 rows in set (0.00 sec)

#查询含有an,g可以没有或有一个或多个
mysql> select id,name from wz where name regexp 'ang*';
+----+------------+
| id | name       |
+----+------------+
|  4 | ganjiang   |
|  5 | luban      |
|  6 | zhangliang |
|  7 | anjila     |
+----+------------+
4 rows in set (0.00 sec)

#查询含有an,g至少有一个
mysql> select id,name from wz where name regexp 'ang+'; 
+----+------------+
| id | name       |
+----+------------+
|  4 | ganjiang   |
|  6 | zhangliang |
+----+------------+
2 rows in set (0.00 sec)

#查询含有an,g可以没有或有一个
mysql> select id,name from wz where name regexp 'ang?';
+----+------------+
| id | name       |
+----+------------+
|  4 | ganjiang   |
|  5 | luban      |
|  6 | zhangliang |
|  7 | anjila     |
|  8 | angg       |
+----+------------+
5 rows in set (0.00 sec)

#查询以[a-c]中任一字符开头的数据
mysql> select id,name from wz where name regexp '^[a-c]';
+----+--------+
| id | name   |
+----+--------+
|  7 | anjila |
+----+--------+
1 row in set (0.00 sec)

#查询name字段不是anjila的数据,注:需要输入该字段的完整记录
mysql> select id,name from wz where name regexp '[^anjila]';
+----+------------+
| id | name       |
+----+------------+
|  1 | xiaoqiao   |
|  2 | yuji       |
|  3 | jialuo     |
|  4 | ganjiang   |
|  5 | luban      |
|  6 | zhangliang |
+----+------------+
6 rows in set (0.00 sec)

二、运算符

MySQL 的运算符共有四种,分别 是:算术运算符、比较运算符、逻辑运算符和位运算符。

一、算术运算符

运算符描述
+加法
-减法
*乘法
/除法(除数不能为0,若除数是0,返回的结果则为 NULL)
%取余
mysql> create table ss as select 1+2,2-1,3*2,4/2,5%2;

mysql> select * from ss;
+-----+-----+-----+--------+------+
| 1+2 | 2-1 | 3*2 | 4/2    | 5%2  |
+-----+-----+-----+--------+------+
|   3 |   1 |   6 | 2.0000 |    1 |
+-----+-----+-----+--------+------+
1 row in set (0.00 sec)

mysql> desc ss;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| 1+2   | int(3)       | NO   |     | 0       |       |
| 2-1   | int(3)       | NO   |     | 0       |       |
| 3*2   | int(3)       | NO   |     | 0       |       |
| 4/2   | decimal(5,4) | YES  |     | NULL    |       |
| 5%2   | int(1)       | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

二、比较运算符

1、如果比较的结果(以布尔值的方式进行返回判断)为真则返回1,如果为假则返回0,比较两者有一个值是NULL,则比较的结果就是NULL。
2、其中字符串在进行比较的时候默认是不区分大小写的,如果要区分大小写可以通过binary关键字来实现。
3、数字之间,字母(大小写)之间的比较,比较的就是底层的ASCII码

运算符描述
=等于
>大于
<小于
>=大于等于
<=小于等于
!=或<>不等于(如果不相等则返回1,如果相等则返回0)
is null判断一个值是否为NULL,成立返回1,不成立返回0,
is not null判断一个值是否不为 NULL,成立返回1,不成立返回0
字符1 between 字符2 and 字符三判断一个值是否落在某两个值之间,成立返回1,不成立返回0
in判断一个值是否在对应的列表中,如果成立返回1,不成立返回0。
like通配符匹配(支持%和_)用来匹配字符串,如果匹配成功则返回1,反之返回0
greatest两个或多个参数时返回最大值
last两个或多个参数时返回最小值
regexp正则表达式
mysql> select 2 between 1 and 2,'c' between 'a' and 'b'; #判断2是否在1-2间,c是否a-b之间,成立返回1.不成立返回0
+-------------------+-------------------------+
| 2 between 1 and 2 | 'c' between 'a' and 'b' |
+-------------------+-------------------------+
|                 1 |                       0 |
+-------------------+-------------------------+
1 row in set (0.00 sec)

mysql> select least(1,2,3),greatest(1,2,3),least('a','b','c'),greatest('a','b','c'); #比较字符之间的大小,取最大值和最小值
+--------------+-----------------+--------------------+-----------------------+
| least(1,2,3) | greatest(1,2,3) | least('a','b','c') | greatest('a','b','c') |
+--------------+-----------------+--------------------+-----------------------+
|            1 |               3 | a                  | c                     |
+--------------+-----------------+--------------------+-----------------------+
1 row in set (0.00 sec)

mysql> select 3 in (1,3,5), 2 not in ('a','b','c'); #判断一个值是否在对应的列表中
+--------------+------------------------+
| 3 in (1,3,5) | 2 not in ('a','b','c') |
+--------------+------------------------+
|            1 |                      1 |
+--------------+------------------------+
1 row in set, 3 warnings (0.03 sec)

mysql> select '123' like '12%','123' like '_23','123' not like '1%'; #匹配判断
+------------------+------------------+---------------------+
| '123' like '12%' | '123' like '_23' | '123' not like '1%' |
+------------------+------------------+---------------------+
|                1 |                1 |                   0 |
+------------------+------------------+---------------------+
1 row in set (0.00 sec)

三、逻辑运算符

逻辑运算符(布尔运算符),通常用来判断表达式的真假,如果为真返回1,否则 返回0。
not或!:逻辑非
逻辑非将跟在它后面的逻辑测试取反,把真变为假,把假变为真。
1、如果not后面的操作数为0时,所得值为1。
2、如果操作数为非0时,所得值为0。
3、如果操作数为NULL时,所得值为NULL。
and或&&:逻辑与
当所有的操作数都为非0值且不为null时,返回值为1,否则为0。
or:逻辑或
1、逻辑或表示包含的操作数,任意一个为非零值并且不是NULL 值时,返回1,否则返回0。
2、当有一个操作数为null时,如果另一个操作数为非0值,则返回值为1,否则为null。
3、如两个操作数均为null,则返回值为null。
xor:逻辑异或
1、两个非 NULL 值的操作数,如果两者都是0或者都是非0,则返回0;
2、如果一个为0, 另一个为非0,则返回结果为1。
3、当任意一个值为NULL 时,返回值为NULL。

四、位运算符

位运算符实际上是对二进制数进行计算的运算符

位运算符描述
&按位与
|按位或
~按位取反
^按位异或
<<按位左移
>>按位右移
mysql> select 10 & 15,10 | 15,10 ^ 15,5 &~ 1;
+---------+---------+---------+--------+
| 10 & 15 | 10 | 15 | 10 ^ 15 | 5 &~ 1 |
+---------+---------+---------+--------+
|      10 |      15 |       5 |      4 |
+---------+---------+---------+--------+
1 row in set (0.00 sec)

三、连接查询

mysql> select * from wz;
+----+------------+--------+------------+--------+
| id | name       | score  | address    | hobbid |
+----+------------+--------+------------+--------+
|  1 | xiaoqiao   |  80.00 | beijing    |      2 |
|  2 | yuji       |  60.00 | shanghai   |      2 |
|  3 | jialuo     | 100.00 | hangzhou   |      4 |
|  4 | ganjiang   |  99.00 | hangzhou   |      4 |
|  5 | luban      |  98.00 | shengzheng |      5 |
|  6 | zhangliang |  60.00 | nanjing    |      3 |
|  7 | anjila     |  15.00 | suzhou     |      5 |
+----+------------+--------+------------+--------+
7 rows in set (0.00 sec)

mysql> select * from test01;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | xiaoqiao | 20   |
|    2 | yuji     | 18   |
|    3 | jialuo   | 22   |
+------+----------+------+
3 rows in set (0.00 sec)

一、内连

内连接就是两张或多张表中同时符合某种条件的数据记录的组合,最多三张表。

mysql> select wz.id,wz.name,wz.address,test01.age from wz inner join test01 on wz.name=test01.name;
+----+----------+----------+------+
| id | name     | address  | age  |
+----+----------+----------+------+
|  1 | xiaoqiao | beijing  | 20   |
|  2 | yuji     | shanghai | 18   |
|  3 | jialuo   | hangzhou | 22   |
+----+----------+----------+------+
3 rows in set (0.00 sec)

二、左连

1、左连接也可以被称为左外连接,在from子句中使用left join或者left outer join关键字来表示。
2、左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。
3、左连接中左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为null。

mysql> select * from wz left join test01 on wz.name=test01.name;
+----+------------+--------+------------+--------+------+----------+------+
| id | name       | score  | address    | hobbid | id   | name     | age  |
+----+------------+--------+------------+--------+------+----------+------+
|  1 | xiaoqiao   |  80.00 | beijing    |      2 |    1 | xiaoqiao | 20   |
|  2 | yuji       |  60.00 | shanghai   |      2 |    2 | yuji     | 18   |
|  3 | jialuo     | 100.00 | hangzhou   |      4 |    3 | jialuo   | 22   |
|  4 | ganjiang   |  99.00 | hangzhou   |      4 | NULL | NULL     | NULL |
|  5 | luban      |  98.00 | shengzheng |      5 | NULL | NULL     | NULL |
|  6 | zhangliang |  60.00 | nanjing    |      3 | NULL | NULL     | NULL |
|  7 | anjila     |  15.00 | suzhou     |      5 | NULL | NULL     | NULL |
+----+------------+--------+------------+--------+------+----------+------+
7 rows in set (0.01 sec)

三、右连

1、右连接也被称为右外连接,在from子句中使用left join或者left outer join关键字来表示。
2、它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。
3、在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹 配的行,这些记录在左表中以 null补足。

mysql> select * from wz right join test01 on wz.name=test01.name;
+------+----------+--------+----------+--------+------+----------+------+
| id   | name     | score  | address  | hobbid | id   | name     | age  |
+------+----------+--------+----------+--------+------+----------+------+
|    1 | xiaoqiao |  80.00 | beijing  |      2 |    1 | xiaoqiao | 20   |
|    2 | yuji     |  60.00 | shanghai |      2 |    2 | yuji     | 18   |
|    3 | jialuo   | 100.00 | hangzhou |      4 |    3 | jialuo   | 22   |
+------+----------+--------+----------+--------+------+----------+------+
3 rows in set (0.00 sec)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值