MySQL讲义第 38 讲——select 查询之函数(1):字符串函数

MySQL讲义第 38 讲——select 查询之函数(1):字符串函数

使用函数可在查询时构造更加灵活的查询条件。MySQL 提供了处理字符串的函数,下面对字符串函数进行详细的介绍并举例说明其用法。在当前数据库中创建一个 student 表,表结构及表中的数据如下:

mysql> desc student;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| s_id   | char(5)      | NO   | PRI | NULL    |       |
| s_name | char(20)     | YES  |     | NULL    |       |
| birth  | datetime     | YES  |     | NULL    |       |
| phone  | char(20)     | YES  |     | NULL    |       |
| addr   | varchar(100) | YES  |     | NULL    |       |
+--------+--------------+------+-----+---------+-------+
5 rows in set (0.03 sec)

mysql> select * from student;
+-------+--------------+---------------------+-------------+-----------+
| s_id  | s_name       | birth               | phone       | addr      |
+-------+--------------+---------------------+-------------+-----------+
| s1801 | 刘蓓         | 2000-03-08 00:00:00 | 15903735566 | Kaifeng   |
| s1802 | 赵芸         | 2000-04-27 00:00:00 | 15903735533 | Zheng     |
| s1803 | 张毅得       | 1999-11-20 00:00:00 | 15903735544 | Xinxiang  |
| s1804 | 曹梦德       | 1999-08-07 00:00:00 | 15903735577 | Zheng     |
| s1805 | 孙泉         | 2000-10-25 00:00:00 | 15903735587 | Xinyang   |
| s1806 | 司马意       | 2000-10-24 00:00:00 | 15903735581 | Xinxiang  |
| s1807 | 司马招       | 2000-08-08 00:00:00 | 15903734444 | Anyang    |
| s1808 | 赵紫龙       | 2001-06-26 00:00:00 | 15903736666 | Zhumadian |
| s1809 | 吕步         | 2001-04-30 00:00:00 | 15903737777 | Nanyang   |
| s1810 | 刘珊         | 2002-10-26 00:00:00 | 15903732222 | Zhumadian |
| s1811 | 诸葛亮       | 2001-11-24 00:00:00 | 15903731111 | Zhumadian |
| s1901 | 诸葛英       | 2001-08-09 00:00:00 | 15903731234 | Xinxiang  |
| s1902 | 司马相如     | 2001-12-08 00:00:00 | 15903731144 | Nanyang   |
| s1903 | 王召军       | 2002-10-23 00:00:00 | 15903731199 | Kaifeng   |
| s1904 | 康西         | 2001-10-26 00:00:00 | 15903731177 | Kaifeng   |
| s1905 | 乾龙         | 2000-10-27 00:00:00 | 15903732211 | Kaifeng   |
| s1906 | 朱元张       | 2000-08-07 00:00:00 | 15903732233 | Kaifeng   |
| s1907 | 李氏敏       | 2001-10-23 00:00:00 | 15903732244 | Zhumadian |
| s1908 | 赵匡银       | 2001-10-24 00:00:00 | 15903733322 | Xinyang   |
| s1909 | 赵够         | 2001-10-25 00:00:00 | 15903733366 | Anyang    |
| s2011 | 王保墙       | 2001-10-22 00:00:00 | 15903733355 | Xinxiang  |
| s2012 | 李晓露       | 2001-11-27 00:00:00 | 15903731441 | Zhumadian |
| s2013 | 贾大空       | 2002-03-08 00:00:00 | 15903734422 | Xinxiang  |
| s2014 | 孙悟空       | 2002-10-25 00:00:00 | 15903734466 | Anyang    |
| s2015 | 猪八戒       | 2001-10-26 00:00:00 | 15903734477 | Xinxiang  |
| s2016 | 沙和尚       | 2002-10-24 00:00:00 | 15903736611 | Anyang    |
| s2017 | 唐三藏       | 2001-09-08 00:00:00 | 15903736655 | Nanyang   |
| s2018 | 白龙马       | 2001-12-05 00:00:00 | 15903736633 | Nanyang   |
| s2019 | 如来         | 2002-01-27 00:00:00 | 15903736699 | Nanyang   |
| s2020 | 观音         | 2002-02-23 00:00:00 | 15903737744 | Zhumadian |
+-------+--------------+---------------------+-------------+-----------+
30 rows in set (0.23 sec)

1、ASCII() 函数

ASCII() 函数返回一个字符的 ASCII 码,如果参数为字符串,则返回第一个字符的 ASCII 码。语法如下:

ASCII(str);

--说明:1)函数的参数为字符串。
(2)返回字符串中第一个字符的 ASCII 码。

例如:

mysql> SELECT
    -> ASCII('abc');
+--------------+
| ASCII('abc') |
+--------------+
|           97 |
+--------------+
1 row in set (0.02 sec)

mysql> SELECT 
    -> ASCII(NULL);
+-------------+
| ASCII(NULL) |
+-------------+
|        NULL |
+-------------+
1 row in set (0.00 sec)

mysql> SELECT 
    -> ASCII('');
+-----------+
| ASCII('') |
+-----------+
|         0 |
+-----------+
1 row in set (0.01 sec)

2、BIN() 函数

BIN() 函数把一个整数转化为二进制数,返回结果的类型为字符串。语法如下:

