oracle基础
oracle单行函数
oracle多表查询
oracle分组函数
oracle子查询
oracle创建表和管理表
-- 常见的数据库对象
/*
表 基本的数据存储集合,由行和列组成
视图 从表中抽出的逻辑上相关的数据集合
序列 提供有规律的数值
索引 提高查询的效率
同义词 给对象起别名
*/
-- 查询用户创建的表
SELECT * FROM user_tables;
-- 查询用户自己的数据库对象
SELECT * FROM user_catalog;
-- 查询用户自己定义的数据库对象
SELECT DISTINCT object_type FROM user_objects;
-- 表和列命名规则 --
/*
1.必须以字母开头
2.必须在1-30个字符之间
3.只能包含 A-Z a-z 0-9 _ $ #
4.不能重名
5.不能是Oracle关键字
*/
-- 数据类型 --
/*
加*为常用数据类型
VARCHAR2(size)* 可变字符数据
CHAR(size)* 定长字符数据
NUMBER(p,s)* 可变长数值数据
DATE* 日期型数据
LONG 可变长字符数据,最大可达到2G
CLOB 字符数据,最大可达到4G
RAW(LONG RAW) 原始的二进制数据
BLOB* 二进制数据,最大可达到4G
BFILE 存储外部文件的二进制数据,最大可达到4G
ROWID 行地址
*/
-- 创建表 CREATE TABLE ... 建表之前看看有没有建表权限,我用scott用户有该权限
-- ok
-- 方式1
CREATE TABLE emp1(
id NUMBER(10), --最大10个9
name VARCHAR2(20), --20个字符
salary NUMBER(10,2), --小数点保留2位
hire_date DATE --日期类型不用指定大小
);
SELECT * FROM user_tables WHERE LOWER(TABLE_NAME) = 'emp1'
-- 方式2(类似复制表)
-- ok
CREATE TABLE emp2
AS
SELECT EMPLOYEE_ID id ,LAST_NAME name,HIRE_DATE,SALARY
FROM EMPLOYEES
SELECT * FROM user_tables WHERE LOWER(TABLE_NAME) = 'emp2'
-- 表头和数据都复制过来了
SELECT * FROM emp2;
/*
ALTER TABLE
1.追加新的列
2.修改现有的列
3.为新追加的列定义默认值
4.删除一个列
5.重命名表得一个列名
*/
-- 为emp1表新增一列
-- ok
ALTER TABLE emp1
ADD(email VARCHAR2(20))
SELECT * from emp1;
-- 为emp1表id列 修改成15长度
ALTER TABLE emp1
MODIFY(id NUMBER(15))
--navicate,desc用不了,plsql可以
-- 为emp1表salary默认值改为2000
ALTER TABLE emp1
MODIFY(SALARY NUMBER(20,2) DEFAULT 2000)
-- 为emp2表name列修改成number类型
SELECT * FROM emp2
-- column to be modified must be empty to change datatype 必须是空的列才可以修改数据类型
ALTER TABLE emp2
MODIFY(name NUMBER(20))
-- 删除emp1的email列
-- ok
ALTER TABLE emp1
DROP COLUMN email;
-- 重命名emp1表 列salary重命名为sal
ALTER TABLE emp1
RENAME COLUMN SALARY to sal
-- 删表(谨慎使用)
-- 删除emp1这个空表
DROP TABLE emp1;
-- 清空数据,开发测试的时候比较常用
truncate TABLE emp2;
SELECT * FROM emp2;
-- 只要update delete INSERT 这种sql操作才可以回滚。
rollback;
-- 练习
-- 51. 利用子查询创建表 myemp,
-- 1)该表中包含 employees 表的 employee_id(id), last_name(name), salary(sal), email 字段
CREATE TABLE myemp
AS
SELECT EMPLOYEE_ID id,LAST_NAME name,SALARY sal,EMAIL
FROM EMPLOYEES
SELECT * from myemp
-- 2). 创建表的同时不包含 employees 中的记录, 即创建一个空表
CREATE TABLE myemp2
AS
SELECT EMPLOYEE_ID id,LAST_NAME name,SALARY sal,EMAIL
FROM EMPLOYEES WHERE 1=2 --注入攻击
SELECT * from myemp2
-- 52. 对现有的表进行修改操作
-- 1). 添加一个新列
ALTER TABLE myemp
add(HIRE_DATE DATE DEFAULT SYSDATE)
SELECT * from myemp
-- 3). 修改现有列的名字
ALTER TABLE myemp
RENAME COLUMN tdate to create_date
-- 4). 删除现有的列
ALTER TABLE myemp
DROP COLUMN create_date
-- 53. 清空表(截断: truncate), 不能回滚!!
truncate TABLE myemp;
-- 54.
--
-- 1). 创建一个表, 该表和 employees 有相同的表结构, 但为空表:
CREATE TABLE myemp3
AS
SELECT * FROM EMPLOYEES WHERE 1<>1
SELECT * FROM myemp3
-- 2)把 employees 表中 80 号部门的所有数据复制到 emp2 表中:
SELECT * FROM emp2;
-- 用*号可能出现 too many values ,因为 emp2与 EMPLOYEES表列数据不匹配
INSERT INTO emp2 SELECT EMPLOYEE_ID id,LAST_NAME name,HIRE_DATE,SALARY FROM EMPLOYEES WHERE DEPARTMENT_ID = 80
/*
1. 创建表dept1
name Null? type
id Number(7)
name Varchar2(25)
*/
CREATE TABLE dept1(
id NUMBER(7),
name VARCHAR2(25)
)
SELECT * FROM dept1;
-- 2. 将表departments中的数据插入新表dept2中
CREATE TABLE dept2
AS
SELECT * FROM DEPARTMENTS
SELECT * FROM dept2;
/*
3. 创建表emp5
name Null? type
id Number(7)
First_name Varchar2(25)
Last_name Varchar2(25)
Dept_id Number(7)
*/
CREATE TABLE emp5(
id NUMBER(7),
FIRST_NAME VARCHAR2(25),
LAST_NAME VARCHAR2(25),
dept_id NUMBER(7)
)
--4. 将列Last_name的长度增加到50
ALTER TABLE emp5
MODIFY(LAST_NAME VARCHAR2(50))
-- 5. 根据表employees创建employees2
CREATE TABLE EMPLOYEES2
AS
SELECT * FROM EMPLOYEES
SELECT * FROM EMPLOYEES2
-- 6. 删除表emp5
SELECT * FROM emp5;
DROP TABLE emp5;
-- 7. 将表employees2重命名为emp5
RENAME EMPLOYEES2 to emp5
-- 8. 在表dept和emp5中添加新列test_column,并检查所作的操作
SELECT * FROM dept;
SELECT * FROM emp5;
ALTER TABLE dept
add(test_column VARCHAR2(20))
ALTER TABLE emp5
add(test_column VARCHAR2(20))
--desc dept
-- 9. 在表dept和emp5中将列test_column设置成不可用,之后删除
-- ok
ALTER TABLE DEPT
set unused COLUMN test_column
-- ok
ALTER TABLE DEPT
DROP unused COLUMN
-- ok
ALTER TABLE emp5
set unused COLUMN test_column
-- ok
ALTER TABLE emp5
DROP unused COLUMN
SELECT * FROM dept;
SELECT * FROM emp5;
-- 10. 直接删除表emp5中的列 dept_id
--ok
ALTER TABLE EMP5
add(dept_id NUMBER(20))
--ok
ALTER TABLE EMP5
DROP COLUMN dept_id
SELECT * FROM emp5;