oracle创建和管理表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/czh500/article/details/82800960
/*

创建和管理表

*/


/*

常见的数据库对象
1.表:基本的数据存储集合,由行和列组成
2.视图:从表中抽出的逻辑上相关的数据集合
3.序列:提供有规律的数值
4.索引:提高查询的效率
5.同义词:给对象起别名

*/

--查看用户创建/定义的表
SELECT mytables.TABLE_NAME, mytables.* 
FROM User_Tables mytables
--查看用户定义的表、视图、同义词和序列
SELECT * 
FROM user_catalog
--查看用户定义的各种数据库对象
SELECT *
FROM User_Objects obj
--
SELECT DISTINCT obj.OBJECT_TYPE  
FROM User_Objects obj

/*
表名和列名的命名规则
oracle中的sql命名规则

表名和列名:
必须以字母开头
必须在 1–30 个字符之间
必须只能包含 A–Z, a–z, 0–9, _, $, 和 #
必须不能和用户定义的其他对象重名
必须不能是Oracle 的保留字

以下是举例子:
$abc 错误  从java的角度来看,正确(java中只要不以数字开头就可以)

2abc 错误  从java的角度来看,错误(java中不能以数字开头)

_abc 错误 从java的角度来看,正确(java中只要不以数字开头就可以)

a-b 错误  从java的角度来看,错误(java中不能有-中划线)

a#d 正确  从java的角度来看,错误(java中不能有#号)

*/

/*

创建表

*/

--创建表(方式1) 类似于白手起家来创建表
CREATE TABLE myemployees(
ID NUMBER(10),
NAME VARCHAR2(50),
salary NUMBER(10, 2),
hire_date DATE
)
--
SELECT *
FROM myemployees

--顺便提一下,sql中的注释
/* 这是多行注释 */
--这是单行注释

--创建表(方式2),依托于现有表来创建一张新表,不关是依托于现有表,连表中的数据也自动导入到了新表中
CREATE TABLE myemployees2
AS
SELECT emp.employee_id AS ID, emp.last_name NAME, emp.hire_date, emp.salary
FROM employees emp
--依托于现有表来创建一张新表,不关是依托于现有表,连表中的数据也自动导入到了新表中
SELECT *
FROM myemployees2

--创建表(方式2),依托于现有表来创建一张新表,不关是依托于现有表,连表中的数据也自动导入到了新表中
CREATE TABLE myemployees3
AS
SELECT emp.employee_id AS ID, emp.last_name NAME, emp.hire_date, emp.salary
FROM employees emp
--这里加了WHERE过滤条件
WHERE emp.department_id = 20
--依托于现有表来创建一张新表,不关是依托于现有表,连表中的数据也自动导入到了新表中
SELECT *
FROM myemployees3

--只想依托于现有表来创建一张新表,不想要表中的任何数据
CREATE TABLE myemployees4
AS
SELECT emp.employee_id AS ID, emp.last_name NAME, emp.hire_date, emp.salary
FROM employees emp
--这里加了WHERE过滤条件,查不到任何东西,不就达到了不要表中的任何数据的目的嘛
WHERE emp.department_id = 66666666
--
SELECT *
FROM myemployees4

--只想依托于现有表来创建一张新表,不想要表中的任何数据
CREATE TABLE myemployees5
AS
SELECT emp.employee_id AS ID, emp.last_name NAME, emp.hire_date, emp.salary
FROM employees emp
--这里加了WHERE过滤条件(888 != 888),不就达到了不要表中的任何数据的目的嘛
WHERE 888 != 888
--
SELECT *
FROM myemployees5

--只想依托于现有表来创建一张新表,不想要表中的任何数据
CREATE TABLE myemployees6
AS
SELECT emp.*
FROM employees emp
--这里加了WHERE过滤条件(888 != 888),不就达到了不要表中的任何数据的目的嘛
WHERE 10 = 20
--
SELECT *
FROM myemployees6

