ORACLE数据库 SQL语句基础知识点1 适合有SQL基础的人群。 禁止转载!
SQL语句创建表空间
永久表空间:CREATE TABLESPACE
大文件表空间:CREATE BIGFILE TABLESPACE
临时表空间:CREATE TEMPORARY TABLESPACE
撤销表空间:CREATE UNDO TABLESPACE
创建(永久)表空间:
1. uniform 区分配:
CREATE TABLESPACE 表空间名
DATAFILE 'C:\app\Administrator\oradata\mldn\pioneeruserts01_1.dbf'
SIZE 10M
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 128K;
2. 使用AUTOALLOCATE 区分配方式:
CREATE TABLESPACE 表空间名
DATAFILE 'C:\app\Administrator\oradata\mldn\pioneeruserts02_1.dbf'
SIZE 2M
AUTOALLOCATE;
3. 使用AUTO 段管理方式:
CREATE TABLESPACE 表空间名
DATAFILE 'C:\app\Administrator\oradata\mldn\pioneeruserts02_1.dbf'
SIZE 2M
UNIFORM SIZE 128K
SEGMENT SPACE MANAGEMENT AUTO;
创建大文件表空间:
CREATE BIGFILE TABLESPACE 表空间名:
DATAFILE 'c:\app\Administrator\oradata\mldn\pioneerbigts05_1.dbf '
SIZE 2M
创建临时表空间:
1.临时表空间:
CREATE TEMPORARY TABLESPACE 表空间名:
TEMPFILE 'c:\app\Administrator\oradata\mldn\pioneertmpts01_1.dbf '
SIZE 4M
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 1K;
2.大文件临时表空间:
CREATE BIGFILE TEMPORARY TABLESPACE 表空间名
TEMPFILE 'c:\app\Administrator\oradata\mldn\pioneerbigtmpts01_1.dbf'
SIZE 4M
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 1K;
创建撤销表空间:
CREATE UNDO TABLESPACE 表空间名
DATAFILE 'c:\app\Administrator\oradata\mldn\pioneerbigts01_1.dbf '
SIZE 4M;
SQL语句表空间维护(ALTER TABLESPACE)
改变表空间的状态
1.查看表空间的状态
SELECT tablespace_name,status FROM dba_tablespaces;
2.修改表空间的状态
1)使表空间联机或脱机
ALTER TABLESPACE tablespacename {online|offline [normal|temporary|immediate|for recover]}
eg1.ALTER TABLESPACE pioneeruserts02 offline normal;
eg2.ALTER TABLESPACE pioneeruserts02 online;
2)使表空间只读或可读写
ALTER TABLESPACE tablespacename READ ONLY;
ALTER TABLESPACE tablespacename READ WRITE;
3.修改表空间的名称
ALTER TABLESPACE 表空间名 rename to 新的表空间名
4.设置默认用户表空间
ALTER DATABASE DEFAULT TABLESPACE pioneeruserts01;
5.设置默认临时表空间
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE pioneeruserts01;
6.找到数据库的默认永久表空间和临时表空间 - DATABASE_PROPERTIES
SELECT property_name,property_value
FROM database_properties
WHERE property_name LIKE 'DEFAULT%';
监控表空间的使用
每个表空间的总的大小 - dba_data_files
SELECT tablespace_name,sum(bytes)/1024/1024 total_MB
FROM dba_data_files
GROUP BY tablespace_name;
扩展表空间
1.指定现有数据文件自动扩展
ALTER {DATABASE|TABLESPACE}
DATAFILE 'C:\app\Administrator\oradata\mldn\PIONEERUSERTS01_1.DBF'
AUTOEXTEND ON NEXT 1M MAXSIZE 20M;
2.改变现有数据文件大小
ALTER {DATABASE|TABLESPACE}
DATAFILE 'C:\app\Administrator\oradata\mldn\PIONEERUSERTS02_1.DBF'
RESIZE 10M;
3.添加新数据文件
ALTER TABLESPAE 表空间名
ADD DATAFILE 'c:\app\Administrator\oradata\mldn\pioneeruserts01_2.dbf'
SIZE 3M;
删除表空间
DROP TABLESPACE 表空间名
[ INCLUDING CONTENTS ] (包含有数据库对象)
[ INCLUDING CONTENTS AND DATAFILES; ] (以及与它相关的数据文件)
查询DBA_TABLESPACE视图
SELECT * FROM DBA_TABLESPACE
使用CREATE TABLE语句创建标准表
CREATE TABLE scott.employee(
empid number(5),
ename varchar2(15),
job varchar2(10)
);
使用CREATE TABLE语句创建全局临时表
CREATE GOLBAL TEMPORARY TABLE scott.emptemp1(
id number(6),
name varchar2(20)
);
CREATE GOLBAL TEMPORARY TABLE scott.emptemp1(
id number(6),
name varchar2(20)
);
ON COMMIT PRESERVE ROWS; //提交事务
通过查询从一个表创建另一个表
CREATE TABLE scott.newemp AS
SELECT empno,ename,sal FROM scott.emp WHERE deptno = 10;
DUAL表
查询当前日期
SELECT sysdate FROM DUAL
计算公式值
SELECT (3+7)/4 FROM DUAL
删除表
DROP TABLE table_name [CASCADE CONSTRAINTS] [PURGE];
删除外键CASCADE 清空回收站PURGE
闪回技术
FLASH BACK TABLE scott.newemp TO BEFORE DROP;
对表进行操作(ALTER TABLE)
增加新列
ALTER TABLE scott.newemp //先选中表
ADD (age number(3) DEFAULT 18); //添加操作
修改已有列的属性
ALTER TABLE scott.newemp //先选中表
MODIFY (ename varchar2(30) DEFAULT 'noname') //修改操作
删除列
1. 全部删除
ALTER TABLE scott.newemp //先选中表
DROP (age, hiredate)
cascade constraints;
2. 部分删除
ALTER TABLE scott.newemp //先选中表
SET UNUSED (sex,sal) //使用set unused使选中的列失效
cascade constraints;
ALTER TABLE scott.newemp
DROP UNUSED columns; //删除失效的列
重命名表
ALTER TABLE scott.emp RENAME TO emp_new1;
清空表
1. DELETE FROM scott.newemp; % 可以rollback回滚
2. TRUNCATE TABLE scott.newemp; % 不可以回滚
查看表结构信息
DESC[RIBE] 表名
USER_TABLES中是所有用户定义的表信息;
USER_TAB_COLUMNS中是用户表的所有列信息;
dba_objects 查看段的有关信息
SQL语言数据维护
插入数据
1.不使用列的列表插入数据
INSERT INTO newdept VALUES (50,'培训部','深圳');
2.使用列的列表插入数据
INSERT INTO newemp (empno,ename,job,hiredate)
VALUES (1002,'zhd','clerk','29-5月-07');
3.使用特殊格式插入日期数据
INSERT INTO newemp (empno ,ename, job, hiredate)
VALUES (1002, '邓亚萍','clerk','29-5月-07');
INSERT INTO newemp (empno,ename,job,hiredate)
VALUES(1002,'邓亚萍','clerk',to_date('2007-05-29','YYYY-MM-DD'));
4.如何处理空值(NULL)问题
1. 在values子句中使用关键字NULL来向表插入一条含有空值的记录。
INSERT INTO newemp(empno,ename,job,sal) VALUES(1005,'杨华',null,1500);
2. 在vulues子句中使用空串(’’)来向表插入一条含有空值的记录。
INSERT INTO newemp(empno,ename,job,sal) Values (1006,'张华', ' ',1500);
3.不列出要插入NULL的列的方法向表中输入一条含有空值的记录。
INSERT INTO newemp(empno,ename,sal) Values (1007,'王华',1500);
5. 如何利用子查询向已存在表中插入数据(复制数据) ------可以一次插入多行数据 不能使用values关键字
INSERT INTO 表名(字段列表)
SELECT (字段名1, 字段名2, ...) FROM 另外的表名;
INSERT INTO sales (code,name,salary,commision)
SELECT empno,ename,sal,comm From newemp WHERE job LIKE 'SALE%';
6. 插入时使用变量输入数据
INSERT INTO newemp(empno,ename,job,hiredate)
VALUES(&id,'&ename','&job','&hiredate');
SAVE c:\insert; % 存为脚本文件
EDIT c:\insert; % 编辑脚本文件
START c:\insert; %运行脚本文件 或者用@
修改数据
UPDATE 表名
SET 字段名1=表达式1, 字段名2=表达式2, ...
WHERE 条件;
1.修改张华(编号为1006)的工资为3000,部门号改为50,的雇佣日期改成当前系统日期。
UPDATE newemp
SET sal = 3000, deptno = 50, hiredate = sysdate
WHERE empno = 1006;
2. 雇佣日期修改
UPDATE newemp
SET hiredate=to_date('2007/05/28 ', 'yyyy/mm/dd')
Where empno=1006;
3.为所有雇员增加114514元工资。
UPDATE newemp
SET sal = sal+114514;
基于另一个表来修改数据
4.将文员中薪水低于2级最低工资的员工的薪水提高到JAMES的薪水
UPDATE newemp
SET sal = (SELECT sal FROM emp WHERE ename = 'JAMES')
WHERE sal < (select losal from newsalgrade where grade = 2);
利用多列子查询来修改数据
5.将所有的文员的职位改为销售员。并且将他们的工资提高到销售员的最低工资
(已知销售员中编号为7521的员工工资最低)
UPDATE newemp(job,sal)
SET (job,sal) = (SELECT job,sal FROM emp WHERE empno=7521)
WHERE job = 'CLERK';
删除数据
1.删除表newemp或视图的所有行。
DELETE FROM newemp;
2.删除雇员编号为1001的新插入的雇员。
DELETE FROM newemp WHERE empno = 1001;
3.删除薪水高于2500元的经理信息和薪水高于1300元的销售员信息
DELETE FROM newemp
WHERE (job = 'manage' and sal>2500)
OR (job = 'salesman' and sal>1300);
基于另一个表来删除行
4.删除SALES部门的所有雇员
DELETE FROM newemp
WHERE deptno = (SELECT deptno FROM dept WHERE dname = 'SALES');
5.添加主键、外键
CREATE TALBE scott.employee(
empid number(5),
ename varchar2(15) ,
deptno number(2) NOT NULL,
CONSTRAINT pk_employee_empid PRIMARY KEY(empid),
CONSTRAINT fk_employee_deptno FOREIGN KEY(deptno) REFERENCES scott.newdept(deptno)
);
6.为表employee中ename添加一个惟一性约束
ALTER TABLE employee ADD UNIQUE(ename);
或者 ALTER TABLE employee ADD CONSTRAINT uq_ename UNIQUE(ename);
7.为表employee中age 添加一个NOT NULL约束
ALTER TABLE employee MODIFY ename NOT NULL; % 注:此处为modify非add
8.删除employee表中ename列上的UNIQUE约束
ALTER TABLE employee DROP UNIQUE(ename);
或 ALTER TABLE employee DROP CONSTRAINT uq_employee_ename;
索引
建立B*树索引语法:
CREATE [UNIQUE] INDEX [schem.]index_name ON
( [schem.] )table_name
( Column1 [ASC|DESC] [,Column2 [ASC|DESC] ] … )
[TABLESPACE tablespace_name]
1.对emp表中的ename列建立索引
CREATE INDEX scott.ename_index ON
scott.emp(ename);
2.使用UNIQUE选项对上述ename列建立惟一性索引
CREATE UNIQUE INDEX scott.ename_index ON
scott.emp(ename);
3.在emp表中对列job,hiredate,建立组合索引
CREATE INDEX scott.job_hiredate_index ON
scott.emp(job,hiredate);
建立位图索引:
CREATE BITMAP INDEX [schem.]index_name ON
( [schem.])table_name
( Column_name1, Column_name, …)
[TABLESPACE tablespace_name]
1.对emp表中的job列建立位图索引
CREATE BITMAP INDEX scott.job_index ON
scott.emp(job);
索引的维护
1.索引重命名
ALTER INDEX old_index_name RENAME TO new_index_name
2. 重建索引
ALTER INDEX index_name REBUILD
3. 删除索引
DROP INDEX index_name
视图
创建视图的语法:
CREATE [OR REPLACE] VIEW [schema.]view_name
AS SELECT_statement
[WITH CHECK OPTION [CONSTRAINT constraint_name]]
[WITH READ ONLY [CONSTRAINT constraint_name]]
1.对emp表中的部门标号为20的员工工资信息建立一个视图。
CREATE OR REPLACE VIEW scott.v_newemp_dept20 // 声明创建view
AS
SELECT empno,empname,sal FROM scott.newemp WHERE deptno = 20; //view的内容
2.更新简单视图
rename
3.删除视图
DROP VIEW view_name;
4.创建复杂视图(多个表中导出的视图)
对emp表中的部门标号为20的员工个人信息工作地点信息建立一个视图。
CREATE VIEW v_newemp_empjob_dept20 //声明view
AS SELECT empno,ename,sal,comm,e.deptno,d.loc //view的内容
FROM scott.emp e, scott.dept d
WHERE d.deptno = 20 and e.edptno = d.deptno;
同义词:
1.授权
GRANT CREATE SYNONYM TO SCOTT;
2.为newemp表创建别名sy_newemp
CREATE OR REPLACE SYNONYM sy_newemp FOR newemp; //同义词默认是私有的,没有PRIVATE SYNONYM。
3.为SCOTT用户的emp表建立公有同义词sy_public_newemp
CREATE OR REPLACE PUBLIC SYNONYM sy_public_newemp FOR SCOTT.newemp;
4.删除同义词
在SCOTT用户下删除私有同义词sy_newemp:
DROP SYNONYM sy_newemp;
在sys用户下删除同义词sy_public_newemp:
DROP PUBLIC SYNONYM sy_public_newemp;
序列
创建序列
CREATE SEQUENCE seq_name
INCREMENT BY integer
START WITH integer
[MAXVALUE integer | NOMAXVALUE]
[MINVALUE integer| NOMINVALUE]
[CYCLE|NOCYCLE]
[CACHE|NOCACHE]
[ORDER|NOORDER]
1.创建一个序列my_seq
CREATE SEQUENCEC my_seq
INCREMENT BY 1
START WITH 1000
MAXVALUE 1100
CYCLE;
2.用伪列NEXTVAL和CURRVAL来访问序列号的整数。
在scott用户创建一个表test,包含id和name列,
利用INSERT语句插入新值,利用UPDATE语句更新值。
CREATE TABLE test(id number(4),name varchar2(20));
INSERT INTO test VALUES(my_seq.nextval, 'Hello');
INSERT INTO test VALUES(my_seq.currval, 'zhangsan');\
UPDATE test set id=my_seq.nextval WHERE name='zhangsan';
3.删除序列
DROP SEQUENCE my_seq;