目录
一. MySQL子查询
1. 子查询可以出现在SELECT、FROM、WHERE、HAVING和INSERT语句的子句中。
2. 子查询的返回结果:
3. 子查询与外部查询的关系:
注意事项:
二:正则表达式查询
1. 查询以特定字符串或字符开头的记录:
2. 查询以特定字符或字符串结尾的记录:
3. 以符号 "." 来代替任意一个字符:
4. 以符号 "*"、"+" 来匹配任意一个字符:
5. 匹配指定字符串:
6. 匹配指定字符串任意一个:
7. 匹配指定字符串以外的字符:
8. 使用 `{n,}`、`{n,m}` 来指定字符串连续出现的次数:
三:触发器
1. 触发器的语法:
2. 创建多个执行语句的触发器:
3. 查看触发器:
4. 使用 `INFORMATION_SCHEMA` 表查看触发器:
5. 触发器的使用:
5.1. 触发器的事件:
5.2. 触发器的类型:
6. 删除触发器:
7. 触发器的应用场景:
MySQL子查询是指在一个查询语句中嵌套另一个查询语句。子查询在外部查询中充当一个整体,可以用来获取更复杂的查询结果。
SELECT column1, (SELECT column2 FROM table2 WHERE condition) AS column_alias FROM table1;
SELECT * FROM (SELECT column1, column2 FROM table1) AS derived_table;
SELECT column1 FROM table1 WHERE column2 = (SELECT column3 FROM table2 WHERE condition);
SELECT column1, COUNT(column2) FROM table1 GROUP BY column1 HAVING COUNT(column2) > (SELECT AVG(column3) FROM table2);
INSERT INTO table1 (column1, column2) SELECT column3, column4 FROM table2;
示例:
下面是一个使用子查询的示例,假设有两个表`orders`和`customers`,分别包含订单和顾客信息。我们想获取订单总数最多的顾客信息。
SELECT customer_id, customer_name
FROM customers
WHERE customer_id = (
SELECT customer_id
FROM orders
GROUP BY customer_id
ORDER BY COUNT(*) DESC
LIMIT 1
);
在这个例子中,内部的子查询获取了订单总数最多的顾客ID,然后外部查询使用这个ID来获取相应的顾客信息。
元字符 | 说明 |
* | 0个或多个匹配 |
+ | 1个或多个匹配 |
? | 0个或1个匹配 |
{n} | 指定数目的匹配 |
{n,} | 不少于指定数目的匹配 |
{n,m} | 匹配数目的范围(m不超过255) |
^ | 匹配开头的字符 |
$ | 匹配结尾的字符 |
. | 代替任意一个字符 |
[] | 匹配"[]"中任意一个字符 |
[^] | 匹配[^]字符串以外的字符串 |
SELECT * FROM table_name WHERE column_name REGEXP '^abc';
SELECT * FROM table_name WHERE column_name REGEXP '\.com$';
SELECT * FROM table_name WHERE column_name REGEXP 'a\.b';
SELECT * FROM table_name WHERE column_name REGEXP 'ab*';
SELECT * FROM table_name WHERE column_name REGEXP 'ab+';
SELECT * FROM table_name WHERE column_name REGEXP 'abc';
SELECT * FROM table_name WHERE column_name REGEXP '[ab]';
SELECT * FROM table_name WHERE column_name REGEXP '[^abc]';
SELECT * FROM table_name WHERE column_name REGEXP 'a{3,}';
示例:查询包含连续的 2 到 4 个 "a" 的记录
SELECT * FROM table_name WHERE column_name REGEXP 'a{2,4}';
触发器(Trigger)是数据库中的一种特殊对象,它与表相关联,并在表中的数据发生变化时触发与之相关的特定操作。
注意:
在MySQL中,默认的语句分隔符是分号 (;),该分号用于标识SQL语句的结束。然而,在存储过程或触发器等数据库对象的定义中,可能会包含多条SQL语句,直接使用分号作为分隔符会导致解析错误。所以需要使用LIMITER重新设置分隔符,在结束定义时使用相同的分隔符。这样,MySQL解析器就可以正确地将多条SQL语句作为一个整体来处理,不会出现解析错误的情况发生
使用 `CREATE TRIGGER` 语句创建触发器,其基本语法如下:
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
FOR EACH ROW
[trigger_body]
要创建一个触发器执行多个语句,你可以在触发器的 `BEGIN` 和 `END` 块中编写多个语句。
示例:
CREATE TRIGGER trigger_name
BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
-- 第一个语句
INSERT INTO another_table (column1, column2) VALUES (NEW.column1, NEW.column2);
-- 第二个语句
UPDATE some_table SET column3 = NEW.column1 WHERE condition;
-- 第三个语句
DELETE FROM some_other_table WHERE column4 = OLD.column2;
-- 更多语句...
END;
在上述示例中,我们定义了一个在插入数据前触发的触发器。在触发器的 `BEGIN` 和 `END` 之间,我们可以编写多个语句来执行不同的操作。这些语句可以是插入数据、更新数据、删除数据,或者执行其他计算和逻辑。
使用 `SHOW TRIGGERS` 语句来查看数据库中的触发器的详细信息:
SHOW TRIGGERS LIKE 'table_name';
使用 `INFORMATION_SCHEMA.TRIGGERS` 表来查询数据库中的触发器信息:
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA = 'database_name' AND EVENT_OBJECT_TABLE = 'table_name';
在触发器中,通过使用 `NEW` 和 `OLD` 这两个预定义的伪行记录,可以在触发操作中引用新值和旧值。
- 示例:在触发器中进行插入操作,使用 `NEW` 关键字表示插入的新值
INSERT INTO another_table (column1, column2) VALUES (NEW.column1, NEW.column2);
使用 `DROP TRIGGER` 语句来删除触发器:
DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name;
注意,触发器的用法可能会在不同的数据库管理系统中有所差异,建议参考数据库的文档与相关资料。