环境准备
- 创建数据库 advanced_prac。说明:若实际使用中使用同一个实例,建议数据库名额外加上个
人姓名简写,便于区分,例如 advanced_prac_nwh。



一般常用函数
- TRIM([{BOTH | LEADING | TRAILING} [remstr] FROM] str), TRIM([remstr FROM] str): 将字符串 str 中前后包含的 remstr 部分删除。
SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz');
| TRIM(TRAILING ‘xyz’ FROM ‘barxxyz’) | |
|---|---|
| 1 | barx |

- LTRIM(str)/RTRIM(str): 删除字符串 str 开头的空格/删除字符串 str 结尾的空格。
SELECT LTRIM(' barbar');
| LTRIM(’ barbar’) | |
|---|---|
| 1 | barbar |

- RPAD(str,len,padstr): 在字符串 str 右侧用 padstr 填充,使其长度为 len。若字符串 str 长度超过 len,则将其截断。
SELECT RPAD('hi',15,'GaussDB');
| RPAD(‘hi’, 15, ‘GaussDB’) | |
|---|---|
| 1 | hiGaussDBGaussD |

SELECT RPAD('GaussDB',5,'?');
| RPAD(‘GaussDB’, 5, ‘?’) | |
|---|---|
| 1 | Gauss |

正则表达式操作符和函数
- expr REGEXP pat, expr RLIKE pat: 若 expr 处表达式与正则表达式匹配,则返回 1,否则返回 0。
SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
| ‘a’ REGEXP ‘A’ | ‘a’ REGEXP BINARY 'A" | |
|---|---|---|
| 1 | 1 | 0 |
- REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]]): 返回与正则表达式模式匹配的子字符串的起始索引。
SELECT REGEXP_INSTR('dog cat dog', 'dog', 2);
| REGEXP_INSTR(‘dog cat dog’, ‘dog’, 2) | |
|---|---|
| 1 | 9 |

SELECT REGEXP_INSTR('aa aaa aaaa', 'a{4}');
| REGEXP_INSTR(‘aa aaa aaaa’, ‘a{4}’) | |
|---|---|
| 1 | 8 |

- REGEXP_LIKE(expr, pat[, match_type]): 用于模式匹配。比较给定的字符串,如果字符串
相同则返回 1,否则返回 0。
SELECT REGEXP_LIKE('Michael!', '.*');
| REGEXP_LIKE(‘Michael!’, ‘.*’) | |
|---|---|
| 1 | 1 |

SELECT REGEXP_LIKE('abc', 'ABC', 'c');
| REGEXP_LIKE(‘abc’, ‘ABC’, ‘c’) | |
|---|---|
| 1 | 0 |

- REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]]): 通过匹配字符来替换给定的字符串。
SELECT REGEXP_REPLACE('abc def ghi', '[a-z]+', 'X', 1, 3);
| REGEXP_REPLACE(‘abc def ghi’, ‘[a-z]+’, ‘X’, 1, 3) | |
|---|---|
| 1 | abc def X |

- REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]]): 从给定的字符串中返回子字符串。
SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+', 1, 3);
| REGEXP_SUBSTR(‘abc def ghi’, ‘[a-z]+’, 1, 3) | |
|---|---|
| 1 | ghi |
控制流函数
CASE
- CASE 语句是实现选择结构程序设计的一种语句。
- 创建表(以表 bonuses_depa1 和 new_bonuses_depa1 为例)
CREATE TABLE bonuses_depa1
(
staff_id INT NOT NULL,
staff_name CHAR(50),
job VARCHAR(30),
bonus NUMERIC
);
CREATE TABLE new_bonuses_depa1
(
staff_id INT NOT NULL,
staff_name CHAR(50),
job VARCHAR(30),
bonus NUMERIC
);

- 注意事项:
- 表名必须指定,并且表名不能和用户下的其他表重名。
- 列名必须指定,同时指定列的数据类型、是否可以为 NULL、size 等条件。
- 如果表名重复,修改表名或者删除重名的表。
- 向表 bonuses_depa1、new_bonuses_depa1 插入数据。
INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(23,'wangxia','developer',5000);
INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(24,'limingying','tester',7000);
INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(25,'liulili','quality control', 8000);
INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(29,'liuxue','tester',8000);
INSERT INTO bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(21,'caoming','document developer',11000);
INSERT INTO new_bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(23,'wangxia','developer', 7000);
INSERT INTO new_bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(27,'wangxuefen','document developer',7000);
INSERT INTO new_bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(28,'denghui','quality control',8000);
INSERT INTO new_bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(25,'liulili','quality control',10000);
INSERT INTO new_bonuses_depa1(staff_id, staff_name, job, bonus) VALUES(21,'caoming','document developer',12000);