/*

              数据类型知识点

数据类型                     描述
VARCHAR2(size)	        可变长字符数据 (类似于java中的StringBuffer)
CHAR(size)  	          定长字符数据 (类似于java中的String)
NUMBER(p,s)  	          可变长数值数据
DATE 	                  日期型数据
LONG 	                  可变长字符数据,最大可达到2G
CLOB	                  字符数据,最大可达到4G
RAW (LONG RAW) 	        原始的二进制数据
BLOB	                  二进制数据,最大可达到4G
BFILE	                  存储外部文件的二进制数据,最大可达到4G
ROWID	                  行地址


*/


/*

修改表 alter table

*/

--增加一列
ALTER TABLE myemployees
ADD (email VARCHAR2(30))
--
SELECT * 
FROM myemployees
--修改列
ALTER TABLE myemployees
MODIFY (ID NUMBER(25)) 

--修改列(修改列的数据类型)注意:如果表中已经有数据了,也就是说表中的列中已经有数据了,你再修改列的数据类型是修改不了的
ALTER TABLE myemployees
MODIFY (ID VARCHAR2(18)) 


--修改列,并且给默认值,这里举例子,薪水默认值是2500
ALTER TABLE myemployees
MODIFY (Salary NUMBER(20, 2) DEFAULT 2500)

--删除列
ALTER TABLE myemployees
DROP COLUMN email
--
SELECT *
FROM myemployees2
--删除列(就算列中有数据也照样删除列)
ALTER TABLE myemployees2
DROP COLUMN salary
--
SELECT *
FROM myemployees2

--
SELECT *
FROM myemployees3
--给列重命名
ALTER TABLE myemployees3
RENAME 
COLUMN salary 
TO sal
--
SELECT *
FROM myemployees3

/*
--修改表名(重命名表名) 方式1
ALTER TABLE employees3 RENAME TO  myemployees3
*/
--
/*
--修改表名(重命名表名) 方式2
RENAME myemployees3 TO employees3
*/

--
SELECT *
FROM myemployees6
--刪除一列(删除一列时需要使用COLUMN关键字)
ALTER TABLE myemployees6
DROP COLUMN department_id
-- 一次性删除多列(对比2种语法可以看出,删除一列时需要使用COLUMN关键字,而删除多列时则不需要)
ALTER TABLE myemployees6 
DROP (email, job_id, commission_pct)

-- 一次性删除多列(也可以利用这种语法就只删除一列),如下例子
ALTER TABLE myemployees6 
DROP (first_name)
--

/*
删除表 drop table (表结构和表中的数据都会被删除,彻底删除)

*/
--删除表(也可以在pl/sql中的图形化界面上删除)
DROP TABLE myemployees2
--
/*
SELECT * 
FROM myemployees2
*/

/*
清空表
*/
--myemployees3表中有数据
SELECT * 
FROM myemployees3
--清空表(TRUNCATE关键字表示表结构不变,只是清空表中的数据) 注意:TRUNCATE是不可回滚的,但是delete可以回滚
TRUNCATE TABLE myemployees3
--
CREATE TABLE myemployees7
AS 
SELECT * 
FROM employees
WHERE 'aaa' != 'aaa'
--
SELECT * 
FROM myemployees7
--清空myemployees7表中的数据
TRUNCATE TABLE myemployees7
--把employees表中部门编号是80号部门的数据复制到myemployees7表中
INSERT INTO myemployees7 
SELECT * 
FROM employees 
WHERE employees.department_id = 80
--
SELECT * 
FROM myemployees7

/*

改变对象的名称

*/

--修改表名
RENAME myemployees6 TO employees6

/*
创建和管理表总结

语句	                                描述
CREATE TABLE 	                      创建表
ALTER TABLE 	                      修改表结构 
DROP TABLE 	                        删除表
RENAME  TO  	                      重命名表
TRUNCATE TABLE 	                    删除表中的所有数据,并释放存储空间

特别注意:以上这些DDL的命令,操作完,皆不可回滚!

*/

