数据库学习MySQL系列6、MySQL入门简单练习使用
建议学习实体书教材
MySQL入门简单使用
1、创建库
CREATE DATABASE test; --创建库 需要刷新
SHOW DATABASES; --查看当前已经存在的库
DROP DATABASE test; --删除库 需要刷新
--创建库 需要刷新
CREATE DATABASE test; --查看当前已经存在的库
SHOW DATABASES; --删除库 需要刷新
DROP DATABASE test;
2、创建表
2-1、创建测试表
--创建一个名为“test”的简单表,其中包含三个字段
CREATE TABLE test(
id INT AUTO_INCREMENT PRIMARY KEY, --主键
testname VARCHAR(100), --字符串字段,长度100
age INT --整数字段
);
--创建一个名为“test”的简单表,其中包含三个字段
CREATE TABLE test(id INT AUTO_INCREMENT PRIMARY KEY, --主键 testname VARCHAR(100), --字符串字段,长度100age INT --整数字段
);
CREATE TABLE test(
id INT,
testname VARCHAR(100),
age int
);
DESC test; --查看表结构
CREATE TABLE test(id INT,testname VARCHAR(100),age int
);
DESC test; --查看表结构
2-2、添加新的字段
ALTER TABLE test ADD email VARCHAR(50);
ALTER TABLE test ADD email VARCHAR(50);
2-3、修改字段名称
ALTER TABLE test RENAME COLUMN NAME TO dev_name;
ALTER TABLE test RENAME COLUMN NAME TO dev_name;
2-4、修改字段类型
ALTER TABLE test MODIFY COLUMN age SMALLINT;
ALTER TABLE test MODIFY COLUMN age SMALLINT;
2-5、为字段设置默认值
ALTER TABLE test ALTER COLUMN age SET DEFAULT 11;
ALTER TABLE test ALTER COLUMN age SET DEFAULT 11;
2-6、删除字段
ALTER TABLE test DROP COLUMN email;
ALTER TABLE test DROP COLUMN email;
2-7、删除表
DROP TABLE test;
DROP TABLE test;
2-8、数据库常见数据类型汇总
自行学习了解,数据类型:MySQL 数据类型 | 菜鸟教程
3、数据的增删改查
CREATE TABLE test(
id INT,
testname VARCHAR(100),
age int
);
CREATE TABLE test(id INT,testname VARCHAR(100),age int
);
3-1、插入数据
INSERT INTO test(id,testname,age) VALUES (1,'baidu1',11); --插入单条数据
INSERT INTO test(id,testname,age) VALUES (2,'baidu2',22),(3,'baidu3',33); --插入多条数据
INSERT INTO test VALUES (4,'baidu4',44); --不填入任何字段时仍可以插入成功
INSERT INTO test(id,testname) VALUES (5,'baidu5'); --可以插入成功,只是age字段没有值(NULL),若已设置默认值,则显示为默认值
INSERT INTO test(id) VALUES (6); --可以插入成功,只是name,age字段没有值(NULL),若已设置默认值,则显示为默认值
--插入单条数据
INSERT INTO test(id,testname,age) VALUES (1,'baidu1',11); --插入多条数据
INSERT INTO test(id,testname,age) VALUES (2,'baidu2',22),(3,'baidu3',33); --不填入任何字段时仍可以插入成功
INSERT INTO test VALUES (4,'baidu4',44); --可以插入成功,只是age字段没有值(NULL),若已设置默认值,则显示为默认值
INSERT INTO test(id,testname) VALUES (5,'baidu5'); --可以插入成功,只是name,age字段没有值(NULL),若已设置默认值,则显示为默认值
INSERT INTO test(id) VALUES (6);
3-2、查询
SELECT用于指定要查询的列,FROM指定要从哪个表中查询;若要查询所有列,可以在SELECT后面使用 * 星号,若只查询特定的列,可以直接在SELECT后面指定列名,列名之间用逗号隔开;
SELECT * FROM test;
SELECT * FROM test;
3-3、修改更新
UPDATE test SET testname = 'baidu6' WHERE id = 6; --将id = 6 的数据中的testname字段值改为baidu6
UPDATE test SET testname = 'baidu7'; --将test表中所有testname字段值改为baidu7,可以执行成功,但会提示“不安全的语句,缺少WHERE条件,确认运行?”
--将id = 6 的数据中的testname字段值改为baidu6
UPDATE test SET testname = 'baidu6' WHERE id = 6; --将test表中所有testname字段值改为baidu7,可以执行成功,但会提示“不安全的语句,缺少WHERE条件,确认运行?”
UPDATE test SET testname = 'baidu7';
3-4、删除
DELETE FROM test WHERE testname = 'baidu7'; --删除test表中testname值为baidu7的所有数据
DELETE FROM test; --可以删除,但会提示“不安全的语句,缺少WHERE条件,确认运行?”
--删除test表中testname值为baidu7的所有数据
DELETE FROM test WHERE testname = 'baidu7'; --可以删除,但会提示“不安全的语句,缺少WHERE条件,确认运行?”
DELETE FROM test;
4、数据的导入导出
选中表右键菜单选择需要导出的数据与保存目录(自行实践)
数据备份
数据迁移
5、常用语句
--补充测试数据
--首先需要已经创建过表,若无则新建
CREATE TABLE test(
id INT AUTO_INCREMENT PRIMARY KEY,
testname VARCHAR(100),
age INT
);
--补充测试数据
--首先需要已经创建过表,若无则新建
CREATE TABLE test(id INT AUTO_INCREMENT PRIMARY KEY,testname VARCHAR(100),age INT
);
--插入自定义的数据(14条记录)
INSERT IGNORE INTO test (testname, age) VALUES
('Emily Johnson', 28),
('David Lee', 35),
('Sophia Brown', 32),
('William Taylor', 35),
('Sophia Brown', 32),
('And Me', 40),
('Sophia Brown', 32),
('Jhon Deo', 30),
('William Taylor', 40),
('Olivia Wilson', 27),
('Michael Johnson', 32),
('Sophia Garcia', 25),
('Ethan Martinez', 38),
('Olivia Wilson', 27);
--插入自定义的数据(14条记录)
INSERT IGNORE INTO test (testname, age) VALUES('Emily Johnson', 28),('David Lee', 35),('Sophia Brown', 32),('William Taylor', 35),('Sophia Brown', 32),('And Me', 40),('Sophia Brown', 32),('Jhon Deo', 30),('William Taylor', 40),('Olivia Wilson', 27),('Michael Johnson', 32),('Sophia Garcia', 25),('Ethan Martinez', 38),('Olivia Wilson', 27);
--查询查看结果(14条记录)
SELECT * FROM test;
--查询查看结果(14条记录)
SELECT * FROM test;
在SELECT语句中,可以在WHERE子句中使用比较操作符限制查询结果,是可选的;当查询条件中和数字比较,可以使用单引号引起,也可以不用,当和字符及日期类型的数据比较,则必须用单引号引起;在WHERE子句中的查询条件,可以使用比较运算符来做查询;
--查询age字段大于30的记录(9条)、小于30的(4条)、等于30的(1条)--(>、<、=、>=、<=、!=/<>等等--MySQL 运算符 | 菜鸟教程--)
SELECT * FROM test WHERE age > 30;
--查询age字段大于30的记录(9条)、小于30的(4条)、等于30的(1条)--(>、<、=、>=、<=、!=/<>等等--https://www.runoob.com/mysql/mysql-operator.html--)
SELECT * FROM test WHERE age > 30;
--查询age字段为30或35的记录(3条),也可以多个,分号隔开;虽然IN支持很多个元素进行查询,但是可能会导致查询效率变慢;-- IN会做全表搜索(大量数据)
SELECT * FROM test WHERE age IN (30,35);
--查询age字段为30或35的记录(3条),也可以多个,分号隔开;虽然IN支持很多个元素进行查询,但是可能会导致查询效率变慢;-- IN会做全表搜索(大量数据)
SELECT * FROM test WHERE age IN (30,35);
--查询age字段在25~35之间的记录(11条,等于是包含,大于、小于是不包含)
SELECT * FROM test WHERE age >=25 AND age <=35;
--查询age字段在25~35之间的记录(11条,等于是包含,大于、小于是不包含)
SELECT * FROM test WHERE age >=25 AND age <=35;
--查询age字段在25~35之间的记录(11条,BETWEEN关键字是包含边界值的,是比较常见的范围查询)
SELECT * FROM test WHERE age BETWEEN 25 AND 35;
--查询age字段在25~35之间的记录(11条,BETWEEN关键字是包含边界值的,是比较常见的范围查询)
SELECT * FROM test WHERE age BETWEEN 25 AND 35;
模糊查询
当在执行查询时,不能完全确定某些信息的查询条件,或者只知道信息的一部分,可以借助LIKE来实现模糊查询。LIKE需要借助两个通配符:
%:表示0到多个字符
_:标识单个字符
这两个通配符可以配合使用,构造灵活的匹配条件;
(LIKE语句:‘%’--百分号代表零个、一个或多个 数字或者字符,表示N个字符,N是任意的,‘_’--下划线代表一个)
(延伸,glob语句:*--星号代表零个、一个或者多个,?--问号代表一个)
--查询当前数据库表中testname字段以‘S’开头的所有记录(4条)--S、s--不区分大小写
SELECT * FROM test WHERE testname LIKE 'S%';
--查询当前数据库表中testname字段以‘S’开头的所有记录(4条)--S、s--不区分大小写
SELECT * FROM test WHERE testname LIKE 'S%';
--查询当前数据库表中testname字段包含‘s’的所有记录(8条)
SELECT * FROM test WHERE testname LIKE '%s%';
--查询当前数据库表中testname字段包含‘s’的所有记录(8条)
SELECT * FROM test WHERE testname LIKE '%s%';
聚合函数
查询时需要做一些数据统计,因是多行数据参与运算返回一行结果,也称作分组函数、多行函数、集合函数;
--统计当前表中的数据记录有多少条(14条记录,count(*)计算行数或非空值的数量,为空则不会统计)
SELECT COUNT(*) FROM test;
--统计当前表中的数据记录有多少条(14条记录,count(*)计算行数或非空值的数量,为空则不会统计)
SELECT COUNT(*) FROM test;
--去重age字段(8条)--用于返回唯一不同的值
SELECT DISTINCT age FROM test;
--去重age字段(8条)--用于返回唯一不同的值
SELECT DISTINCT age FROM test;
--返回去重age字段的前5条记录(5条,当前结果里面的前5)--用于限制返回的行数
SELECT DISTINCT age FROM test LIMIT 5;
--返回去重age字段的前5条记录(5条,当前结果里面的前5)--用于限制返回的行数
SELECT DISTINCT age FROM test LIMIT 5;
--获取某个字段的部分数据--用于提取字符串的子串
--截取testname 字段的前5个字母--只显示testname字段的前5个字母
SELECT SUBSTR(testname,1,5) FROM test WHERE testname LIKE '%s%';
--获取某个字段的部分数据--用于提取字符串的子串
--截取testname 字段的前5个字母--只显示testname字段的前5个字母
SELECT SUBSTR(testname,1,5) FROM test WHERE testname LIKE '%s%';
--截取testname 字段的首个字母--只显示testname 字段的第一个字母
SELECT SUBSTR(testname,1,1) FROM test WHERE testname LIKE '%s%';
--截取testname 字段的首个字母--只显示testname 字段的第一个字母
SELECT SUBSTR(testname,1,1) FROM test WHERE testname LIKE '%s%';
--将查询出来的列,别名命名为baidutest
SELECT SUBSTR(testname,1,1) AS baidutest FROM test WHERE testname LIKE '%s%';
--将查询出来的列,别名命名为baidutest
SELECT SUBSTR(testname,1,1) AS baidutest FROM test WHERE testname LIKE '%s%';
对查
--分组,以age字段分组,并统计每个年龄组中的记录数(8条)
SELECT age,COUNT(*) FROM test GROUP BY age;
--分组,以age字段分组,并统计每个年龄组中的记录数(8条)
SELECT age,COUNT(*) FROM test GROUP BY age;
--筛选,统计以age字段分组后age字段大于30的记录(4条)
SELECT age,COUNT(*) FROM test GROUP BY age HAVING age > 30;
--筛选,统计以age字段分组后age字段大于30的记录(4条)
SELECT age,COUNT(*) FROM test GROUP BY age HAVING age > 30;
对查询出的数据按一定规则进行排序操作,使用ORDER BY子句,务必出现在SELECT中的最后一个子句;
--排序,按年龄升序排序,若年龄相同,则按姓名排序(14条)--asc 升序,desc 降序
SELECT * FROM test ORDER BY age ASC,testname ASC;
SELECT * FROM test ORDER BY age DESC;
--排序,按年龄升序排序,若年龄相同,则按姓名排序(14条)--asc 升序,desc 降序
SELECT * FROM test ORDER BY age ASC,testname ASC;
SELECT * FROM test ORDER BY age DESC;
正则匹配
--匹配testname字段中包含“And”的记录信息;
SELECT * FROM test WHERE testname REGEXP 'And';
--匹配testname字段中包含“And”的记录信息;
SELECT * FROM test WHERE testname REGEXP 'And';
--匹配testname字段中包含字母“a”或“A”的记录信息;
SELECT * FROM test WHERE testname REGEXP '[aA]';
--匹配testname字段中包含字母“a”或“A”的记录信息;
SELECT * FROM test WHERE testname REGEXP '[aA]';
--匹配testname字段中包含两个连续元音的记录信息;
SELECT * FROM test WHERE testname REGEXP '[aeiou]{2}';
--匹配testname字段中包含两个连续元音的记录信息;
SELECT * FROM test WHERE testname REGEXP '[aeiou]{2}';
--匹配testname字段中以“ A”开头并以“e”结尾的记录信息;
SELECT * FROM test WHERE testname REGEXP '^A.*e$';
--匹配testname字段中以“ A”开头并以“e”结尾的记录信息;
SELECT * FROM test WHERE testname REGEXP '^A.*e$';
--匹配年龄是两位数且第二位是2的记录
SELECT * FROM test WHERE age REGEXP '^[0-9]2$';
--匹配年龄是两位数且第二位是2的记录
SELECT * FROM test WHERE age REGEXP '^[0-9]2$';
其他
自行学习:MySQL 正则表达式 | 菜鸟教程
6、子查询
子查询是一种在一个SQL语句中嵌入另一个查询的方式。子查询可以用于从表中选择数据,然后在外层查询中使用这些数据进行进一步操作。
下面是几个常见的子查询示例,涵盖不同的场景。
--子查询与WHERE子句:查找age字段大于表中平均age的所有记录,用在WHERE子句中(5条数据)
SELECT * FROM test WHERE age > (SELECT AVG(age) FROM test);
--子查询与WHERE子句:查找age字段大于表中平均age的所有记录,用在WHERE子句中(5条数据)
SELECT * FROM test WHERE age > (SELECT AVG(age) FROM test);
--在查询列中引出子查询,别名为avgage并显示查询结果出来
SELECT *,(SELECT AVG(age) FROM test) AS avgage FROM test WHERE age > (SELECT AVG(age) FROM test);
--在查询列中引出子查询,别名为avgage并显示查询结果出来
SELECT *,(SELECT AVG(age) FROM test) AS avgage FROM test WHERE age > (SELECT AVG(age) FROM test);
--用在创建表时,在创建test1表时会首先拷贝test表的表结构,然后将所有满足条件的数据记录导入test1表里面
CREATE TABLE test1 SELECT * FROM test WHERE age > (SELECT AVG(age) FROM test);
--用在创建表时,在创建test1表时会首先拷贝test表的表结构,然后将所有满足条件的数据记录导入test1表里面
CREATE TABLE test1 SELECT * FROM test WHERE age > (SELECT AVG(age) FROM test);
--运行成功后再查询test1表,可以看到数据记录(5条)
SELECT * FROM test1;
--运行成功后再查询test1表,可以看到数据记录(5条)
SELECT * FROM test1;
--用在插入数据时,执行成功后test1与test表中的数据一样(均是14条)
INSERT INTO test1 SELECT * FROM test WHERE age <= (SELECT AVG(age) FROM test);
--用在插入数据时,执行成功后test1与test表中的数据一样(均是14条)
INSERT INTO test1 SELECT * FROM test WHERE age <= (SELECT AVG(age) FROM test);
子查询与JOIN
--新创建user_test表--
CREATE TABLE IF NOT EXISTS user_test (
testname1 VARCHAR(50),
address VARCHAR(100)
);
--新创建user_test表--
CREATE TABLE IF NOT EXISTS user_test (testname1 VARCHAR(50),address VARCHAR(100)
);
--插入数据到user_test表里面
INSERT IGNORE INTO user_test (testname1,address) VALUES
('And We', '123 Abc De'),
('Not You', '456 Fgh Ij'),
('Or It', '789 Lmn Op'),
('Emily Johnson', '123 Abc De'),
('David Lee', '456 Fgh Ij'),
('Sophia Brown', '456 Fgh Ij');
--插入数据到user_test表里面
INSERT IGNORE INTO user_test (testname1,address) VALUES('And We', '123 Abc De'),('Not You', '456 Fgh Ij'),('Or It', '789 Lmn Op'),('Emily Johnson', '123 Abc De'),('David Lee', '456 Fgh Ij'),('Sophia Brown', '456 Fgh Ij');
--查询user_test表--(6条)
SELECT * FROM user_test;
--查询user_test表--(6条)
SELECT * FROM user_test;
--查询test表--(14条)
SELECT * FROM test;
--查询test表--(14条)
SELECT * FROM test;
使用子查询进行联接,用在联表中--(5条)
SELECT t.testname,t.age,ud.address FROM test AS t JOIN (SELECT testname1,address FROM user_test) AS ud ON t.testname = ud.testname1;
使用子查询进行联接,用在联表中--(5条)
SELECT t.testname,t.age,ud.address FROM test AS t JOIN (SELECT testname1,address FROM user_test) AS ud ON t.testname = ud.testname1;
7、表关联
实际应用中所需要的数据,经常会需要查询两个或两个以上的表;这种查询两个或两个以上数据表或视图的查询叫做连接查询,连接查询通常建立在存在相互关系的父子表之间;
--内连接(INNER JOIN):内连接返回两个表中匹配行的交集--(5条)
SELECT * FROM test AS t INNER JOIN user_test AS ud ON t.testname = ud.testname1;
SELECT t.testname,t.age,ud.address FROM test AS t INNER JOIN user_test AS ud ON t.testname = ud.testname1;
--内连接(INNER JOIN):内连接返回两个表中匹配行的交集--(5条)
SELECT * FROM test AS t INNER JOIN user_test AS ud ON t.testname = ud.testname1;
SELECT t.testname,t.age,ud.address FROM test AS t INNER JOIN user_test AS ud ON t.testname = ud.testname1;
--左连接(LEFT JOIN):左连接返回左表中的所有行,以及右表中匹配的行(如果有的话,若不存在,则以NULL填充)--(14条)
SELECT * FROM test AS t LEFT JOIN user_test AS ud ON t.testname = ud.testname1;
SELECT t.testname,t.age,ud.address FROM test AS t LEFT JOIN user_test AS ud ON t.testname = ud.testname1;
--左连接(LEFT JOIN):左连接返回左表中的所有行,以及右表中匹配的行(如果有的话,若不存在,则以NULL填充)--(14条)
SELECT * FROM test AS t LEFT JOIN user_test AS ud ON t.testname = ud.testname1;
SELECT t.testname,t.age,ud.address FROM test AS t LEFT JOIN user_test AS ud ON t.testname = ud.testname1;
--右连接(RIGHT JOIN):右连接返右表中的所有行,以及左表中匹配的行(如果有的话,若不存在,则以NULL填充)--(8条)
SELECT * FROM test AS t RIGHT JOIN user_test AS ud ON t.testname = ud.testname1;
SELECT t.testname,t.age,ud.address FROM test AS t RIGHT JOIN user_test AS ud ON t.testname = ud.testname1;
--右连接(RIGHT JOIN):右连接返右表中的所有行,以及左表中匹配的行(如果有的话,若不存在,则以NULL填充)--(8条)
SELECT * FROM test AS t RIGHT JOIN user_test AS ud ON t.testname = ud.testname1;
SELECT t.testname,t.age,ud.address FROM test AS t RIGHT JOIN user_test AS ud ON t.testname = ud.testname1;
笛卡尔积指做关联操作的每个表的每一行都和其它表的每一行做组合,假设两个表的记录条数分别是X和Y,笛卡尔积将返回X * Y条记录;当两个表关联查询时,不写连接条件,得到的结果即是笛卡尔积;
--笛卡尔积查询:MySQL将返回test中的每一行与另一个表中的每一行的组合--例如:A表有14行,B表有6行,则为:14*6=84(行)
SELECT * FROM test AS t ,user_test AS ud;
--笛卡尔积查询:MySQL将返回test中的每一行与另一个表中的每一行的组合--例如:A表有14行,B表有6行,则为:14*6=84(行)
SELECT * FROM test AS t ,user_test AS ud;
8、索引
在MySQL中,索引是非常重要的,它是一种用于能够提高数据库查询性能的数据结构,它类似于书籍的目录,可以帮助数据库快速的找到目标数据,而不需要扫描整张表;
创建单列索引
--创建单列索引在testname列上
CREATE INDEX idx_testname ON test(testname);
--创建单列索引在testname列上
CREATE INDEX idx_testname ON test(testname);
--创建单列索引在age列上
CREATE INDEX idx_age ON test(age);
--创建单列索引在age列上
CREATE INDEX idx_age ON test(age);
--测试SQL,建立索引前后,分析执行
--选中当前查询--查看鼠标右键菜单选择→查询分析(I)→解析当前查询(Y)
SELECT * FROM test WHERE age = 30;
--选中当前查询--查看鼠标右键菜单选择→查询分析(I)→解析当前查询(Y)
SELECT * FROM test WHERE age = 30;
创建多列索引
--创建多列索引在testname和age列上
CREATE INDEX idx_testname_age ON test(testname,age);
--创建多列索引在testname和age列上
CREATE INDEX idx_testname_age ON test(testname,age);
--删除 testname 列上的索引
DROP INDEX idx_testname ON test;
--删除 testname 列上的索引
DROP INDEX idx_testname ON test;
--删除 age 列上的索引
DROP INDEX idx_age ON test;
--删除 age 列上的索引
DROP INDEX idx_age ON test;
--删除 testname 和 age 列上的多列索引
DROP INDEX idx_testname_age ON test;
--删除 testname 和 age 列上的多列索引
DROP INDEX idx_testname_age ON test;
9、查询语句的执行顺序
当一条查询语句中包含所有的子句,执行顺序依下列子句次序:
- FROM 子句:执行顺序为从后往前、从右到左。数据量较少的表尽量放在后面;
- WHERE子句:执行顺序为自下而上、从右到左。将能过滤掉最大数量记录的条件写在WHERE 子句的最右;
- GROUP BY:执行顺序从左往右分组,最好在GROUP BY前使用WHERE将不需要的记录在GROUP BY之前过滤掉;
- HAVING 子句:消耗资源。尽量避免使用,HAVING 会在检索出所有记录之后才对结果集进行过滤,需要排序等操作;
- SELECT子句:少用*号,尽量取字段名称。ORACLE 在解析的过程中, 通过查询数据字典将*号依次转换成所有的列名, 消耗时间;
- ORDER BY子句:执行顺序为从左到右排序,消耗资源;
10、其他自行学习了解
建议系统性持续学习;
别名
在SQL语句中可以通过使用列的别名改变标题的显示样式,或者表示计算结果的含义,使用语法是列的别名跟在列名后,中间可以加或不加一个“AS”关键字;
关键字AND、OR
在SQL操作中,如果希望返回的结果必须满足多个条件,应该使用AND逻辑操作符连接这些条件,如果希望返回的结果满足多个条件之一即可,应该使用OR逻辑操作符连接这些条件;
使用IN和NOT IN
在WHERE子句中可以用比较操作符IN(list)来取出符合列表范围中的数据。其中的参数list表示值列表,当列或表达式匹配于列表中的任何一个值时,条件为TRUE,该条记录则被显示出来;IN页可以理解为一个范围比较操作符,只不过这个范围是一个指定的值列表,NOT IN(list) 取出不符合此列表中的数据记录;
BETWEEN…AND…
BETWEEN…AND…操作符用来查询符合某个值域范围条件的数据,最常见的是使用在数字类型的数据范围上,但对字符类型和日期类型数据也同样适用;
使用IS NULL和IS NOT NULL
空值NULL是一个特殊的值,比较的时候不能使用”=”号,必须使用IS NULL,否则不能得到正确的结果;
使用ANY和ALL条件
在比较运算符中,可以出现ALL和ANY,表示“全部”和“任一”,但是ALL和ANY不能单独使用,需要配合单行比较操作符>、>=、
- > ANY : 大于最小
- < ANY:小于最大
- > ALL:大于最大
- < ALL:小于最小
等等......
未完待续!
测试学习使用,仅记录。