BIN(n);

--说明:1)参数为一个整数,如果参数为小数,则取整后再进行处理。
(2)把数值 n 转化为二进制形式,返回值是一个由 01 组成的字符串。

例如:

mysql> SELECT 
    -> BIN(12.85);
+------------+
| BIN(12.85) |
+------------+
| 1100       |
+------------+
1 row in set (0.00 sec)

mysql> SELECT 
    -> BIN(1023);
+------------+
| BIN(1023)  |
+------------+
| 1111111111 |
+------------+
1 row in set (0.00 sec)

3、CHAR() 函数

CHAR() 函数把多个 ASCII 码转换为对应的字符,并连接成一个字符串。语法如下:

CHAR(n1, n2, ...);

说明:
(1)参数为若干个表示 ASCII 码的整数。
(2)返回由 n1,n2,… 的 ASCII 码对应的字符组成的字符串。

例如:

mysql> SELECT
    -> CHAR(97,98,99,65,66,67);
+-------------------------+
| CHAR(97,98,99,65,66,67) |
+-------------------------+
| abcABC                  |
+-------------------------+
1 row in set (0.00 sec)

4、CHAR_LENGTH() 函数

CHAR_LENGTH() 函数返回一个字符串的字符个数。语法如下:

CHAR_LENGTH(str);

--说明:1)函数的参数为一个字符串。
(2)返回字符串中包含字符的个数,包括半角字符和全角字符。

例如:

mysql> SELECT 
    -> CHAR_LENGTH('ABC0123');
+------------------------+
| CHAR_LENGTH('ABC0123') |
+------------------------+
|                      7 |
+------------------------+
1 row in set (0.00 sec)

mysql> SELECT 
    -> CHAR_LENGTH('化工路258号');
+--------------------------------+
| CHAR_LENGTH('化工路258号')     |
+--------------------------------+
|                              7 |
+--------------------------------+
1 row in set (0.00 sec)

5、LENGTH() 函数

LENGTH() 函数返回一个字符串的长度,用字节表示。语法如下:

LENGTH(str);

--说明:1)函数的参数为一个字符串。
(2)返回字符串的长度(单位为字节)。
(3)多字节字符的长度取决于所用的字符集。比如 utf8 字符集一个汉字为 3 个字节,而 latin1 字符集一个汉字为 2 字节。

例如:

mysql> SHOW VARIABLES LIKE '%CHARACT%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.09 sec)

mysql> SELECT
    -> LENGTH('ABC0123');
+-------------------+
| LENGTH('ABC0123') |
+-------------------+
|                 7 |
+-------------------+
1 row in set (0.00 sec)

mysql> SELECT 
    -> LENGTH('河南省');
+---------------------+
| LENGTH('河南省')    |
+---------------------+
|                   9 |
+---------------------+
1 row in set (0.00 sec)

6、CONCAT() 函数

CONCAT() 函数用于字符串的连接。语法如下:

CONCAT(str1,str2,...);

--说明:1)函数的参数为若干个字符串。
(2)把参数中包含的字符串连接成一个字符串,然后返回。

例如:

mysql> SELECT
    -> s_id,s_name,concat(addr,', ',phone) AS contact
    -> FROM
    -> student
    -> WHERE
    -> s_id LIKE 's18%';
+-------+-----------+------------------------+
| s_id  | s_name    | contact                |
+-------+-----------+------------------------+
| s1801 | 刘蓓      | Kaifeng, 15903735566   |
| s1802 | 赵芸      | Zheng, 15903735533     |
| s1803 | 张毅得    | Xinxiang, 15903735544  |
| s1804 | 曹梦德    | Zheng, 15903735577     |
| s1805 | 孙泉      | Xinyang, 15903735587   |
| s1806 | 司马意    | Xinxiang, 15903735581  |
| s1807 | 司马招    | Anyang, 15903734444    |
| s1808 | 赵紫龙    | Zhumadian, 15903736666 |
| s1809 | 吕步      | Nanyang, 15903737777   |
| s1810 | 刘珊      | Zhumadian, 15903732222 |
| s1811 | 诸葛亮    | Zhumadian, 15903731111 |
+-------+-----------+------------------------+
11 rows in set (0.00 sec)

7、CONCAT_WS() 函数

CONCAT_WS() 函数用于多个字符串的连接,可以指定连接字符串时的分隔符。语法如下:

CONCAT_WS(separator,st1,st2,...);

--说明:1)第一个参数为连接字符串时各字符串之间的分隔符
(2)把参数中包含的字符串连接成一个字符串,并且用一个分隔符隔开。

例如:

mysql> SELECT
    -> s_id,s_name,CONCAT_WS(',',addr,phone) AS contact
    -> FROM
    -> student
    -> WHERE
    -> s_id LIKE 's18%';
