你的位置:首页 > 数据库

[数据库]Oracle数据库之SQL基础(一)


主要内容:用户与表空间;表与约束;查询语句。

一、概述

 Oracle安装:访问官网,下载

二、用户与表空间 

在安装Oracle时在开始菜单里可以用sql puls登录oracle。

★1、系统用户

  • syssystem (sys的权限要大于system,sys只能以系统管理员sysdba登录,system可以直接登录)
  • sysman (用于企业管理,也是管理员级别的用户)
  • scott (密码默认密码为tiger)

在sys,system,sysman,scott四个用户权限中,scott用户最低。

在安装Oracle时,前三个用户的密码是由你自己设置的,在设置时一般设置的是统一的密码。

★2、用户登录

登录方式:(sql语句中不区分大小写)

方法一:[username/password] [@server] [as sysdba|sysoper]
方法二:connnect username/password @server as sysdba|sysoper
例如:使用system用户登录
system/root @orcl sa sysdba
orcl就是自己设置的服务名(注意:如果数据库和服务器不在同一个机器上,就需要输入服务名或者IP地址)

 ★3、查看登录用户

  • 查看当前用户:show user;(不属于SQL语句的范畴,可以不加分号)
  • 通过数据字典查看用户信息:dba_users数据字典 -- 是数据库提供的表, 用于查看数据库的信息。查看数据字典:desc dba_users(不属于SQL语句的范畴,可以不加分号)
  • 查看用户:select username from dba_users;(注意, 使用sql语句时必须在结尾添加";")

★4、启用Scott用户 (oracle默认用户,锁定的)

  • 启用用户的语句:alter user username account unlock/lock;
    如:alter user scott account unlock;(这里解锁)
  • 使用scott用户登录SQL Plus:
    如:connect scott/tiger

★5、表空间概述

  • 表空间与数据库之间的关系:

  表空间是数据库的逻辑处理空间;可以把表空间理解为在数据库中开辟的一个空间用于存放数据库的对象;一个数据库可以有多个表空间构成;并且oracle的很多优化是基于表空间实现的。

  • 表空间与数据文件的关系:

  表空间是由一个和多个数据文件构成的;(数据文件的位置和大小可以由用户自己来定义)

我们需要知道我们存储的表、数据库、数据库当中的一些其他的对象都是存放在表空间的数据文件里面的。

  • 表空间分类:

  表空间分为 永久表空间、 临时表空间、 undo表空间。

    • 永久表空间: 永久存储的对象,比如表、视图、存储过程等
    • 临时表空间:数据库操作中中间执行的过程, 完了自行删除将不永久保存
    • UNDO表空间:保存事务所修改的旧值,修改前的数据(利于撤销等方便回滚)

★6、查看用户的表空间

在Oracle数据库当中,使用不同用户登录之后,他们所使用的表空间可以有所不同。

  • 数据字典:dba_tablespaces(系统管理员级别用户登录后查看的字典)、user_tablespaces(普通用户登录后查看的字典)

     用 “desc 数据字典名;” 命令可以查看表空间数据字典的信息。

如:                       

  decs dba_tablespaces(查看dba_tablespaces表有哪些字段)
  select tablespace_name from dab_tablespaces;(查看有哪些表空间)

系统用户可以查看系统和普通用户的表空间数据字典信息(向下兼容),普通用户只能查看自己的。

  • 数据字典:dba_users(系统用户级)、user_users(普通用户级),用法同上
  • 设置用户的默认或临时表空间:ALTER USER username DEFAULT|TEMPORARY TABLESPACE tablespace_name;(普通用户没有修改表空间的权限,必须为他设置权限,否则的话只能使用系统用户为普通用户设置表空间)
  • 在Oracle数据库安装完成后(默认情况下),system用户的默认表空间和临时表空间分别是system,temp

default(默认),temporary(临时),默认下,每个用户只有一个临时表空间。

★7、创建表空间 

  • 语法格式:create [temporary] tablespace tablespace_name
               tempfile|datafile 'xx.dbf' size xx;
  • 创建永久表空间:create tablespace 表空间名 datafile '数据文件名.dbf' size 数据文件大小;
  • 创建临时表空间:create temporary tablespace 表空间名 tempfile '数据文件名.dbf' size 数据文件大小;

数据文件名可以包含路径,若是没有包含路径,则在默认路径(Oracle安装目录)下创建!

例子:

  ①创建永久表空间:
    create tablespace test1_tablespace
    datefile 'test1file.dbf' size 10m;
  ②创建临时表空间:
    create temporary tablespace temptest1_tablespace
    tempfile 'temptest1file.dbf' size 10m;