/*
创建和管理表的练习题
*/
--创建表mydept
CREATE TABLE mydept(
ID NUMBER(7),
NAME Varchar2(25)
)
--
SELECT *
FROM mydept
--将表departments中的数据插入到新表mydept2中
CREATE TABLE mydept2
AS
SELECT * 
FROM departments
--
SELECT *
FROM mydept2
--创建emp10
CREATE TABLE emp10(
ID NUMBER(7),
first_name VARCHAR2(25),
last_name VARCHAR2(25),
dept_id NUMBER(7)
)
--
SELECT *
FROM emp10
--修改列last_name,长度改为50
ALTER TABLE emp10
MODIFY (last_name VARCHAR2(50))
--根据表employees创建employees2
CREATE TABLE employees2
AS
SELECT * 
FROM employees
--
SELECT * 
FROM employees2
--删除表emp10
DROP TABLE emp10
--将表employees2重命名为emp2 (注意语法:RENAME后面没有TABLE关键字,直接就是RENAME 原表名 TO 新表名)
RENAME employees2 TO emp2
--
SELECT *
FROM emp2
--在emp2中添加一个新列test_column
ALTER TABLE emp2
ADD (test_column NUMBER(10))
--在emp2中一次性添加多个新列
ALTER TABLE emp2
ADD (
test_a VARCHAR2(30),
test_b NUMBER(10, 2),
test_c DATE,
test_d VARCHAR2(18)
)
--
SELECT * 
FROM emp2

--将emp2表中的test_column列设置成不可用,然后再删除
ALTER TABLE emp2
--将列test_column设置成不可用
SET UNUSED COLUMN test_column

--将多列设置成不可用
ALTER TABLE emp2
SET UNUSED(test_a, test_b)
--
SELECT * 
FROM emp2
--删除不可用的列
ALTER TABLE emp2
DROP 
UNUSED COLUMNS
--
SELECT * 
FROM emp2
--直接删除emp2表中的列test_c
ALTER TABLE emp2
DROP COLUMN test_c

/*

创建和管理表

*/


/*

常见的数据库对象
1.表:基本的数据存储集合,由行和列组成
2.视图:从表中抽出的逻辑上相关的数据集合
3.序列:提供有规律的数值
4.索引:提高查询的效率
5.同义词:给对象起别名

*/

--查看用户创建/定义的表
SELECT mytables.TABLE_NAME, mytables.*
FROM User_Tables mytables
--查看用户定义的表、视图、同义词和序列
SELECT *
FROM user_catalog
--查看用户定义的各种数据库对象
SELECT *
FROM User_Objects obj
--
SELECT DISTINCT obj.OBJECT_TYPE  
FROM User_Objects obj

/*
表名和列名的命名规则
oracle中的sql命名规则

表名和列名:
必须以字母开头
必须在 1–30 个字符之间
必须只能包含 A–Z, a–z, 0–9, _, $, 和 #
必须不能和用户定义的其他对象重名
必须不能是Oracle 的保留字

以下是举例子:
$abc 错误  从java的角度来看,正确(java中只要不以数字开头就可以)

2abc 错误  从java的角度来看,错误(java中不能以数字开头)

_abc 错误 从java的角度来看,正确(java中只要不以数字开头就可以)

a-b 错误  从java的角度来看,错误(java中不能有-中划线)

a#d 正确  从java的角度来看,错误(java中不能有#号)

*/

/*

创建表

*/

--创建表(方式1) 类似于白手起家来创建表
CREATE TABLE myemployees(
ID NUMBER(10),
NAME VARCHAR2(50),
salary NUMBER(10, 2),
hire_date DATE
)
--
SELECT *
FROM myemployees

--顺便提一下,sql中的注释
/* 这是多行注释 */
--这是单行注释