+-------+-----------+-----------------------+
| s_id  | s_name    | contact               |
+-------+-----------+-----------------------+
| s1801 | 刘蓓      | Kaifeng,15903735566   |
| s1802 | 赵芸      | Zheng,15903735533     |
| s1803 | 张毅得    | Xinxiang,15903735544  |
| s1804 | 曹梦德    | Zheng,15903735577     |
| s1805 | 孙泉      | Xinyang,15903735587   |
| s1806 | 司马意    | Xinxiang,15903735581  |
| s1807 | 司马招    | Anyang,15903734444    |
| s1808 | 赵紫龙    | Zhumadian,15903736666 |
| s1809 | 吕步      | Nanyang,15903737777   |
| s1810 | 刘珊      | Zhumadian,15903732222 |
| s1811 | 诸葛亮    | Zhumadian,15903731111 |
+-------+-----------+-----------------------+
11 rows in set (0.00 sec)

8、GROUP_CONCAT() 函数

GROUP_CONCAT() 函数用于把一个字段中的所有数据进行连接,可以在分组查询时使用。语法如下:

GROUP_CONCAT([distinct] fieldname [order by 排序字段 asc|desc] separator '分隔符');

--说明:1)该函数对表中的一个字段进行处理,把该字段的所有数据连接起来。
(2)该函数一般用于分组查询,其用法类似于聚合函数。
(3)把字段的所有数据使用 separator 指定的分隔符连接起来,如果省略 separator,则默认的分隔符为逗号。
(4distinct:取出重复的数据。
(5order by:按表中的某个字段排序之后再进行连接。

例如:

(1)对 student 表按 addr 进行分组,使用 GROUP_CONCAT 连接 s_name

mysql> SELECT
    -> addr,GROUP_CONCAT(s_name)
    -> FROM
    -> student
    -> GROUP BY
    -> addr;
+-----------+-------------------------------------------------------------+
| addr      | GROUP_CONCAT(s_name)                                        |
+-----------+-------------------------------------------------------------+
| Anyang    | 孙悟空,赵够,司马招,沙和尚                                   |
| Kaifeng   | 刘蓓,朱元张,乾龙,康西,王召军                                |
| Nanyang   | 唐三藏,吕步,司马相如,白龙马,如来                            |
| Xinxiang  | 猪八戒,王保墙,贾大空,诸葛英,司马意,张毅得                   |
| Xinyang   | 赵匡银,孙泉                                                 |
| Zheng     | 赵芸,曹梦德                                                 |
| Zhumadian | 李晓露,李氏敏,诸葛亮,刘珊,赵紫龙,观音                       |
+-----------+-------------------------------------------------------------+
7 rows in set (0.00 sec)

(2)按出生日期排序再连接 s_name

mysql> SELECT
    -> addr,GROUP_CONCAT(s_name ORDER BY birth)
    -> FROM
    -> student
    -> GROUP BY
    -> addr;
+-----------+-------------------------------------------------------------+
| addr      | GROUP_CONCAT(s_name ORDER BY birth)                         |
+-----------+-------------------------------------------------------------+
| Anyang    | 司马招,赵够,沙和尚,孙悟空                                   |
| Kaifeng   | 刘蓓,朱元张,乾龙,康西,王召军                                |
| Nanyang   | 吕步,唐三藏,白龙马,司马相如,如来                            |
| Xinxiang  | 张毅得,司马意,诸葛英,王保墙,猪八戒,贾大空                   |
| Xinyang   | 孙泉,赵匡银                                                 |
| Zheng     | 曹梦德,赵芸                                                 |
| Zhumadian | 赵紫龙,李氏敏,诸葛亮,李晓露,观音,刘珊                       |
+-----------+-------------------------------------------------------------+
7 rows in set (0.00 sec)

9、FORMAT() 函数

FORMAT() 函数用于把某个数值进行四舍五入后返回,返回结果的类型为字符串。语法如下:

FORMAT(x,d);

--说明:1)对数值 x 进行四舍五入运算,保留 d 为小数,返回值为一个字符串。
(2)该函数的功能和 ROUND() 函数类似,返回值的类型不同。

例如:

mysql> SELECT 
    -> FORMAT(125.487,1);
+-------------------+
| FORMAT(125.487,1) |
+-------------------+
| 125.5             |
+-------------------+
1 row in set (0.00 sec)

10、INSERT() 和 REPLACE() 函数

INSERT() 和 REPLACE() 函数用于把一个字符串中的某些字符替换为另外的字符。语法如下:

INSERT(str,pos,len,instr);
REPLACE(str1,str2,str3);

--说明:1INSERT() 函数:把字符串 str 从 pos 位置开始的 len 个字符替换为 instr 字符串,并返回替换之后的字符串。
(2)如果 pos 超过字符串长度,则不进行任何替换,直接返回原字符串。
(3REPLACE() 函数:把 str1 中的 str2 子串替换为 str3 子串。
(4)如果要替换的字符串的位置确定,内容不知道,使用 INSERT() 函数。
(5)如果要替换的字符串的内容确定,位置不确定,使用 REPLACE() 函数。

例如:

mysql> SELECT
    -> s_id,s_name,INSERT(phone,4,4,'****')
    -> FROM
    -> student
    -> WHERE
    -> s_id LIKE 's18%';
+-------+-----------+--------------------------+
| s_id  | s_name    | INSERT(phone,4,4,'****') |
+-------+-----------+--------------------------+
| s1801 | 刘蓓      | 159****5566              |
| s1802 | 赵芸      | 159****5533              |
| s1803 | 张毅得    | 159****5544              |
| s1804 | 曹梦德    | 159****5577              |
| s1805 | 孙泉      | 159****5587              |
| s1806 | 司马意    | 159****5581              |
| s1807 | 司马招    | 159****4444              |
| s1808 | 赵紫龙    | 159****6666              |
| s1809 | 吕步      | 159****7777              |
| s1810 | 刘珊      | 159****2222              |
| s1811 | 诸葛亮    | 159****1111              |
+-------+-----------+--------------------------+
11 rows in set (0.00 sec)

mysql> SELECT
    -> s_id,s_name,REPLACE(phone,'159','136')
    -> FROM
    -> student
    -> WHERE
    -> s_id LIKE 's18%';
+-------+-----------+----------------------------+
| s_id  | s_name    | REPLACE(phone,'159','136') |
+-------+-----------+----------------------------+
| s1801 | 刘蓓      | 13603735566                |
| s1802 | 赵芸      | 13603735533                |
| s1803 | 张毅得    | 13603735544                |
| s1804 | 曹梦德    | 13603735577                |
| s1805 | 孙泉      | 13603735587                |
| s1806 | 司马意    | 13603735581                |
| s1807 | 司马招    | 13603734444                |
| s1808 | 赵紫龙    | 13603736666                |
| s1809 | 吕步      | 13603737777                |
| s1810 | 刘珊      | 13603732222                |
| s1811 | 诸葛亮    | 13603731111                |
+-------+-----------+----------------------------+
11 rows in set (0.00 sec)

11、大小写转换函数

MySQL提供了四个大小写转换函数,语法如下:

LCASE(str);
UCASE(str);
LOWER(str);
UPPER(str);

--说明:1)UCASE 和 UPPER 可以把字符串中的字母转换为大写字母。
(2)LCASE 和 LOWER 可以把字符串中的字母转换为小写字母。
(3)非字母不转换。

例如:

mysql> set @str = 'Paypal is a great site and is used by many to send and receive money.';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT
    -> LCASE(@str);
+-----------------------------------------------------------------------+
| LCASE(@str)                                                           |
+-----------------------------------------------------------------------+
| paypal is a great site and is used by many to send and receive money. |
+-----------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT
    -> UCASE(@str);
+-----------------------------------------------------------------------+
| UCASE(@str)                                                           |
+-----------------------------------------------------------------------+
| PAYPAL IS A GREAT SITE AND IS USED BY MANY TO SEND AND RECEIVE MONEY. |
+-----------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT
    -> LOWER(@str);
+-----------------------------------------------------------------------+
| LOWER(@str)                                                           |
+-----------------------------------------------------------------------+
| paypal is a great site and is used by many to send and receive money. |
+-----------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT
    -> UPPER(@str);
+-----------------------------------------------------------------------+
| UPPER(@str)                                                           |
+-----------------------------------------------------------------------+
| PAYPAL IS A GREAT SITE AND IS USED BY MANY TO SEND AND RECEIVE MONEY. |
+-----------------------------------------------------------------------+
1 row in set (0.00 sec)

12、截取子字符串函数

该类函数可以从一个字符串中截取一个字符串,一共有三个,语法如下:

LEFT(str,n);
RIGHT(str,n);
SUBSTR(str,m,n);
SUBSTRING(str,m,n);

--说明:1LEFT() 函数是从字符串最前端开始截取 n 个字符并返回。
(2RIGHT() 函数是从字符串最右端截取 n 个字符并返回。
(3)SUBSTR() 和 SUBSTRING() 两个函数的功能相同。从第 m 个字符开始,截取 n 个字符并返回。

例如:

mysql> SELECT
    -> company_id,
    -> registration_address,
    -> LEFT(registration_address,6)
    -> FROM 
    -> company_information
    -> WHERE
    -> company_id < '000010';
+------------+-------------------------------------------------------------+----------------+| 
company_id | registration_address                              | LEFT(registration_address,6) 
|+------------+------------------------------------------------------------+----------------+| 
000001     | 广东省深圳市罗湖区深南东路5047| 广东省深圳市       |
000002     | 广东省深圳市盐田区大梅沙环梅路33号万科中心                      | 广东省深圳市       |
000004     | 广东省深圳市南山区中心路(深圳湾段)3333号中铁南方总部大厦503| 广东省深圳市       |
000005     | 广东省深圳市人民南路发展中心大厦13| 广东省深圳市       |
000006     | 广东省深圳市罗湖区宝安南路2014号振业大厦B座11-17| 广东省深圳市       | 
000007     | 广东省深圳市华强北路1058号现代之窗大厦A座25| 广东省深圳市        | 
000008     | 北京市海淀区高梁桥斜街59号院1号楼161606                      | 北京市海淀区        | 
000009     | 广东省深圳市笋岗东路1002号宝安广场A座28-29| 广东省深圳市        |
+------------+-----------------------------------------------------------+--------------------+
8 rows in set (0.00 sec)

mysql> SELECT
    -> company_id,
    -> web_address,
    -> RIGHT(web_address,CHAR_LENGTH(web_address)-4) AS web_address
    -> FROM 
    -> company_information
    -> WHERE
    -> company_id < '000010';
+------------+-------------------------+---------------------+
| company_id | web_address             | web_address         |
+------------+-------------------------+---------------------+
| 000001     | www.bank.pingan.com     | bank.pingan.com     |
| 000002     | www.vanke.com           | vanke.com           |
| 000004     | www.sz000004.cn         | sz000004.cn         |
| 000005     | www.fountain.com.cn     | fountain.com.cn     |
| 000006     | www.zhenye.com          | zhenye.com          |
| 000007     | None                    |                     |
| 000008     | www.shenzhou-gaotie.com | shenzhou-gaotie.com |
| 000009     | www.chinabaoan.com      | chinabaoan.com      |
+------------+-------------------------+---------------------+
8 rows in set (0.01 sec)

mysql> SELECT
    -> company_id,
    -> registration_address,
    -> SUBSTRING(registration_address,7) AS registration_address
    -> FROM 
    -> company_information
    -> WHERE
    -> company_id < '000010';
+------------+------------------------------------------------+-------------------------
+| company_id | registration_address                           | registration_address  
|+------------+------------------------------------------------+------------------------
| 000001  | 广东省深圳市罗湖区深南东路5047| 罗湖区深南东路5047|
| 000002  | 广东省深圳市盐田区大梅沙环梅路33号万科中心         | 盐田区大梅沙环梅路33号万科中心  |
| 000004  | 广东省深圳市南山区中心路(深圳湾段)3333号中铁南方总部大厦503| 南山区中心路(深圳湾段)3333号中铁南方总部大厦503|
| 000005  | 广东省深圳市人民南路发展中心大厦13| 人民南路发展中心大厦13|
| 000006  | 广东省深圳市罗湖区宝安南路2014号振业大厦B座11-17| 罗湖区宝安南路2014号振业大厦B座11-17|
| 000007  | 广东省深圳市华强北路1058号现代之窗大厦A座25| 华强北路1058号现代之窗大厦A座25|
| 000008  | 北京市海淀区高梁桥斜街59号院1号楼161606         | 高梁桥斜街59号院1号楼161606    |
| 000009  | 广东省深圳市笋岗东路1002号宝安广场A座28-29| 笋岗东路1002号宝安广场A座28-29|
+------------+----------------------------------------------+-----------------------------
8 rows in set (0.00 sec)

mysql> SELECT
    -> company_id,
    -> registration_address,
    -> SUBSTRING(registration_address,4,3) AS registration_address
    -> FROM 
    -> company_information
    -> WHERE
    -> company_id < '000010';
+------------+--------------------------------------------------------+----------------------+| company_id | registration_address                                 | registration_address |
+------------+-------------------------------------------------------------------+------------+
| 000001     | 广东省深圳市罗湖区深南东路5047| 深圳市     |
| 000002     | 广东省深圳市盐田区大梅沙环梅路33号万科中心                            | 深圳市     |
| 000004     | 广东省深圳市南山区中心路(深圳湾段)3333号中铁南方总部大厦503| 深圳市     |
| 000005     | 广东省深圳市人民南路发展中心大厦13| 深圳市     |
| 000006     | 广东省深圳市罗湖区宝安南路2014号振业大厦B座11-17| 深圳市     |
| 000007     | 广东省深圳市华强北路1058号现代之窗大厦A座25| 深圳市     |
| 000008     | 北京市海淀区高梁桥斜街59号院1号楼161606                            | 海淀区     |
| 000009     | 广东省深圳市笋岗东路1002号宝安广场A座28-29| 深圳市     |
+------------+---------------------------------------------------+--------------------------+| 
8 rows in set (0.03 sec)

13、查找字符串函数

查找字符串函数用于查找某个字符串在另一个字符串中出现的位置,一共有两个。语法如下:

LOCATE(str1,str2);
POSITION(str1 in str2);

--说明:1)如果 str1 是 str2 的子字符串,则返回子字符串第一次出现的位置,否则返回0。
(2)LOCATE 函数和 POSTION 函数用法相同,不同点是 LOCATE 函数的两个参数用逗号隔开,POSITION 函数的两个参数用 in 隔开。

举例:

mysql> SELECT
    -> company_id,
    -> company_abbreviation,
    -> registration_address
    -> FROM 
    -> company_information
    -> WHERE
    -> LOCATE('深圳市罗湖区',registration_address) > 0;
+------------+----------------------+-----------------------------------------------------+
| company_id | company_abbreviation | registration_address                                |
+------------+----------------------+----------------------------------------------------+
| 000001     | 平安银行             | 广东省深圳市罗湖区深南东路5047|
| 000006     | 深振业A             | 广东省深圳市罗湖区宝安南路2014号振业大厦B座11-17|
| 000040     | 东旭蓝天             | 广东省深圳市罗湖区东门中路1011号鸿基大厦25-27|
| 000048     | 康达尔               | 广东省深圳市罗湖区深南东路1086号集浩大厦二、三楼       |
| 000061     | 农产品               | 广东省深圳市罗湖区布吉路1021号天乐大厦22|
| 000099     | 中信海直             | 广东省深圳市罗湖区解放西路188|
| 002285     | 世联行               | 广东省深圳市罗湖区深南东路2028号罗湖商务中心12|
| 002325     | 洪涛股份             | 广东省深圳市罗湖区泥岗西洪涛路17|
| 002482     | 广田集团             | 广东省深圳市罗湖区深南东路2098|
| 002620     | 瑞和股份             | 广东省深圳市罗湖区深南东路3027号瑞和大厦               |
| 002736     | 国信证券             | 广东省深圳市罗湖区红岭中路1012号国信证券大厦十六层至二十六层    |
| 002740     | 爱迪尔               | 广东省深圳市罗湖区东晓路1005号北楼二、三楼             |
| 002822     | 中装建设             | 广东省深圳市罗湖区深南东路4002号鸿隆世纪广场四-五层(仅限办公)  |
| 002830     | 名雕股份             | 广东省深圳市罗湖区宝安北笋岗仓831830号陆层615616|
| 300532     | 今天国际             | 广东省深圳市罗湖区笋岗东路1002宝安广场A座10楼F、G、H      |
| 600892     | 大晟文化             | 广东省深圳市罗湖区笋岗东路3012号中民时代广场B座2103|
+------------+---------------------+---------------------------------------------------------+
16 rows in set (0.02 sec)

mysql> SELECT
    -> company_id,
    -> company_abbreviation,
    -> registration_address,
    -> LOCATE('路',registration_address) AS locate
    -> FROM 
    -> company_information
    -> WHERE
    -> LOCATE('深圳市罗湖区',registration_address) > 0;
+------------+----------------------+------------------------------------------------+--------+
| company_id | company_abbreviation | registration_address                           | locate |
+------------+----------------------+----------------------------------------------+--------+
| 000001     | 平安银行  | 广东省深圳市罗湖区深南东路5047|     13 |
| 000006     | 深振业A  | 广东省深圳市罗湖区宝安南路2014号振业大厦B座11-17|     13 |
| 000040     | 东旭蓝天  | 广东省深圳市罗湖区东门中路1011号鸿基大厦25-27|     13 |
| 000048     | 康达尔    | 广东省深圳市罗湖区深南东路1086号集浩大厦二、三楼             |     13 |
| 000061     | 农产品    | 广东省深圳市罗湖区布吉路1021号天乐大厦22|     12 |
| 000099     | 中信海直  | 广东省深圳市罗湖区解放西路188|     13 |
| 002285     | 世联行    | 广东省深圳市罗湖区深南东路2028号罗湖商务中心12|     13 |
| 002325     | 洪涛股份  | 广东省深圳市罗湖区泥岗西洪涛路17|     15 |
| 002482     | 广田集团  | 广东省深圳市罗湖区深南东路2098|     13 |
| 002620     | 瑞和股份  | 广东省深圳市罗湖区深南东路3027号瑞和大厦                     |     13 |
| 002736     | 国信证券  | 广东省深圳市罗湖区红岭中路1012号国信证券大厦十六层至二十六层   |     13 |
| 002740     | 爱迪尔    | 广东省深圳市罗湖区东晓路1005号北楼二、三楼                   |     12 |
| 002822     | 中装建设  | 广东省深圳市罗湖区深南东路4002号鸿隆世纪广场四-五层(仅限办公)|     13 |
| 002830     | 名雕股份  | 广东省深圳市罗湖区宝安北笋岗仓831830号陆层615616|      0 |
| 300532     | 今天国际  | 广东省深圳市罗湖区笋岗东路1002宝安广场A座10楼F、G、H          |     13 |
| 600892     | 大晟文化  | 广东省深圳市罗湖区笋岗东路3012号中民时代广场B座2103|     13 |
+------------+----------------------+--------------------------------------------------+--------+
16 rows in set (0.01 sec)

mysql> SELECT
    -> company_id,
    -> company_abbreviation,
    -> web_address,
    -> POSITION('e' in web_address) AS POSITION
    -> FROM 
    -> company_information
    -> WHERE
    -> LOCATE('深圳市罗湖区',registration_address) > 0;
+------------+----------------------+-----------------------+----------+
| company_id | company_abbreviation | web_address           | POSITION |
+------------+----------------------+-----------------------+----------+
| 000001     | 平安银行             | www.bank.pingan.com   |        0 |
| 000006     | 深振业A             | www.zhenye.com        |        7 |
| 000040     | 东旭蓝天             | www.bahjdc.com        |        0 |
| 000048     | 康达尔               | www.kondarl.com       |        0 |
| 000061     | 农产品               | www.szap.com          |        0 |
| 000099     | 中信海直             | www.cohc.citic        |        0 |
| 002285     | 世联行               | www.worldunion.com.cn |        0 |
| 002325     | 洪涛股份             | www.szhongtao.cn      |        0 |
| 002482     | 广田集团             | www.szgt.com          |        0 |
| 002620     | 瑞和股份             | www.sz-ruihe.com      |       12 |
| 002736     | 国信证券             | www.guosen.com.cn     |        9 |
| 002740     | 爱迪尔               | www.idr.com.cn        |        0 |
| 002822     | 中装建设             | www.zhongzhuang.com   |        0 |
| 002830     | 名雕股份             | www.mingdiao.com.cn   |        0 |
| 300532     | 今天国际             | www.nti56.com         |        0 |
| 600892     | 大晟文化             | www.baochengshare.com |       10 |
+------------+----------------------+-----------------------+----------+
16 rows in set (0.00 sec)

14、REPEAT() 函数

REPEAT() 函数生成一个由某字符串重复 n 次组成的字符串。语法格式如下:

REPEAT(str,n);

--说明:生成一个由 n 个 str 连接而成的字符串。

举例:

mysql> SELECT 
    -> company_id,
    -> company_abbreviation,
    -> CONCAT(company_abbreviation,REPEAT('=',3),web_address) AS repeat_string
    -> FROM 
    -> company_information
    -> WHERE
    -> company_id < '000010';
+------------+----------------------+----------------------------------------+
| company_id | company_abbreviation | repeat_string                          |
+------------+----------------------+----------------------------------------+
| 000001     | 平安银行             | 平安银行===www.bank.pingan.com         |
| 000002     | 万科A               | 万科A===www.vanke.com                 |
| 000004     | 国农科技             | 国农科技===www.sz000004.cn             |
| 000005     | 世纪星源             | 世纪星源===www.fountain.com.cn         |
| 000006     | 深振业A             | 深振业A===www.zhenye.com              |
| 000007     | 全新好               | 全新好===None                          |
| 000008     | 神州高铁             | 神州高铁===www.shenzhou-gaotie.com     |
| 000009     | 中国宝安             | 中国宝安===www.chinabaoan.com          |
+------------+----------------------+----------------------------------------+
8 rows in set (0.00 sec)

15、LPAD() 与 RPAD() 函数

LPAD() 与 RPAD() 函数分别在一个字符串的前端或后端填充若干个字符,使字符串达到指定的长度。语法格式如下:

LPAD(str,len,padstr);
RPAD(str,len,padstr);

--说明:1)把字符串 str 用 padstr 字符串填充到长度为 len,并返回长度为 len 的字符串。
(2)LPAD 函数 str 字符串右对齐,padstr 从左边填充。
(3)RPAD 函数 str 字符串左对齐,padstr 从右端填充。