创建好永久表空间或者临时表空间后,如何进行查看表空间中文件的具体路径?如果我们不知道默认路径怎么办?

  在永久表空间中,通过“desc dba_data_files”查看这个数据字典中包含的字段;然后查看我们创建的表空间里它的文件名字“select file_name from dba_data_files where tablespace_name='TEST1_TABLESPACAE';”(注意:表空间的名称要大写)

  在临时表空间,查看我们创建的临时表空间里它的文件名字“select file_name from dba_temp_files where tablespace_name='TEMPTEST1_TABLESPACAE';”

★8、修改表空间 

 主要是修改表空间的状态和修改数据文件

  修改表空间状态:(在我们创建完表空间后,默认是联机、可读写状态)

    • 设置联机或者脱机状态:ALTER TABLESPACE tablespace_name  ONLINE|OFFLINE;(表空间设置为脱机状态之后就不能使用它了)
    • 设置只读或可读写状态:ALTER TABLESPACE tablespace_name  READ ONLY|READ WRITE;

  注意:默认情况下,当表空间的状态为"online"时,其是具有读写属性的(read write);对于"offline"状态的表空间,无法修改其读写属性;(默认的联机情况下就是可读写状态)

  查看表空间的状态:①查看数据字典:desc dba_tablespace;

           ②查看表空间的状态:select status from dba_tablespaces where tablespace_name=‘TESC_TABLESPACE’;

★9、修改数据文件 

增加数据文件和删除数据文件

  增加数据文件:ALTER TABLESPACE tablespace_name  ADD DATAFILE 'xx.dbf' SIZE xx;

    即:alter tablespace 表空间名 add datafile '数据文件名.dbf' size 数据文件大小;

  删除数据文件:ALTER TABLESPACE tablespace_name  DROP DATAFILE 'xx.dbf';

    即:alter tablespace 表空间名 drop datafile '数据文件名.dbf';

(注:我们删除表空间时,表空间的第一个数据文件是不可以删除的,除非将整个表空间删除!)

例如:增加数据文件

删除数据文件

★10、删除表空间

 删除表空间:
  drop tablespace 表空间名 [including contents];

注意:如果只是删除表空间,而不删除其中的数据文件,可以省略including contents 字句;

  drop tablespace tablespace_name [including contents]
  (不加‘[including contents]’为只删除表空间;)
例子:
drop tablespace test1_tablespace including contents;(删除表空间及表空间下的数据文件)

三、管理表

1、认识表 

  • 表是基本存储单位,数据都存放在表当中;
  • 在Oracle当中,表都是一个二维结构 ;也就是说它是由行和列组成的,可以把一行称为一条记录,一列称为域或字段
  • 每张表都有一些约定:
    • a. 每一列数据必须具有相同数据类型
    • b. 列名唯一
    • c. 每一行数据的唯一性(减少数据冗余)

2、数据类型 

  •  字符型【char(n)、nchar(n)、varchar2(n)、nvarchar2(n)】
  • 数值型【number(p,s)、float(n)】
  • 日期型【date、timestamp】
  • 其他类型 【blob、clob】

字符型:

    • char(n)nchar(n)为定长类型。n表示长度。

      - nchar2用于存储Unicode格式的数据,更适合存储中文数据
      - char(n): MAX:2000
      - nchar(n):MAX:1000 存储汉字

假设n=10(输入三个字符,不足则补充七个空格)如果n很大,输入的的数据位数比较小,就会浪费很多空间

    • varchar2(n)NVARCHAR2(n) 为可变长度类型

      - nvarchar2用于存储Unicode格式的数据,更适合存储中文数据
      - varchar(n): MAX:4000
      - nvarchar(n):MAX:2000

假设n=10(输入三个字符,不需要补足),因此相对char类型,varchar类型节省很多空间

数值型:

    • NUMBER(P,S)

    - P:有效数字 -s:小数点后的位数

例子:NUMBER(5,2) ---- 有效数字5位,保留2位小数,如123.45

    • FLOAT(n) 用来存储二进制数据,二进制的位数是1~126位。

    - 如果将二进制数转换为十进制数,需要乘以0.30103得到。因此在Oracle中使用数值型数据时候,我们都使用Number类型

日期型:

    • DATE(精确到秒)
      - DATE类型表示范围:公元前4712年1月日到公元9999年12月31日
    • TIMESTAMP(精确到小数秒)

一般情况下,日期类型都是会使用Date类型。
其他类型:(存放大数据对象)

    • BLOB: 能存放4G字节大小的数据,以二进制的形式
    • CLOB: 能存放4G字节大小的数据,以字符串的形式

