ORACLE数据库 —— SQL知识点1

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 to

    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;

你可能感兴趣的:(ORACLE,数据库,sql,oracle)