举例:

mysql> SELECT
    -> company_id,
    -> web_address,
    -> CONCAT(RPAD(company_abbreviation,6,'='),web_address) AS rpad
    -> FROM 
    -> company_information
    -> WHERE
    -> company_id < '000010';
+------------+-------------------------+---------------------------------------+
| company_id | web_address             | rpad                                  |
+------------+-------------------------+---------------------------------------+
| 000001     | www.bank.pingan.com     | 平安银行==www.bank.pingan.com         |
| 000002     | www.vanke.com           | 万科A===www.vanke.com                |
| 000004     | www.sz000004.cn         | 国农科技==www.sz000004.cn             |
| 000005     | www.fountain.com.cn     | 世纪星源==www.fountain.com.cn         |
| 000006     | www.zhenye.com          | 深振业A==www.zhenye.com              |
| 000007     | None                    | 全新好===None                         |
| 000008     | www.shenzhou-gaotie.com | 神州高铁==www.shenzhou-gaotie.com     |
| 000009     | www.chinabaoan.com      | 中国宝安==www.chinabaoan.com          |
+------------+-------------------------+---------------------------------------+
8 rows in set (0.00 sec)

mysql> SELECT
    -> company_id,
    -> web_address,
    -> CONCAT(RPAD(web_address,30,'*'),company_abbreviation) AS rpad
    -> FROM 
    -> company_information
    -> WHERE
    -> company_id < '000010';