3、管理表 

 创建表、修改表、删除表

创建表:

  1)基本语法:
    create table table_name (column_name datatype,...)

  注意:同一用户下(登陆数据库的用户)表名要唯一
  2)练习:创建用户信息表
    所需字段 --- 字段类型
    编号 -- 用户名 -- 密码 -- 邮箱 -- 注册时间
    create table userinfo(id number(6,0),username carchar2(20),userpwd varchar2(20),email varchar2(30),regdate date);

    查看表中的字段:

            

修改表:(修改表的结构,不是修改表的数据)

  1)添加字段:
    alter table table_name add column_name datatype;
    例如:alter table userinfo add remarks varchar2(500);
  2)更改字段数据类型:
    alter table table_name modify column_name datatype;
    例如:
      alter table userinfo modify remarks varchar2(400);
      alter table userinfo modify userpwd number(6,0);
  3)删除字段:
    alter table table_name drop column column_name;
    例如:alter table userinfo drop column remarks;
  4)修改字段名:
    alter table table_name rename column column_name to new_column_name;
    例如:alter table userinfo rename column email to new_email;
  5)修改表名:
    rename table_name to new_table_name;
    例如:rename userinfo to new_userinfo;

 删除表:

  1)删除表中的全部数据:(截断表:清空表)truncate 比delete要快很多
    truncate table table_name;
  2)删除表
    drop table table_name;

四、操作表中的数据

 添加、修改、删除数据

1、添加数据 

  1)insert语句:insert into table_name (column1,column2,...) values (value1,value2,...)
    添加数据时,值的个数、类型和顺序必须和字段的个数、类型和顺序相同。
    如果向表中的所有字段添加值,则表名后面的(column1,column2,...)内容可省略。  

  2)操作实例:(字符串要加单引号)
    a. 向表中所有字段添加值:insert into userinfo values (1,'xxx','xxx@126.com',sysdate);
    b. 向表中指定字段添加值:insert into userinfo (id,username,userpwd) values (2,'yy','123');
    c. 向表中添加默认值

      - 在创建表的时候添加默认值:CREATE TABLE table_name(column_name datatype DEFAULT def_value,...);

      - 修改字段时添加:ALTER TABLE table_name MODIFY column_name datatype DEFAULT def_value;

      - 插入表时添加默认值:insert into 表名(默认字段名) values(1);

      create table userinfo1 (id number(6,0),regdate date default sysdate);
      例如: insert into userinfo1 values(id) valuses(1);

  sysdate 用于获取当前系统的时间

2、复制表数据

   1)在建表时复制:
    create table table_new as select column,...|* from table_old;
    例子:
      create table userinfo_new as select * from userinfo;(复制userinfo表中的全部数据)

  复制一张表:create table 新表名 as select * from 旧表名; * 表示复制所有字段
  复制一张表中的某几个字段:create table 新表名 as select 字段1,字段2 from 旧表名;
  2)在添加时复制:
    insert into table_new [(column1,...)] select column1,...|* from table_old;
    例子:
      insert into userinfo_new select * from userinfo;
      insert into userinfo_new(id,username) select id,username from userinfo;

  向表中再次加入另一表中的数据:insert into 表1 select * from 表2;
  在向表中插入数据时,来指定插入某些字段:insert into 表1(字段1,字段2) select 字段1,字段2 from 表2;


3、修改数据 

修改表数据基本语法:
  UPDATE table_name SET column1=value1,... [WHERE conditions];
  (不指定条件,则为整个字段均修改)

无条件更新:

  update table_name set column1=values1,.....;更新的字段的所有行全部变成相应值

  

有条件更新:

  update table_name set column1=values1,..... where conditions; 更新的字段的指定行变值

  

4、删除数据 

delete语句

  删除表数据基本语法:DELETE FROM table_name [WHERE conditions];

  无条件删除:delete from 表名;
  有条件删除:delete from 表名 where 条件;

truncate语句

  删除表数据基本语法:TRUNCATE TABLE table_name

1.truncate和 delete只删除数据不删除表的结构(定义) 
drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态。
2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发
truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger。
3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动 
显然drop语句将表所占用的空间全部释放 
truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage; truncate会将高水线复位(回到最开始)。
4.速度,一般来说: drop> truncate > delete。
5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及。
6.使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大. 想删除表,当然用drop 
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。

7.DELETE FROM table_name;与TRUNCATE TABLE table_name;区别:
两者都是用来删除表中的全部数据,但是TRUNCATE 的速度要比DELETE 快,因TRUNCATE 属于数据定义语言中的,所以效率较高。