--创建表(方式2),依托于现有表来创建一张新表,不关是依托于现有表,连表中的数据也自动导入到了新表中
CREATE TABLE myemployees2
AS
SELECT emp.employee_id AS ID, emp.last_name NAME, emp.hire_date, emp.salary
FROM employees emp
--依托于现有表来创建一张新表,不关是依托于现有表,连表中的数据也自动导入到了新表中
SELECT *
FROM myemployees2

--创建表(方式2),依托于现有表来创建一张新表,不关是依托于现有表,连表中的数据也自动导入到了新表中
CREATE TABLE myemployees3
AS
SELECT emp.employee_id AS ID, emp.last_name NAME, emp.hire_date, emp.salary
FROM employees emp
--这里加了WHERE过滤条件
WHERE emp.department_id = 20
--依托于现有表来创建一张新表,不关是依托于现有表,连表中的数据也自动导入到了新表中
SELECT *
FROM myemployees3

--只想依托于现有表来创建一张新表,不想要表中的任何数据
CREATE TABLE myemployees4
AS
SELECT emp.employee_id AS ID, emp.last_name NAME, emp.hire_date, emp.salary
FROM employees emp
--这里加了WHERE过滤条件,查不到任何东西,不就达到了不要表中的任何数据的目的嘛
WHERE emp.department_id = 66666666
--
SELECT *
FROM myemployees4

--只想依托于现有表来创建一张新表,不想要表中的任何数据
CREATE TABLE myemployees5
AS
SELECT emp.employee_id AS ID, emp.last_name NAME, emp.hire_date, emp.salary
FROM employees emp
--这里加了WHERE过滤条件(888 != 888),不就达到了不要表中的任何数据的目的嘛
WHERE 888 != 888
--
SELECT *
FROM myemployees5

--只想依托于现有表来创建一张新表,不想要表中的任何数据
CREATE TABLE myemployees6
AS
SELECT emp.*
FROM employees emp
--这里加了WHERE过滤条件(888 != 888),不就达到了不要表中的任何数据的目的嘛
WHERE 10 = 20
--
SELECT *
FROM myemployees6

/*

              数据类型知识点

数据类型                     描述
VARCHAR2(size)            可变长字符数据 (类似于java中的StringBuffer)
CHAR(size)                定长字符数据 (类似于java中的String)
NUMBER(p,s)                可变长数值数据
DATE                       日期型数据
LONG                       可变长字符数据,最大可达到2G
CLOB                      字符数据,最大可达到4G
RAW (LONG RAW)             原始的二进制数据
BLOB                      二进制数据,最大可达到4G
BFILE                      存储外部文件的二进制数据,最大可达到4G
ROWID                      行地址


*/


/*

修改表 alter table

*/

--增加一列
ALTER TABLE myemployees
ADD (email VARCHAR2(30))
--
SELECT *
FROM myemployees
--修改列
ALTER TABLE myemployees
MODIFY (ID NUMBER(25))

--修改列(修改列的数据类型)注意:如果表中已经有数据了,也就是说表中的列中已经有数据了,你再修改列的数据类型是修改不了的
ALTER TABLE myemployees
MODIFY (ID VARCHAR2(18))


--修改列,并且给默认值,这里举例子,薪水默认值是2500
ALTER TABLE myemployees
MODIFY (Salary NUMBER(20, 2) DEFAULT 2500)

--删除列
ALTER TABLE myemployees
DROP COLUMN email
--
SELECT *
FROM myemployees2
--删除列(就算列中有数据也照样删除列)
ALTER TABLE myemployees2
DROP COLUMN salary
--
SELECT *
FROM myemployees2

--
SELECT *
FROM myemployees3
--给列重命名
ALTER TABLE myemployees3
RENAME
COLUMN salary
TO sal
--
SELECT *
FROM myemployees3

/*
--修改表名(重命名表名) 方式1
ALTER TABLE employees3 RENAME TO  myemployees3
*/
--
/*
--修改表名(重命名表名) 方式2
RENAME myemployees3 TO employees3
*/