+------------+-------------------------+--------------------------------------------+
| company_id | web_address             | rpad                                       |
+------------+-------------------------+--------------------------------------------+
| 000001     | www.bank.pingan.com     | www.bank.pingan.com***********平安银行     |
| 000002     | www.vanke.com           | www.vanke.com*****************万科A       |
| 000004     | www.sz000004.cn         | www.sz000004.cn***************国农科技     |
| 000005     | www.fountain.com.cn     | www.fountain.com.cn***********世纪星源     |
| 000006     | www.zhenye.com          | www.zhenye.com****************深振业A     |
| 000007     | None                    | None**************************全新好       |
| 000008     | www.shenzhou-gaotie.com | www.shenzhou-gaotie.com*******神州高铁     |
| 000009     | www.chinabaoan.com      | www.chinabaoan.com************中国宝安     |
+------------+-------------------------+--------------------------------------------+
8 rows in set (0.00 sec)

16、SPACE() 函数

SPACE() 函数生成由若干个空格构成的字符串。语法格式如下:

SPACE(n);

--说明:
返回由 n 个空格构成的字符串。

17、SUBSTRING_INDEX() 函数

SUBSTRING_INDEX() 函数的语法格式如下:

SUBSTRING_INDEX(str,delimiter,n);

--说明:1)如果 n 大于 0,返回从左边数第 n 个 delimiter 所表示字符的左边的所有内容。
(2)如果 n 小于 0,返回从右边数第 n 个 delimiter 所表示字符的右边的所有内容。

