Oracle第四课(学习笔记)
1、复制文件到新的表
建立表直接拷贝内容
CREATE TABLE JUL12_STUDENT_NEW
AS
SELECT ID,SNAME,AGE FROM JUL12_STUDENT
WHERE AGE >23;
>>把查询出来的内容放置在新的表中,创建表的同时将数据放置在表里面
==============================================================
2、Data Manipulation Language 数据库操作语言
Command
INSERT 添加命令
UPDATE 更新命令
DELETE 删除命令
INSERT语句用子查询得到的数据直接添加进入另一个表
INSERT INTO HISTORY (ID,LAST_NAME,SALARY,TITLE,START_DATE)
SELECT ID,LAST_NAME,SALARY,TITLE,START_DATE
FROM S_EMP
WHERE START_DATE<'01-JAN-94';
-------------------------
Updating Rows
UPDATE JUL12_STUDENT_NEW SET AGE=44,SNAME ='ABC'
WHERE ID =103;
要求,表内所有人的年龄都加10
UPDATE JUL12_STUDENT_NEW
SET AGE = AGE+10;
CREATE TABLE JUL12_STUDENT_TEMP(
A NUMBER(3),
B NUMBER(3)
);
INSERT INTO JUL12_STUDENT_TEMP VALUES( 2,3);
将student_temp表中a字段的值更新为student中
最大的id,b字段的值更新为student中最小的年龄
自己写:UPDATE JUL12_STUDENT_TEMP
SET A=(SELECT MAX(SID) FROM JUL12_STUDENT),
B=(SELECT MIN(AGE) FROM JUL12_STUDENT)
减少查询的次数 。变成一次。
UPDATE JUL12_STUDENT_TEMP
SET SET (A,B)=
(SELECT MAX(SID) ,MIN(AGE) FROM JUL12_STUDENT)
--------------------------
Deleting Rows from a table
条件删除
DELETE FROM a_smp
WHERE start_date >
TO_DATE('01.01.1996','DD.MM.YYYY');
非条件删除
DELETE FROM JUL12_TEST;
==================================================
3、DCL 数据控制语言
Database Control Language
Transaction 事务
事务的四个特性
ACID四个英文单词的缩写
atomic 原子性 不可分割
consistence 一致性 一起成功一起失败
isolation 隔离性 两个事务之间的隔离
durability 持久性 持久化到数据库的表文件
进入SQLPLUS后每个人都开启一个事务
注:"/"表示执行上面的那个命令语句。
两种级别:
局部事务:
局部事务(数据库的操作都是针对一个数据库的同一个用户)
全局事务(分布式事务)(数据库操作是对多个数据库或者一个数据库的不同用户下的表)
COMMIT 全部成功
ROOLBACK 上面失败 回滚所有的操作
[
DELETE FROM JUL12_STUDENT WHERE ID > 12;
UPDATE JUL12_STUDENT SET AGE=23 WHERE SID =4;
SELECT * FROM JUL12_STUDENT;
--事务结束,一起失败
ROOLBACK ;
]
事务的锁定
一个端口
INSERT INTO JUL12_TABLE
VALUES( 123,'XIE');
另一个端口
UPDATE JUL12_TABLE
SET SID =123;
一个客户端对这条记录操作。则锁定 。。等待提交事务(commit.或者,roolback) 否则另一个事务中就没有办法操作这个数据项
事务工作方式:
如果你没有提交事务,则其他用户就看不见
没有提交或者回滚则,其他用户就不可以对该数据进行处理
如果成功提交,则数据更改就提交到数据库中,进行存盘的操作。
---------指定返回事务----------
当我们想把其中的几步回滚,那么我们就需要在操作的地址进行设置回滚点。
例子:
SELECT * FROM JUL12_STUDENT
INSERT INTO JUL12_STUDENT VALUES(120,'ZHANG',12);
SAVEPOINT INSERT_POINT_NAME1;
UPDATE JUL12_STUDENT
SET SID = 123, SNAME = 'XIA', AGE =13;
SAVEPOINT UPDATE_POINT_NAME2;
ROOLBACK;全部回滚
ROOLBACK TO UPDATE_POINT_NAME1;
则我们的insert语句还是可以执行的,就是下面的update语句是不可以执行的而已。这样我们就可以理解了这个ROOLBACK的用意了。
------------END-----------
Other Database Object 其他数据对象
1、Sequence 序列
INSERT INTO JUL12_STUDENT VALUES(103,'ZHANG',23);
CREATE SEQUENCE JUL12_SEQ_STU;
//创建一个SEQUENCE
CREATE SEQUENCE name
[INCREMENT BY n] 增长的段
[START WITH n] 开始编号
[{MAXVALUE n|NOMAXVALUE}] 最大值
[{MINVALUE n|NOMINVALUE}] 最小值
[{CYCLE|NOCYCLE}] 循环
[{CACHE n|NOCACHE}] 缓存
//删除索引
DROP SEQUENCE name
其中[START WITH n]不可以被修改,只可以被删除
INSERT INTO JUL12_STUDENT VALUES (JUL12_SEQ_STU.NEXTVAL,'ZHANG',23);
//序列的数字字典表
user_sequences
DESC USER_SEQUENCES;
//查看序列当前的值
SELECT JUL12_SEQ_STU.currval from dual(这个表只是为了让序列显示而已);
//CACHE一般情况使用NOCACHE
=====================================
CREATE TABLE JUL12_INFO(
ID NUMBER(3) PRIMARY KEY,
NAME VARCHAR2(10),
AGE NUMBER(3)
);
INSERT INTO JUL12_INFO VALUES( 1,'ZHANG',17);
INSERT INTO JUL12_INFO VALUES( 2,'ZHANG',15);
INSERT INTO JUL12_INFO VALUES( 3,'ZHANG',45);
INSERT INTO JUL12_INFO VALUES( 4,'ZHANG',78);
INSERT INTO JUL12_INFO VALUES( 5,'GOOD',23);
INSERT INTO JUL12_INFO VALUES( 6,'GOOD',25);
INSERT INTO JUL12_INFO VALUES( 7,'XIE',14);
INSERT INTO JUL12_INFO VALUES( 8,'XIE',64);
相同的记录只留下一条记录(自己写)
SELECT A.ID, A.NAME,A.AGE
FROM JUL12_INFO A ,
(
SELECT NAME,MAX(AGE) AGE FROM JUL12_INFO
GROUP BY NAME
) B
WHERE A.NAME =B.NAME AND A.AGE = B.AGE ;
----------------------面试的可能题目---------------
ROWID 这条记录的实际存储位置
SELECT ROWID FROM JUL12_INFO ;
去除所有的内容
DELETE FROM JUL12_INFO
WHERE NAME IN
(
SELECT NAME FROM JUL12_INFO
GROUP BY NAME
HAVING COUNT(*) > 1
);
DELETE FROM JUL12_INFO A
WHERE ID >
(
SELECT MIN(ID)
FROM JUL12_INFO B
WHERE A.NAME = B.NAME
)
DELETE FROM JUL12_INFO A
WHERE A.ROWID >
{
SELECT MIN(ROWID)
FROM JUL12_INFO B
WHERE A.NAME = B.NAME
}
============================
随机查找
SELECT DBMS_RANDOM.RANDOM FROM JUL12_INFO;
-------随即取三条记录(自己写)-----------
SELECT ID,NAME,AGE FROM
(
SELECT DBMS_RANDOM.RANDOM RADOMNUM,ID,NAME,AGE
FROM JUL12_INFO
ORDER BY RADOMNUM
)
WHERE ROWNUM <=3;
SELECT ID,NAME,AGE FROM
(
SELECT ID,NAME,AGE
FROM JUL12_INFO
ORDER BY DBMS_RADON.RANDOM
)
WHERE ROWNUM <= 3;
-----------------end-----------------
――――――――acid
-----隔离级别
四种读:
dirty-read,脏读
一个事务读到另一个事务没有提交的数据(在ORACLE没有这个情况)。
committed-read ,提交读(默认的隔离级别)
一个事务提交了事务,而另一个事务才可以读到
repeatable-read 重复读 ,
更改后没有什么,另一个查找的两次查找的过程中显示的结果一样。
serializable-read 序列读(phantom-read幻影读)
插入记录后,另一个用户读取不到数据。
SET TRANSACTION ISOLATION;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
2、Index 索引
是一个独立的对象。
建立了一个主键约束,或唯一约束的话,那么那个主键就是一个索引
如果NAME为主键
SELECT ID ,NAME .AGE FROM JUL12_INFO WHERE NAME='ASD';
INDEX_TABLE
AAA ROWID
BBB ROWID
......
自己建立索引
CREATE INDEX index
ON table (column[,column]...);
Example:
SQL> CREATE INDEX s_emp_last_name_idx
ON s_emp(last_name);
Index created;
DESC USER_INDEXES;
SELECT INDEX_NAME FROM
USER_INDEXES
WHERE TABLE_NAME ='JUL12_INFO';
按照NAME来找
CREATE INDEX JUL12_INDEX_INFO
ON JUL12_INFO(NAME);
删除索引
DROP INDEX JUL12_INDEX_INFO
3、view 视图
准备数据
CREATE TABLE JUL12_CLASS(
CID NUMBER(3),
CNAME CHAR(10)
);
INSERT INTO JUL12_CLASS VALUES( 101,'JAVA');
INSERT INTO JUL12_CLASS VALUES (102,'C');
INSERT INTO JUL12_CLASS VALUES( 103,'DD');
CREATE TABLE JUL12_STUDENT(
SID NUMBER(3),
SNAME CHAR(10),
CID NUMBER(3)
);
INSERT INTO JUL12_STUDENT VALUES (1,'ZHANG',101);
INSERT INTO JUL12_STUDENT VALUES (2,'XIE',102);
INSERT INTO JUL12_STUDENT VALUES (3,'GOOD',101);
INSERT INTO JUL12_STUDENT VALUES (4,'SSS',101);
SELECT S.SID,S.SNAME,C.CNAME
FROM JUL12_CLASS C ,JUL12_STUDENT S
WHERE S.CID = C.CID;
创建视图
CREATE VIEW JUL12_S_C_VIEW
AS
SELECT S.SID,S.SNAME,C.CNAME
FROM JUL12_CLASS C,JUL12_STUDENT S
WHERE S.CID = C.CID;
查询视图
SELECT * FROM JUL12_S_C_VIEW
更改视图
CREATE OR REPLACE VIEW JUL12_S_C_VIEW
AS
SELECT S.SID,S.SNAME,C.CNAME
FROM JUL12_CLASS C,JUL12_STUDENT S
WHERE S.CID = C.CID;
数据字典表
user_views
SELECT VIEW_NAME,TEXT FROM USER_VIEWS;
================================================
CREATE TABLE JUL12_INFO(
ID NUMBER(3),
NAME CHAR(10),
AGE NUMBER(3),
ADDRESS CHAR(10)
);
INSERT INTO JUL12_INFO VALUES (101,'ZHANG',23,'JIANGSU');
INSERT INTO JUL12_INFO VALUES (102,'XIE',23,'NANJING');
INSERT INTO JUL12_INFO VALUES (103,'ZHNG',23,'ZEJIANG');
INSERT INTO JUL12_INFO VALUES (104,'ZHG',23,'HANGZHOU');
1。建立视图
CREATE OR REPLACE VIEW JUL12_INFO_VIEW
AS
SELECT NAME ,AGE,ADDRESS
FROM JUL12_INFO;
2。查询视图
SELECT * FROM JUL12_INFO_VIEW;
3。加入数据
INSERT INTO JUL12_INFO_VIEW
VALUES ('ZHANG',23,'CHANGZHOU');
4.不允许加入数据
CREATE OR REPLACE VIEW JUL12_INFO_VIEW
AS
SELECT NAME ,AGE,ADDRESS
FROM JUL12_INFO
WITH READ ONLY;
如此作业就可以将视图不可以往数据库里面添加记录
CREATE OR REPLACE VIEW JUL12_INFO_VIEW
AS
SELECT NAME,AGE ,ADDRESS
FROM JUL12_INFO
WHERE AGE =24
WITH CHECK OPTION CONSTRAINT SS111;
加入的记录符合WHERE的条件。
INSERT INTO JUL12_INFO_VIEW
VALUES ('22',24,'NJ'); 可以插入
INSERT INTO JUL12_INFO_VIEW
VALUES ('23',22,'JS'); 不可以插入
简单视图,复杂视图
复杂视图是不可以对视图进行插入值将值转换到表中。
建立表直接拷贝内容
CREATE TABLE JUL12_STUDENT_NEW
AS
SELECT ID,SNAME,AGE FROM JUL12_STUDENT
WHERE AGE >23;
>>把查询出来的内容放置在新的表中,创建表的同时将数据放置在表里面
==============================================================
2、Data Manipulation Language 数据库操作语言
Command
INSERT 添加命令
UPDATE 更新命令
DELETE 删除命令
INSERT语句用子查询得到的数据直接添加进入另一个表
INSERT INTO HISTORY (ID,LAST_NAME,SALARY,TITLE,START_DATE)
SELECT ID,LAST_NAME,SALARY,TITLE,START_DATE
FROM S_EMP
WHERE START_DATE<'01-JAN-94';
-------------------------
Updating Rows
UPDATE JUL12_STUDENT_NEW SET AGE=44,SNAME ='ABC'
WHERE ID =103;
要求,表内所有人的年龄都加10
UPDATE JUL12_STUDENT_NEW
SET AGE = AGE+10;
CREATE TABLE JUL12_STUDENT_TEMP(
A NUMBER(3),
B NUMBER(3)
);
INSERT INTO JUL12_STUDENT_TEMP VALUES( 2,3);
将student_temp表中a字段的值更新为student中
最大的id,b字段的值更新为student中最小的年龄
自己写:UPDATE JUL12_STUDENT_TEMP
SET A=(SELECT MAX(SID) FROM JUL12_STUDENT),
B=(SELECT MIN(AGE) FROM JUL12_STUDENT)
减少查询的次数 。变成一次。
UPDATE JUL12_STUDENT_TEMP
SET SET (A,B)=
(SELECT MAX(SID) ,MIN(AGE) FROM JUL12_STUDENT)
--------------------------
Deleting Rows from a table
条件删除
DELETE FROM a_smp
WHERE start_date >
TO_DATE('01.01.1996','DD.MM.YYYY');
非条件删除
DELETE FROM JUL12_TEST;
==================================================
3、DCL 数据控制语言
Database Control Language
Transaction 事务
事务的四个特性
ACID四个英文单词的缩写
atomic 原子性 不可分割
consistence 一致性 一起成功一起失败
isolation 隔离性 两个事务之间的隔离
durability 持久性 持久化到数据库的表文件
进入SQLPLUS后每个人都开启一个事务
注:"/"表示执行上面的那个命令语句。
两种级别:
局部事务:
局部事务(数据库的操作都是针对一个数据库的同一个用户)
全局事务(分布式事务)(数据库操作是对多个数据库或者一个数据库的不同用户下的表)
COMMIT 全部成功
ROOLBACK 上面失败 回滚所有的操作
[
DELETE FROM JUL12_STUDENT WHERE ID > 12;
UPDATE JUL12_STUDENT SET AGE=23 WHERE SID =4;
SELECT * FROM JUL12_STUDENT;
--事务结束,一起失败
ROOLBACK ;
]
事务的锁定
一个端口
INSERT INTO JUL12_TABLE
VALUES( 123,'XIE');
另一个端口
UPDATE JUL12_TABLE
SET SID =123;
一个客户端对这条记录操作。则锁定 。。等待提交事务(commit.或者,roolback) 否则另一个事务中就没有办法操作这个数据项
事务工作方式:
如果你没有提交事务,则其他用户就看不见
没有提交或者回滚则,其他用户就不可以对该数据进行处理
如果成功提交,则数据更改就提交到数据库中,进行存盘的操作。
---------指定返回事务----------
当我们想把其中的几步回滚,那么我们就需要在操作的地址进行设置回滚点。
例子:
SELECT * FROM JUL12_STUDENT
INSERT INTO JUL12_STUDENT VALUES(120,'ZHANG',12);
SAVEPOINT INSERT_POINT_NAME1;
UPDATE JUL12_STUDENT
SET SID = 123, SNAME = 'XIA', AGE =13;
SAVEPOINT UPDATE_POINT_NAME2;
ROOLBACK;全部回滚
ROOLBACK TO UPDATE_POINT_NAME1;
则我们的insert语句还是可以执行的,就是下面的update语句是不可以执行的而已。这样我们就可以理解了这个ROOLBACK的用意了。
------------END-----------
Other Database Object 其他数据对象
1、Sequence 序列
INSERT INTO JUL12_STUDENT VALUES(103,'ZHANG',23);
CREATE SEQUENCE JUL12_SEQ_STU;
//创建一个SEQUENCE
CREATE SEQUENCE name
[INCREMENT BY n] 增长的段
[START WITH n] 开始编号
[{MAXVALUE n|NOMAXVALUE}] 最大值
[{MINVALUE n|NOMINVALUE}] 最小值
[{CYCLE|NOCYCLE}] 循环
[{CACHE n|NOCACHE}] 缓存
//删除索引
DROP SEQUENCE name
其中[START WITH n]不可以被修改,只可以被删除
INSERT INTO JUL12_STUDENT VALUES (JUL12_SEQ_STU.NEXTVAL,'ZHANG',23);
//序列的数字字典表
user_sequences
DESC USER_SEQUENCES;
//查看序列当前的值
SELECT JUL12_SEQ_STU.currval from dual(这个表只是为了让序列显示而已);
//CACHE一般情况使用NOCACHE
=====================================
CREATE TABLE JUL12_INFO(
ID NUMBER(3) PRIMARY KEY,
NAME VARCHAR2(10),
AGE NUMBER(3)
);
INSERT INTO JUL12_INFO VALUES( 1,'ZHANG',17);
INSERT INTO JUL12_INFO VALUES( 2,'ZHANG',15);
INSERT INTO JUL12_INFO VALUES( 3,'ZHANG',45);
INSERT INTO JUL12_INFO VALUES( 4,'ZHANG',78);
INSERT INTO JUL12_INFO VALUES( 5,'GOOD',23);
INSERT INTO JUL12_INFO VALUES( 6,'GOOD',25);
INSERT INTO JUL12_INFO VALUES( 7,'XIE',14);
INSERT INTO JUL12_INFO VALUES( 8,'XIE',64);
相同的记录只留下一条记录(自己写)
SELECT A.ID, A.NAME,A.AGE
FROM JUL12_INFO A ,
(
SELECT NAME,MAX(AGE) AGE FROM JUL12_INFO
GROUP BY NAME
) B
WHERE A.NAME =B.NAME AND A.AGE = B.AGE ;
----------------------面试的可能题目---------------
ROWID 这条记录的实际存储位置
SELECT ROWID FROM JUL12_INFO ;
去除所有的内容
DELETE FROM JUL12_INFO
WHERE NAME IN
(
SELECT NAME FROM JUL12_INFO
GROUP BY NAME
HAVING COUNT(*) > 1
);
DELETE FROM JUL12_INFO A
WHERE ID >
(
SELECT MIN(ID)
FROM JUL12_INFO B
WHERE A.NAME = B.NAME
)
DELETE FROM JUL12_INFO A
WHERE A.ROWID >
{
SELECT MIN(ROWID)
FROM JUL12_INFO B
WHERE A.NAME = B.NAME
}
============================
随机查找
SELECT DBMS_RANDOM.RANDOM FROM JUL12_INFO;
-------随即取三条记录(自己写)-----------
SELECT ID,NAME,AGE FROM
(
SELECT DBMS_RANDOM.RANDOM RADOMNUM,ID,NAME,AGE
FROM JUL12_INFO
ORDER BY RADOMNUM
)
WHERE ROWNUM <=3;
SELECT ID,NAME,AGE FROM
(
SELECT ID,NAME,AGE
FROM JUL12_INFO
ORDER BY DBMS_RADON.RANDOM
)
WHERE ROWNUM <= 3;
-----------------end-----------------
――――――――acid
-----隔离级别
四种读:
dirty-read,脏读
一个事务读到另一个事务没有提交的数据(在ORACLE没有这个情况)。
committed-read ,提交读(默认的隔离级别)
一个事务提交了事务,而另一个事务才可以读到
repeatable-read 重复读 ,
更改后没有什么,另一个查找的两次查找的过程中显示的结果一样。
serializable-read 序列读(phantom-read幻影读)
插入记录后,另一个用户读取不到数据。
SET TRANSACTION ISOLATION;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
2、Index 索引
是一个独立的对象。
建立了一个主键约束,或唯一约束的话,那么那个主键就是一个索引
如果NAME为主键
SELECT ID ,NAME .AGE FROM JUL12_INFO WHERE NAME='ASD';
INDEX_TABLE
AAA ROWID
BBB ROWID
......
自己建立索引
CREATE INDEX index
ON table (column[,column]...);
Example:
SQL> CREATE INDEX s_emp_last_name_idx
ON s_emp(last_name);
Index created;
DESC USER_INDEXES;
SELECT INDEX_NAME FROM
USER_INDEXES
WHERE TABLE_NAME ='JUL12_INFO';
按照NAME来找
CREATE INDEX JUL12_INDEX_INFO
ON JUL12_INFO(NAME);
删除索引
DROP INDEX JUL12_INDEX_INFO
3、view 视图
准备数据
CREATE TABLE JUL12_CLASS(
CID NUMBER(3),
CNAME CHAR(10)
);
INSERT INTO JUL12_CLASS VALUES( 101,'JAVA');
INSERT INTO JUL12_CLASS VALUES (102,'C');
INSERT INTO JUL12_CLASS VALUES( 103,'DD');
CREATE TABLE JUL12_STUDENT(
SID NUMBER(3),
SNAME CHAR(10),
CID NUMBER(3)
);
INSERT INTO JUL12_STUDENT VALUES (1,'ZHANG',101);
INSERT INTO JUL12_STUDENT VALUES (2,'XIE',102);
INSERT INTO JUL12_STUDENT VALUES (3,'GOOD',101);
INSERT INTO JUL12_STUDENT VALUES (4,'SSS',101);
SELECT S.SID,S.SNAME,C.CNAME
FROM JUL12_CLASS C ,JUL12_STUDENT S
WHERE S.CID = C.CID;
创建视图
CREATE VIEW JUL12_S_C_VIEW
AS
SELECT S.SID,S.SNAME,C.CNAME
FROM JUL12_CLASS C,JUL12_STUDENT S
WHERE S.CID = C.CID;
查询视图
SELECT * FROM JUL12_S_C_VIEW
更改视图
CREATE OR REPLACE VIEW JUL12_S_C_VIEW
AS
SELECT S.SID,S.SNAME,C.CNAME
FROM JUL12_CLASS C,JUL12_STUDENT S
WHERE S.CID = C.CID;
数据字典表
user_views
SELECT VIEW_NAME,TEXT FROM USER_VIEWS;
================================================
CREATE TABLE JUL12_INFO(
ID NUMBER(3),
NAME CHAR(10),
AGE NUMBER(3),
ADDRESS CHAR(10)
);
INSERT INTO JUL12_INFO VALUES (101,'ZHANG',23,'JIANGSU');
INSERT INTO JUL12_INFO VALUES (102,'XIE',23,'NANJING');
INSERT INTO JUL12_INFO VALUES (103,'ZHNG',23,'ZEJIANG');
INSERT INTO JUL12_INFO VALUES (104,'ZHG',23,'HANGZHOU');
1。建立视图
CREATE OR REPLACE VIEW JUL12_INFO_VIEW
AS
SELECT NAME ,AGE,ADDRESS
FROM JUL12_INFO;
2。查询视图
SELECT * FROM JUL12_INFO_VIEW;
3。加入数据
INSERT INTO JUL12_INFO_VIEW
VALUES ('ZHANG',23,'CHANGZHOU');
4.不允许加入数据
CREATE OR REPLACE VIEW JUL12_INFO_VIEW
AS
SELECT NAME ,AGE,ADDRESS
FROM JUL12_INFO
WITH READ ONLY;
如此作业就可以将视图不可以往数据库里面添加记录
CREATE OR REPLACE VIEW JUL12_INFO_VIEW
AS
SELECT NAME,AGE ,ADDRESS
FROM JUL12_INFO
WHERE AGE =24
WITH CHECK OPTION CONSTRAINT SS111;
加入的记录符合WHERE的条件。
INSERT INTO JUL12_INFO_VIEW
VALUES ('22',24,'NJ'); 可以插入
INSERT INTO JUL12_INFO_VIEW
VALUES ('23',22,'JS'); 不可以插入
简单视图,复杂视图
复杂视图是不可以对视图进行插入值将值转换到表中。