一、正则表达式
匹配 | 描述 |
---|---|
^ | 匹配文本的开始字符 |
$ | 匹配文本的结束字符 |
. | 匹配任何单个字符 |
* | 匹配零个或多个在它前面的字符 |
% | 匹配所有 |
+ | 匹配前面的字符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)