举例:

mysql> SELECT
    -> company_id,
    -> company_abbreviation,
    -> web_address,
    -> SUBSTRING_INDEX(web_address,'.',-1) AS SUBSTRING_INDEX
    -> FROM 
    -> company_information
    -> WHERE
    -> company_id < '000010';
+------------+----------------------+-------------------------+-----------------+
| company_id | company_abbreviation | web_address             | SUBSTRING_INDEX |
+------------+----------------------+-------------------------+-----------------+
| 000001     | 平安银行             | www.bank.pingan.com     | com             |
| 000002     | 万科A               | www.vanke.com           | com             |
| 000004     | 国农科技             | www.sz000004.cn         | cn              |
| 000005     | 世纪星源             | www.fountain.com.cn     | cn              |
| 000006     | 深振业A             | www.zhenye.com          | com             |
| 000007     | 全新好               | None                    | None            |
| 000008     | 神州高铁             | www.shenzhou-gaotie.com | com             |
| 000009     | 中国宝安             | www.chinabaoan.com      | com             |
+------------+----------------------+-------------------------+-----------------+
8 rows in set (0.03 sec)

mysql> SELECT
    -> company_id,
    -> company_abbreviation,
    -> web_address,
    -> SUBSTRING_INDEX(web_address,'.',1) AS SUBSTRING_INDEX
    -> FROM 
    -> company_information
    -> WHERE
    -> company_id < '000010';