--
SELECT *
FROM myemployees6
--刪除一列(删除一列时需要使用COLUMN关键字)
ALTER TABLE myemployees6
DROP COLUMN department_id
-- 一次性删除多列(对比2种语法可以看出,删除一列时需要使用COLUMN关键字,而删除多列时则不需要)
ALTER TABLE myemployees6
DROP (email, job_id, commission_pct)

-- 一次性删除多列(也可以利用这种语法就只删除一列),如下例子
ALTER TABLE myemployees6
DROP (first_name)
--

/*
删除表 drop table (表结构和表中的数据都会被删除,彻底删除)

*/
--删除表(也可以在pl/sql中的图形化界面上删除)
DROP TABLE myemployees2
--
/*
SELECT *
FROM myemployees2
*/

/*
清空表
*/
--myemployees3表中有数据
SELECT *
FROM myemployees3
--清空表(TRUNCATE关键字表示表结构不变,只是清空表中的数据) 注意:TRUNCATE是不可回滚的,但是delete可以回滚
TRUNCATE TABLE myemployees3
--
CREATE TABLE myemployees7
AS
SELECT *
FROM employees
WHERE 'aaa' != 'aaa'
--
SELECT *
FROM myemployees7
--清空myemployees7表中的数据
TRUNCATE TABLE myemployees7
--把employees表中部门编号是80号部门的数据复制到myemployees7表中
INSERT INTO myemployees7
SELECT *
FROM employees
WHERE employees.department_id = 80
--
SELECT *
FROM myemployees7

/*

改变对象的名称

*/

--修改表名
RENAME myemployees6 TO employees6

/*
创建和管理表总结

语句                                    描述
CREATE TABLE                           创建表
ALTER TABLE                           修改表结构
DROP TABLE                             删除表
RENAME  TO                            重命名表
TRUNCATE TABLE                         删除表中的所有数据,并释放存储空间

特别注意:以上这些DDL的命令,操作完,皆不可回滚!

*/

/*
创建和管理表的练习题
*/
--创建表mydept
CREATE TABLE mydept(
ID NUMBER(7),
NAME Varchar2(25)
)
--
SELECT *
FROM mydept
--将表departments中的数据插入到新表mydept2中
CREATE TABLE mydept2
AS
SELECT *
FROM departments
--
SELECT *
FROM mydept2
--创建emp10
CREATE TABLE emp10(
ID NUMBER(7),
first_name VARCHAR2(25),
last_name VARCHAR2(25),
dept_id NUMBER(7)
)
--
SELECT *
FROM emp10
--修改列last_name,长度改为50
ALTER TABLE emp10
MODIFY (last_name VARCHAR2(50))
--根据表employees创建employees2
CREATE TABLE employees2
AS
SELECT *
FROM employees
--
SELECT *
FROM employees2
--删除表emp10
DROP TABLE emp10
--将表employees2重命名为emp2 (注意语法:RENAME后面没有TABLE关键字,直接就是RENAME 原表名 TO 新表名)
RENAME employees2 TO emp2
--
SELECT *
FROM emp2
--在emp2中添加一个新列test_column
ALTER TABLE emp2
ADD (test_column NUMBER(10))
--在emp2中一次性添加多个新列
ALTER TABLE emp2
ADD (
test_a VARCHAR2(30),
test_b NUMBER(10, 2),
test_c DATE,
test_d VARCHAR2(18)
)
--
SELECT *
FROM emp2

--将emp2表中的test_column列设置成不可用,然后再删除
ALTER TABLE emp2
--将列test_column设置成不可用
SET UNUSED COLUMN test_column

--将多列设置成不可用
ALTER TABLE emp2
SET UNUSED(test_a, test_b)
--
SELECT *
FROM emp2
--删除不可用的列
ALTER TABLE emp2
DROP
UNUSED COLUMNS
--
SELECT *
FROM emp2
--直接删除emp2表中的列test_c
ALTER TABLE emp2
DROP COLUMN test_c

猜你喜欢

转载自blog.csdn.net/czh500/article/details/82800960