- 注意事项:
- 本步骤中的 insert 语句是值插入,即构造一行记录并插入到表中。
- INSERT 语句所指定的字段名必须是表中已存在的字段名。
- 如果 INSERT 语句所指定的字段名包含表中的所有字段,则可能省略字段名。
- 查询表 bonuses_depa1 中的数据。
SELECT * FROM bonuses_depa1;
| staff_id | staff_name | job | bonus | |
|---|---|---|---|---|
| 1 | 23 | wangxia | developer | 5000 |
| 2 | 24 | limingying | tester | 7000 |
| 3 | 25 | liulili | quality control | 8000 |
| 4 | 29 | liuxue | tester | 8000 |
| 5 | 21 | caoming | document developer | 11000 |

- 查询表 new_bonuses_depa1 中的数据。
SELECT * FROM new_bonuses_depa1;
| staff_id | staff_name | job | bonus | |
|---|---|---|---|---|
| 1 | 23 | wangxia | developer | 7000 |
| 2 | 27 | wangxuefen | document developer | 7000 |
| 3 | 28 | denghui | quality control | 8000 |
| 4 | 25 | liulili | quality control | 10000 |
| 5 | 21 | caoming | document developer | 12000 |

- 比较两表 new_bonuses_depa1 和 bonuses_depa1 的津贴数据,对比员工津贴变化情况。
SELECT bd.STAFF_NAME,
CASE
WHEN nbd.BONUS > bd.BONUS THEN 'increased'
WHEN nbd.BONUS = bd.BONUS THEN 'equal'
ELSE 'decreased' END AS DIFF
FROM new_bonuses_depa1 nbd, bonuses_depa1 bd
WHERE nbd.STAFF_ID = bd.STAFF_ID;
||STAFF_NAME|DIFF|
|1|wangxia|increased|
|2|liulili|increased|
|3|caoming|increased|

- 删除表。
DROP TABLE bonuses_depa1;
DROP TABLE new_bonuses_depa1;

IFNULL
- 本步骤主要实现:返回员工编号和工资列表,工资如果为 NULL 则替换为“unknown”。
- 删除同名表 staffs_tab。
DROP TABLE IF EXISTS staffs_tab;

- 创建表 staffs_tab。
CREATE TABLE staffs_tab
(
staff_ID NUMERIC(6) not null,
NAME VARCHAR(20),
EMAIL VARCHAR(25),
PHONE_NUMBER VARCHAR(20),
HIRE_DATE DATE,
employment_ID VARCHAR(10),
SALARY NUMERIC(8,2),
MANAGER_ID NUMERIC(6),
section_ID NUMERIC(4)
);

- 向表 staffs_tab 中插入记录 1。
INSERT INTO staffs_tab (staff_ID, NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, employment_ID, SALARY,MANAGER_ID, section_ID)
values (198, '王莹', 'wangying@126.com', '18095605632', date_format('19990621', '%Y%m%d'), 'SH_CLERK',NULL, 124, 50);

- 向表 staffs_tab 中插入记录 2。
INSERT INTO staffs_tab (staff_ID, NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, employment_ID, SALARY,MANAGER_ID, section_ID)
values (199, '何开平', 'hekaipng02@126.com', '18095605532', date_format('20000113', '%Y%m%d'),'SH_CLERK', 2600.00, 124, 50);

- 向表 staffs_tab 中插入记录 3。
INSERT INTO staffs_tab (staff_ID, NAME, EMAIL, PHONE_NUMBER, HIRE_DATE, employment_ID, SALARY,MANAGER_ID, section_ID)
values (200, '李瑞', 'lirui03@126.com', '18095565632', date_format('19870917', '%Y%m%d'), 'AD_ASST',4400.00, 101, 10);

- 返回员工编号和工资列表,工资如果为 NULL 则替换为“unknown”。
SELECT staff_ID, IFNULL(SALARY, 'unknown') SALARY FROM staffs_tab WHERE staff_ID IS NOT NULL ORDER BY staff_ID;
| staff_ID | SALARY | |
|---|---|---|
| 1 | 198 | unknown |
| 2 | 199 | 2600.00 |
| 3 | 200 | 4400.00 |

- 删除表。
DROP TABLE staffs_tab;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