+------------+----------------------+-------------------------+-----------------+
| company_id | company_abbreviation | web_address             | SUBSTRING_INDEX |
+------------+----------------------+-------------------------+-----------------+
| 000001     | 平安银行             | www.bank.pingan.com     | www             |
| 000002     | 万科A               | www.vanke.com           | www             |
| 000004     | 国农科技             | www.sz000004.cn         | www             |
| 000005     | 世纪星源             | www.fountain.com.cn     | www             |
| 000006     | 深振业A             | www.zhenye.com          | www             |
| 000007     | 全新好               | None                    | None            |
| 000008     | 神州高铁             | www.shenzhou-gaotie.com | www             |
| 000009     | 中国宝安             | www.chinabaoan.com      | www             |
+------------+----------------------+-------------------------+-----------------+
8 rows in set (0.01 sec)

18、REVERSE() 函数

REVERSE() 函数对一个字符串中的内容进行翻转。语法格式如下:

REVERSE(str);

--说明:
返回str的翻转字符串。

举例:

mysql> SELECT
    -> company_id,
    -> company_abbreviation,
    -> web_address,
    -> REVERSE(web_address) AS REVERSE
    -> FROM 
    -> company_information
    -> WHERE
    -> company_id < '000010';
+------------+----------------------+-------------------------+-------------------------+
| company_id | company_abbreviation | web_address             | REVERSE                 |
+------------+----------------------+-------------------------+-------------------------+
| 000001     | 平安银行             | www.bank.pingan.com     | moc.nagnip.knab.www     |
| 000002     | 万科A               | www.vanke.com           | moc.eknav.www           |
| 000004     | 国农科技             | www.sz000004.cn         | nc.400000zs.www         |
| 000005     | 世纪星源             | www.fountain.com.cn     | nc.moc.niatnuof.www     |
| 000006     | 深振业A             | www.zhenye.com          | moc.eynehz.www          |
| 000007     | 全新好               | None                    | enoN                    |
| 000008     | 神州高铁             | www.shenzhou-gaotie.com | moc.eitoag-uohznehs.www |
| 000009     | 中国宝安             | www.chinabaoan.com      | moc.naoabanihc.www      |
+------------+----------------------+-------------------------+-------------------------+
8 rows in set (0.00 sec)

