数据库中的对象
表TABLE | 基本的存储单元 由行【数据】和列【字段】组成。 |
视图VIEW | 逻辑上代表一个和多个表中的数据的子集。 |
序列 | 数字值的生成器 |
索引 | 提高某些查询的性能 |
同义词 | 给出对象的替代名称 |
数据表
表明和列明的命名规则:
- 必须以字母开头
- 长度必须是1-30个字符
- 只能包含A-Z a-z 0-9 _ $ #等字符和特殊字符
- 不能与同一个用户拥有的其他对象重名 同一个用户 或者同一个schema下只能有一张这个名字表
- 不能是ORACLE的保留字
CREATE TABLE 建表语句
必须具有以下条件才能使用此命令:
- CREATE TABLE权限
- 一个可以使用的表空间存储区
SCHEMA.TABLE_NAME: 绝对名称 完整名称 比如说hr.employees。
CREATE TABLE emp ( id number(10) primary key, name varchar2(20), property varchar2(20) default 'SLQ');
数据库中的表的分类:
用户表:是由用户创建和维护的表的集合,这种表包含了用户维护的数据。
数据字典表:是由ORACLE SERVER创建和维护的表的集合,包含数据库信息。
- USER_XXXX 包含了当前数据库用户所拥有的对象的信息。
- ALL_XXXX 包含了当前数据库用户可以访问的所有的模式对象的信息。
- DBA_XXXX 包含了所有数据库对象信息,只有具有DBA角色的用户才嫩而过访问的这些视图
COL TABLE_NAME FOR A10
SELECT table_name FROM user_tables;
TABLE_NAME
----------
EMP
V$ 动态性能视图:反映数据库服务器的性能、内存和锁等相关的动态。
SELECT instance_name, status, startup_time FROM v$instance; INSTANCE_NAME STATUS STARTUP_TIME ---------------- ------------ ------------------- orcl OPEN 2021-05-24 21:55:43
ORACLE主要常见的数据类型
char(x):定长字符串,会用空格填充来达到其最大长度。最多可以存储2,000字节的信息。如果创建表时,不指定CHAR长度,则默认为1。
VARCHAR2(x) 变长字符串,与CHAR类型不同,它不会使用空格填充至最大长度。VARCHAR2最多可以存储4,000字节的信息。
LONG 可变长度字符串,最大大小为2GB-1。
RAW / LONG RAW: 原始二进制数据 2000bytes or 2GB 的原始二进制数据
NUMBER(P,S)是最常见的数字类型。P是Precison的英文缩写,即精度缩写,表示有效数字的位数,最多不能超过38个有效数字。S是Scale的英文缩写,可以使用的范围为-84~127。
INTEGER是NUMBER的子类型,它等同于NUMBER(38,0),用来存储整数。若插入、更新的数值有小数,则会被四舍五入。
FLOAT(n),数 n 指示位的精度,可以存储的值的数目。N 值的范围可以从 1 到 126。
BINARY_FLOAT 是 32 位、 单精度浮点数字数据类型。
BINARY_DOUBLE 是为 64 位,双精度浮点数字数据类型。
CLOB 存放较长的字符串数据 最大大小为(4GB-1)*DB_BLOCK_SIZE的参数[数据块的大小](8-128TB)
BLOB 它存储非结构化的二进制数据大对象,它可以被认为是没有字符集语义的比特流,一般是图像、声音、视频等文件。BLOB对象最多存储(4 gigabytes-1) * (database block size)的二进制数据。(8-128TB)
BFILE 二进制文件,存储在数据库外的系统文件,只读的,数据库会将该文件当二进制文件处理。
DATE:DATE是最常用的数据类型,日期数据类型存储日期和时间信息。Oracle 存储以下信息: 世纪、 年、 月、 日期、 小时、 分钟和秒。一般占用7个字节的存储空间。
TIMESTAMP 时间戳:这是一个7字节或12字节的定宽日期/时间数据类型。它与DATE数据类型不同,因为TIMESTAMP可以包含小数秒,带小数秒的TIMESTAMP在小数点右边最多可以保留9位。
TIMESTAMP WITH TIME ZONE 这是TIMESTAMP类型的变种,它包含了时区偏移量的值准
TIMESTAMP WITH LOCAL TIME ZONE 包含了时区的偏移量 不过ORACLE按用户所在本地会话时间返回数据。
INTERVAL YEAR TO MONTH 这种数据类型通过使用YEAR 和 MONTH日期时间字段存储一个时段。 默认的精度为2位数年数,如果间隔超过99年,定义字段的时候,需要INTERVAL YEAR(3) TO MONTH。
INTERVAL DAY TO SECOND 这种数据类型用于按照 日、 小时、 分、 秒存储时间段。默认的精度为2位数天数,如果间隔超过99天,定义字段的时候,需要INTERVAL YEAR(3) TO MONTH。
关于三种Timestamp数据类型的实验:
CREATE TABLE date_test ( time1 timestamp, time2 timestamp with time zone, time3 timestamp with local time zone); INSERT INTO date_test values (sysdate, sysdate, sysdate); select * from date_test; 26-MAY-21 07.43.24.000000 PM --timestamp 26-MAY-21 07.43.24.000000 PM +08:00 --timestamp with time zone 26-MAY-21 07.43.24.000000 PM --timestamp with local time zone
--timestamp与timestamp with local time zone的结果相同
关于INTERVAL YEAR TO MONTH 的实验:
CREATE TABLE emp_retire ( id number(10) primary key, hire_date date, retire_date INTERVAL YEAR TO MONTH); --插入INTERVAL为30年 INSERT INTO emp_retire VALUES (1, TO_DATE('2002-11-20', 'YYYY-MM-DD'), INTERVAL '30' YEAR); --插入INTERVAL为300月 INSERT INTO emp_retire VALUES (2, TO_DATE('2000-5-20', 'YYYY-MM-DD'), INTERVAL '300' MONTH); --插入INTERVAL为一年6个月 INSERT INTO emp_retire VALUES (3, TO_DATE('2000-1-1', 'YYYY-MM-DD'), INTERVAL '1-6' YEAR TO MONTH); --查询数据结果 ID HIRE_DATE RETIRE_DATE ---------- -------------------- -------------------- 1 2002-11-20 00:00:00 +30-00 2 2000-05-20 00:00:00 +25-00 3 2000-01-01 00:00:00 +01-06 --使用date与interval合并 SELECT 'EMPLOYEE ID' || ID || ' WILL RETIRE ON ' || TO_CHAR(hire_date + retire_date, 'YYYY-MM-DD') AS "DESC" FROM EMP_RETIRE; DESC ----------------------------------------- EMPLOYEE ID1 WILL RETIRE ON 2032-11-20 EMPLOYEE ID2 WILL RETIRE ON 2025-05-20 EMPLOYEE ID3 WILL RETIRE ON 2001-07-01
关于INTERVAL DAY TO SECOND的实验
CREATE TABLE test_time ( current_time date, time_interval INTERVAL DAY(3) TO SECOND); INSERT INTO test_time VALUES (sysdate, INTERVAL '999' DAY(3)); --超过99天,需要DAY(3) INSERT INTO test VALUES (sysdate, INTERVAL '5 5:00' DAY TO MINUTE); INSERT INTO test_time VALUES (sysdate, INTERVAL '100 12:00:00' DAY(3) TO SECOND); --查询数据 CURRENT_TIME TIME_INTERVAL -------------------- -------------------- 2021-05-26 20:21:34 +199 00:00:00.000000 2021-05-26 20:22:38 +999 00:00:00.000000 2021-05-26 20:33:23 +100 12:00:00.000000
--合并时间与INTERVAL DAY TO SECOND
SELECT (CURRENT_TIME + TIME_INTERVAL) AS "DESC" FROM test_time;
DESC
-------------------
2021-12-11 20:21:34
2024-02-19 20:22:38
2021-09-04 08:33:23
CTAS创建表 CREATE TABLE AS SELECT
CREATE TABLE T2 AS SELECT * FROM T1; ---复制表结构和表数据
CREATE TABLE T2_1 AS SELECT * FROM T1 WHERE 1 = 2; ---只复制表结构
CREATE TABLE T2_2 AS SELECT * FROM T1 WHERE 1 = 1; ---复制表结构和表数据
ALTER TABLE语句
1. 添加新列
2. 修改现有列
3 为新列定义默认值
4 删除列
ALTER TABLE (表名) ADD (列名 数据类型);
--增加两列数据 ALTER TABLE emp ADD ( age number(3), comments varchar2(200) );
ALTER TABLE (表名) MODIFY (列名 数据类型);
修改列的时候注意如下几点:
1 可以增大数字的宽度和精度
2 可以增大数字列或字符列的宽度
3 只有在列只包含空值或表没有行时才可以减少列的宽度
4 只有在列只包含空值时 才能更改数据类型
5 只有列只包含空值或没有减少列的大小时,才可以将CHAR该成VARCHAR2。或将VARCHAR2改成CHAR
6 对列的默认值的更改影响以后对表的插入操作
SQL> alter table emp modify ( id char(12)); SQL> alter table emp modify ( hire_date date default To_date('2021-05-01', 'YYYY-MM-DD'
ALTER TABLE (表名) DROP COLUMN (列名);
删除列的时候注意如下几点:
1 要删除的可以包含数据 也可以是空或者NULL
2 使用ALTER TABLE语句时 每次尽量删除一个列
3 必须至少还剩下一个列
4 列一旦被删除 就不能恢复
ALTER TABLE employees DROP COLUMN age;
SET UNUSED / DROP UNUSED COLUMNS
可以使用SET UNUSED选项讲一个或多个列标记为不适用
可以使用DROP UNUSED COLUMNS 删除标记为不可用的列
SQL> ALTER TABLE employees SET UNUSED (AGE); Table altered. SQL> ALTER TABLE employees DROP UNUSED COLUMNS; Table altered.
ALTER TABLE (当前表名) RENAME TO (新表名);
改名时注意:
1 确认符合命名规范
2 名字不能重复
3 必须是该对象的所有者
ALTER TABLE emp RENAME TO employees;
TRUNCATE TABLE语句
DDL删除表的内容的方法
1 删除表的所有内容 且不可再恢复
2 释放该表所有的存储空间 降低高水位线
TRUNCATE TABLE employees;
Table truncated.
DROP TABLE语句
DROP TABLE不是把表真正的删除了 而是把表改个名放到了回收站里。
DROP TABLE 表名 PURGE 真正的删除表,不进入回收站。
回收站内操作:
PURGE TABLE 表名 彻底清空回收站内的表
PURGE RECYCLEBIN 彻底清空回收站
--DROP TABLE + PURGE TABLE SQL> DROP TABLE test; Table dropped. SQL> PURGE TABLE test; Table purged. --DROP TABLE PURGE DROP TABLE employees PURGE; Table dropped.
COMMENT ON 给表名和列名添加备注
COMMENT ON TABLE employees IS 'This is a employee table';
COMMENT ON COLUMN employees.id IS 'This column records identity';