/*
创建和管理表
*/
/*
常见的数据库对象
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