CREATE INDEX idx_web_address 


ALTER TABLE company_information
ADD INDEX idx_web_address (REVERSE(web_address));

SELECT
company_id,
company_abbreviation,
web_address,
REVERSE(web_address) AS REVERSE
FROM 
company_information
WHERE
company_id < '000010';

为 company_information 表创建一个计算列,该列的内容为 web_address 字段内容的翻转,然后为虚拟列创建索引。

-- 创建计算列
mysql> ALTER TABLE company_information
    -> ADD reverse_web varchar(50) AS (REVERSE(web_address));
Query OK, 0 rows affected (0.34 sec)
Records: 0  Duplicates: 0  Warnings: 0
-- 根据计算列创建索引
mysql> CREATE INDEX idx_reverse_web 
    -> ON company_information(reverse_web);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE company_information\G
*************************** 1. row ***************************
       Table: company_information
Create Table: CREATE TABLE `company_information` (
  `company_id` char(6) NOT NULL,
  `company_abbreviation` char(20) DEFAULT NULL,
  `company_fullname` char(100) DEFAULT NULL,
  `English_name` char(200) DEFAULT NULL,
  `registration_address` char(200) DEFAULT NULL,
  `web_address` char(200) DEFAULT NULL,
  `reverse_web` varchar(50) GENERATED ALWAYS AS (reverse(`web_address`)) VIRTUAL,
  PRIMARY KEY (`company_id`),
  KEY `idx_reverse_web` (`reverse_web`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> explain 
    -> SELECT
    -> *
    -> FROM 
    -> company_information
    -> WHERE reverse_web = REVERSE('www.wanke.com')\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: company_information
   partitions: NULL
         type: ref
possible_keys: idx_reverse_web
          key: idx_reverse_web
      key_len: 153
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

19、STRCMP() 函数

STRCMP() 函数用于比较两个字符串的大小,语法如下:

STRCMP(str1,str2);

说明:
(1)根据比较规则,如果字符串 str1 大于 str2,返回 1。
(2)如果字符串 str1 小于 str2,返回 -1。
(3)如果字符串 str1 和 str2 完全相同,则返回 0

猜你喜欢

转载自blog.csdn.net/weixin_44377973/article/details/109425355