Oracle_SQL小宝典(Doc)

SQL语句
定义:

SQL语言是数据库的核心语言。全称是“结构化查询语言(Structured Query Language)。

特点:

1) SQL 语句对大小写不敏感
2) SQL 语句可以写成一行或多行
3) 关键字不能简写或分开折行
4) 子句通常放在不同的行
5) 缩进用于增强可读性

应用:

关系型数据库采用结构化查询语(SQL)作为客户端程序与数据库服务器间沟通的桥梁——客户端发送SQL指令到服务器端,服务器端执行相关的指令并返回其查询的结果。


显示表结构:
desc emp; (雇员表)显示表结构

名称                                     类型                         备注
----------------------------------------- --------
EMPNO                            NOT NULL NUMBER(4)            雇员编号
ENAME                            VARCHAR2(10)                   雇员姓名
JOB                                VARCHAR2(9)                    工种
MGR                               NUMBER(4)                      经理人
HIREDATE                          DATE                           入职日期
SAL                                NUMBER(7,2)                    薪水
COMM                              NUMBER(7,2)                   津贴
DEPTNO                            NUMBER(2)                     部门编号



desc dept;(部门表)
名称                                      是否为空? 类型              备注
----------------------------------------- -------- ----------------
DEPTNO                              NOT NULL NUMBER(2)          部门编号
DNAME                               VARCHAR2(14)                 部门名称
LOC                                  VARCHAR2(13)                 部门地址


desc salgrade;(薪水等级)

名称                                      是否为空? 类型               备注
----------------------------------------- -------- -------------
GRADE                                      NUMBER                  薪水等级
LOSAL                                      NUMBER                  最低等级
HISAL                                      NUMBER                  最高等级





1. 数据操纵语言(DML)
DML(Data Manupilate Lanuage)用以完成对数据的操作,常见DML关键字包括select、insert、update、delete。

   
1.1.查询语句
功能:

从数据库中返回相应信息。

基本语法:

SELECT*|{[DISTINCT] column|expression[alias],...}FROM table

说明:

SELECT子句,确定被显示的列 。
FROM子句,确定表,该表包含SELECT子句中的字段列表。

在语法中:

SELECT                 是一个或多个字段的列表
*                       选择所有的列
DISTINCT               禁止重复
column|expression    选择指定的字段或表达式
alias                  给所选择的列不同的标题
FROM table            指定包含列的表




1.1.1. 单表查询

查询所有列。

select * from emp;

选择指定的列。

select empno,ename,job from emp;

查询去除重复字段的不同记录:

select distinct job from emp;

查询去除两者组合不同的记录。

select distinct deptno,job from emp;

单条件查询:(where 指定查询条件)

select empno,ename,job from emp where job=‘MANAGER;






like和not like适合字符型字段的查询,%代表任意长度的字符串,_下划线代表一个任意的字符。Like ’m%’ 代表m开头的任意长度的字符串,like ‘m_’代表m开头的长度为3的字符串。

组合条件查询:


select empno,ename,job from emp where job>’clerk’ and sal<=2000;

排序查询: (order by 指定查询结果的排序方式)

select empno,ename,job from emp where job<=’clerk’ order by job asc,sal desc;

分组查询:
分组查询是指将查询结果按照字段分组。

Where 检查每条记录是否符合条件,having检查分组后的各组是否满足条件,having语句只能配合group by 语句使用。


Select empno,ename,job,sal from emp group by job,empno,ename,sal where sal<=2000;

--在没有分组函数的时候
  --相当于distinct 的功能

  select job from emp group by job;
  select distinct job from emp;

 
--有分组函数的时候
   --分组统计的功能

   统计每种工作的工资总额是多少??
     select job,sum(sal) from emp
          group by job;       --行之间的数据相加
     select sum(sal) from emp;  --公司的工资总额


字段运算查询:
可以利用几种基本的算术运算符来查询数据。

Select empno,ename,sal,mgr,sal+mgr from emp;

利用算术运算符仅仅适合多个数值型字段或字段与数字之间的运算。

1.1.2. 多表查询
所谓多表查询是相对单表而言的,指从多个数据表中查询数据。

无条件查询:
无条件多表查询是将各表的记录以“笛卡尔”积的方式组合起来。
如scott.dept表共有4条记录,scott.emp表共有14条记录,其“笛卡尔”积将有4*14=56条记录。

select ename,dname from emp,dept;

等值多表查询:

等值多表查询将按照等值条件查询多个数据表中相关联的数据。要求关联的多个数据表的某些字段具有相同的属性,即具有相同的数据类型、宽度和取值范围。

92年的语法:
Select empno,ename,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno and ename=’张三’;

99年的语法:
Select empno,ename,emp.deptno,dname from emp join dept on emp.deptno=dept.deptno where ename=’张三’;

非等值查询:

Select empno,ename,deptno,dname from emp,dept where emp.deptno!=dept.deptno and emp.deptno!=10;


1.1.3. 嵌套查询
在select查询语句里可以嵌入select查询语句,称为嵌套查询。有些书上将内嵌的select语句称为子查询,子查询形成的结果又成为父查询的条件。
子查询可以嵌套多层,子查询操作的数据表可以是父查询不操作的数据表。子查询中不能有order by分组语句。

简单嵌套查询:

Select empno,ename,job,sal from emp where sal>=(select sal from  emp where ename=’ward’);


上面的查询等价于两步:

1) 执行select sal from emp where ename=’ward’ 得出 sal=1250;
2) 执行 select empno,ename,job,sal from emp where sal>=1250;


带in的嵌套查询

Select empno,ename,job,sal from emp where sal in (select sal from  emp where ename=’ward’);


带any的嵌套查询

Select empno,ename,job,sal from emp where sal > any (select sal from scott.emp where JOB=’MANAGER’);


带any的查询过程等价于两步的执行过程。
(1) 执行“select sal from emp where job=’MANAGER’”,其结果为
2975,2850,2450.
(2) 父查询执行下列语句。
   Select empno,ename,job sal from emp where sal>2975 or sal>2850 or sal>2450

带some的嵌套查询:

Select empno,ename,job,sal from emp where sal = some(select sal from scott.emp where JOB=’MANAGER’);

带some的嵌套查询与any的步骤相同。
(1)执行“select sal from emp where job=’MANAGER’”,其结果为
2975,2850,2450.
(2)父查询执行下列语句。
   Select empno,ename,job sal from emp where sal=2975 or sal=2850 or sal=2450

注:带any的嵌套查询和some的嵌套查询功能是一样的。早期的sql仅仅允许使用any,后来的版本为了和英语的any相区分,引入了some,同时还保留了any关键词。


带all的嵌套查询:

Select empno,ename,job,sal from emp where sal > all(select sal from scott.emp where JOB=’MANAGER’);

带all的嵌套查询和some查询步骤相同。

执行过程:

(1)执行“select sal from emp where job=’MANAGER’”,其结果为
2975,2850,2450.
(2)父查询执行下列语句。
   Select empno,ename,job sal from emp where sal>2975 and sal>2850 and sal>2450

带exists的嵌套查询:

Select empno,ename,job,sal from emp,dept where exists (select * from  emp where emp.deptno=dept.deptno);

并操作的嵌套查询:(集合中的并集操作,即属于集合A 或集合B的元素)

Select deptno from emp union select deptno from dept;


交操作的嵌套查询:(集合中的交集,即属于集合A且属于集合B的元素)

Select deptno from emp intersect select deptno from dept;



差操作的嵌套查询 (集合中的差集,即属于集合A而不属于集合B的元素)

Select deptno from emp minus select deptno from dept;

分页查询 

select * from (select rownum as num,emp.* from emp)
   where num >= 9 and num <= 12;


1.1.4. 函数查询

1 数学函数




Ceil 函数:(ceil(n),大于等于数值n的最小整数)。

Select mgr,mgr/100,ceil(mgr/100) from emp;

Floor函数:(floor(n),取小于等于数值n的最大整数)

Select mgr,mgr/100,floor(mgr/100) from emp;

Mod 函数: (mod(m,n),取m整除n后的余数)

Select mgr,mod(mgr,1000),mod(mgr,100),mod(mgr,10) from emp;

Power函数: (power(m,n),取m的n次方)

Select mgr,power(mgr,2),power(mgr,3) from emp;

Round函数: (round(m,n),四舍五入,保留n位)

Select mgr,round(mgr/100,2),round(mgr/1000,2) from emp;

Sign函数:(sign(n).n>0,取1;n=0,取0;n<0,取-1。)

Select mgr,mgr-7800,sign(mgr-7800) from emp;

Avg函数:(avg(字段名),求平均值。要求字段为数值型)

Select avg(mgr) 平均薪水 from emp;

Count函数:(count(字段名) 或count(*),统计总数)

Select count(*) 记录总数 from emp;


Select count(distinct job) 工作类别总数 from emp;

Min 函数: (min(字段名),计算数值型字段最小数)。

Select min(sal) 最少薪水 from emp;

Max 函数:(max(字段名),计算数据字段最大数)

Select max(sal) 最高薪水 from emp;

Sum 函数:sum(字段名),计算数值型字段总和。

Select sum(sal) 薪水总和 from emp;

2 字符函数



concat 连接  ||
   <1>显示dname和loc中间用-分隔

select deptno,dname||'----'||loc from dept;
    
     dual哑元表   没有表需要查询的时候 可以用它

         select 'Hello World' from dual;
         select 1+1 from dual;
         查询系统时间
         select sysdate from dual;

   <2>  initcap 首字母大写

       select ename,initcap(ename) from emp;

   <3>  lower   转换为小写字符

        select ename,lower(ename) from emp;

   <4> upper 转换为大写

        update dept set loc=lower(loc);
        update dept set loc=upper(loc);

   <5> LPAD 左填充

        select deptno,lpad(dname,10,' '),loc from dept;

   <6> RPAD 右填充
   <7> LTRIM 去除左边的空格
       RTRIM 去除右边的空格
       ALLTRIM  去除两边的空格
   <8>replace  替换
      translate  转换

   select ename,replace(ename,'S','s') from emp;

       用's'去替换ename中的'S'

    select ename,translate(ename,'S','a') from emp;

   <9> ASCII 求ASC码
       chr   asc码变字符

         select ascii('A') from dual;
         select chr(97) from dual;
         select 'Hello'||chr(9)||'World' from dual;
                           '\t' ascii码是 9
                           '\n' ascii码是 10
         select 'Hello'||'\t'||'World' from dual;
   

   <10> substr 字符截取函数

           select ename,substr(ename,1,3) from emp;
               从第1个位置开始 显示3个字符
           select ename,substr(ename,4) from emp;
              从第4个位置开始显示后面所有的字符

   <11> instr 测试字符串出现的位置

          select ename,instr(ename,'S') from emp;
             'S'第1次出现的位置
          select ename,instr(ename,'T',1,2) from emp;                
             从第1个位置开始 测试'T'第2次出现的位置

  <12> length 字符串的长度

        select ename,length(ename) from emp;

3 日期和 时间函数     

 日期类型:
 Oracle内部以数字格式存储日期和时间信息:世纪、年、月、日、小时、分钟、秒。
 缺省日期格式是:DD-MON-YY
 可以使用sysdate函数获取当前系统日期和时间。
 日期型数据的算术运算:
 日期型数据可以直接加或减一个数值,结果仍为日期。
 两个日期型数据可以相减,结果为二者相差多少天。


相关日期函数:

      
常用日期格式符:



<1> sysdate 系统时间

        select sysdate from dual;
        select to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') from dual;
        select to_char(sysdate,'DDD') from dual  
        select to_char(sysdate,'D') from dual
        select to_char(sysdate,'DAY') from dual
        select to_char(sysdate,'yyyy-mm-dd') from dual;
        select to_char(sysdate,'yyyy"年"mm"月"dd"日" hh24:mi:ss') from dual;
        select '''' from dual;
select to_char(sysdate,'SSSSS') from dual;
        --从今天零点以后的秒数

   <2> ADD_MONTHS 添加月份 得到一个新的日期

       select add_months(sysdate,1) from dual;
       select add_months(sysdate,-1) from dual;
       select add_months(sysdate,12) from dual;
        一年以后的今天
select add_months(sysdate,-12) from dual;
select sysdate+2 from dual;
       数字代表的是天数


   <3> last_day  某月的最后一天

       select last_day(sysdate) from dual;   
       select add_months(last_day(sysdate)+3,-1) from dual;
       本月第3天的日期

  <4>  months_between 两个日期之间的月数。

     select months_between('12-2月-08',sysdate) from dual;

4 转换函数:

  (1) to_char   把日期或数字类型变为字符串

       select to_char(sysdate,'hh24:mi:ss') from dual;
       select to_char(sysdate,'yyyymmdd hh24:mi:ss') from dual;
       select sal,to_char(sal,'L9,999') from emp;
       L本地货币


(2)to_number   把字符串变成数字

      select to_number('19990801') from dual;
 
(3)to_date     把字符串变成日期

      select to_date('19800101','yyyymmdd') from dual;
      select to_char(to_date('19800101','yyyymmdd'),
        'yyyy"年"mm"月"dd"日"') from dual;

(4)空值转换函数 nvl(comm,0) 字段为空值 那么就返回0 否则返回本身

      select comm,nvl(comm,0) from emp;
      comm 类型和 值的类型是 一致的

(5)复杂的函数
 
decode   选择结构  (if ... elseif .... elesif ... else结构)
   
要求:
   sal=800  显示低工资  
   sal=3000  正常工资
   sal=5000  高工资
   只能做等值比较

select sal,decode(sal,800,'低工资',3000,'正常工资',5000,'高工资','没判断') from emp;
表示如下的if  else 结构
     if sal=800 then
        '低工资'
     else if sal =3000 then
        '正常工资'
     else if  sal = 5000 then
         '高工资'
     else
        '没判断'
     end if


(6)判断正负

  sign(x)    x是正  1
            x是负  -1
            x是0   0

select sign(-5) from  dual;

如何做大于小于的比较????

  sal<1000  显示低工资   sal-1000<0   sign(sal-1000) = -1
   1000<=sal<=3000  正常工资
   3000<sal<=5000  高工资

   select sal,decode(sign(sal-1000),-1,'低工资',
       decode(sign(sal-3000),-1,'正常工资', 0,'正常工资',1,
       decode(sign(sal-5000),-1,'高工资','高工资'))) as 工资状态 from emp;
     
  一般的情况  decode(x,y1,z1,y2,z2,z3)
      if x= y1 then
          z1         
      else if x = y2 then
          z2
      else
         z3
      end if 


1.2.录入数据

1.2.1. 单行记录的录入

语法:

Insert into 数据表(字段名1,字段名2,…..)values(字段名1的值,字段名2的值,……)

说明:

1) 数据插入时,插入列排序和插入值要一一对应,字符型和日期型字段要加上单引号,非空列必须有值。
2) 执行完插入语句以后,执行commit可以提交数据,执行rollback可以回滚数据。

例如:

向所有字段中插入数据:

Insert into dept values(12,’bjsales’,’beijing’);

向部分字段中插入数据:
insert into emp(empno,ename,hiredate) values (7999,’JONE’,’25-11月-2002’);



1.2.2. 多行记录的录入

语法:

Insert into 数据表(字段名1,字段名2,……)(select (字段名1或运算,字段名2或运算,……) From 数据表 where 条件)

注意:

子查询和insert 中的数据表即可以相同,也可以不同,但要求查询结果的字段和insert插入数据表中的字段属性完全一致。

例如:

Insert into emp (empno,ename,hiredate)(select empno+20,ename,hiredate from emp where empno>=6999);

1.2.3. 表间数据复制
例如:

create  table test as(
select distinct empno,ename,hiredate
from emp
where empno>=7000 ); 


说明:

上述过程分3步执行:

1) 查询符合要求的数据。
2) 建立3个字段的名为test的数据表。
3) 将查询到的数据插入到test数据表中。



1.3.删除数据

1.3.1. 删除记录
语法:

delete from 数据表 where 条件.

例如:

delete from test where empno>=7500 and empno<=8000;

说明:

delete 命令删除的数据将存储在系统回滚段中,需要的时候,数据可以回滚恢复。

1.3.2. 整表数据删除

语法:

truncate table 表名

truncate table 命令将快速删除数据表中的所有记录,但保留数据表结构。

例如:

truncate table test;

说明:

1) 清除表中所有记录
2) 释放表的存储空间
3) 为DDL语句,一经执行不可撤消
4) truncate 命令删除的数据是不可以恢复的。


1.4.更新数据

1.4.1. 直接赋值更新
语法:

Update 数据表
Set 字段名1=新的赋值,字段名2=新的赋值,……
Where 条件

例如:

Update emp set empno=8888,ename=’TOM’,hiredate=’03-9月-2002’ where empno=7566;

1.4.2. 嵌套更新
语法:

Update 数据表

Set 字段名1=(select 字段列表 from 数据表 where 条件),字段名2=(select 字段列表 from 数据表 where 条件),……

例如:

Update emp
Set sal=
(
  Select sal+300 from emp
  Where empno=7599
)
Where empno=7599;

2. 数据定义语言(DDL)
DDL(Data Definition Lanuage)是SQL中定义数据结构的语言。常见 DDL关键字是create、revoke、grant、alter、drop;

2.1.创建数据库对象
常见数据库对象:

1) 表:存放数据的基本数据库对象,由行(记录)和列(字段)组成
2) 约束:执行数据校验,保证数据完整性的系列规则。
3) 视图:表中数据的逻辑显示。
4) 索引:根据表中指定的字段建立起来的顺序,用于提高查询性能。
5) 序列:一组有规律的整数值。
6) 同义词:对象的别名。


命名规则:

1) 必须以字母开头。
2) 可以包含字母、数字、_、$、和#.
3) 同一方案(用户)下的对象不能重名。
4) 不能使用oracle的保留字。

oracle数据类型:





2.1.1. 创建表
创建表的前提条件:

1) 具备创建表的权限。
2) 有可用的存储空间。

语法:

CREATE TABLE [schema.]table (column  datatype  [DEFAULT expr][, ...]);

说明:

schema 与所有者的名字一样
table 表的名字
DEFAULT expr 指定默认值,在INSERT语句省略值时使用
column 列的名字
datatype 列的数据类型和长度
--------------------------------
创建表时必须指定表名、字段名、字段类型。

例如:

create table student( --学生表
           xh number(4), --学号
           xm varchar2(10), --姓名
           sex char(2), --性别
           birthday date, --日期
           sal number(7,2)--奖学金
        );


2.1.2. 创建约束
约束分类:

 主键约束:

1) 主键用于唯一标识表中的某一行记录,功能上相当于非空且唯一
2) 一个表中只允许一个主键,主键可以是单个字段或多字段的组合
3) Oracle会自动为主键字段创建对应的唯一性索引
4) 主键约束既可以在字段级定义、也可以在表级定义


 非空约束:

1) 确保字段值不能为空(null)
2) 只能在字段级定义


 外键约束

1) 外键用于确保相关的两个字段之间的参照关系,以实现参照完整性约束;
2) 外键约束通常构建于来自不同表的两个字段之间;
3) 子表外键列的值必须在主表参照列值的范围内,或者为空;
4) 外键参照的必须是主表的主键或者唯一键;
5) 主表主键/唯一键值被子表参照时,主表相应记录不允许被删除;

 检查约束:

1) 定义每一行(的指定字段)都必须满足的条件
2) 以条件表达式的形式给出数据需要符合的条件
3) 条件表达式中不允许出现如下内容
currval, nextval, level, rownum等伪列
sysdate, uid, user, userenv等函数
对其它字段值的引用
4) 只能在字段级定义


 Unique(唯一)约束:

1) 唯一性约束用于确保所在的字段(或字段组合)不出现重复值
2) 唯一性约束的字段允许出现空值
3) Oracle会自动为唯一性约束创建对应的唯一性索引
4) 唯一性约束既可以在字段级定义、也可以在表级定义


例如:

 建表的同时使用约束:

  create table student( --学生表
      xh number(4) primary key, --学号主键
      xm varchar2(10) not null, --姓名不能为空
      sex char(2)  check (sex in (‘男','女')), --性别
      birthday date unique, --日期
      sal number(7,2) check (sal between 500 and 1000),--奖学金 sal >=500 and sal <=1000
      classid number(2) references class(id)
     );


 建立约束的同时给约束指定名字,便于删除

create table student( --学生表
      xh number(4) constraint pk_stu primary key, --学号主键
      xm varchar2(10) constraint nn_stu not null, --姓名不能为空
      sex char(2) constraint ck_stu_sex check (sex in ('男','女')), --性别
      birthday date constraint uq_bir unique, --日期
      sal number(7,2) constraint ck_sal check (sal between 500 and 1000)--奖学金 sal >=500 and sal <=1000
      classid number(2) constraint fk_stu references cla(id) -- 班级编号外键
      );

 建完表后加约束


加主键
alter table student add constraint pk_stu primary key (xh);
加not null
alter table student modify (xm not null);
加检查约束
alter table student add constraint cc_age check (age >= 10 and age <=90);
加唯一约束
alter table student add constraint uq_sfz unique(shenfenzheng);
加外键约束
alter table student add constraint  fk_stu foreign key (classid) references class(id);



总结归类:

 域完整性约束
not null
check
 实体完整性约束
unique
primary key
 参照完整性约束
foreign key

2.1.3. 创建序列
定义:

1) 系统自动生成的、不重复的整数值
2) 序列是一种数据库对象,可以被多个用户共享
3) 典型用途是做为主键值,它对于每一行必须是唯一的
4) 序列可以代替应用程序编号
5) 可以对序列值进行缓冲存储,以提高访问效率

语法:


create sequence [schema.]sequence
[increment by n] –-序列数字间的整数间隔
[start with n]--要生成的第一个序列号
[{maxvalue n | nomaxvalue}]—序列可以生成的最大值。
[{minvalue n | nominvalue}]—序列可以生成的最小值。
[{cycle | nocycle}] --终值后是否可继续生成值。
[{cache n | nocache}]
[{order | noorder}];


例如:

create sequence seq1;

create sequence seq2
    start with 1000        --起始值1000
    increment by 2         --步长2
    maxvalue 9000          --最大值9000
    minvalue 1000           --最小值1000
cycle                  --循环序列

使用序列:


nextval 返回序列首次引用时的起始值。 

Select seq1.nextval from dual;

currval 返回序列的当前值。

select seq1.currval from dual;

--currval 的作用范围在各个application内,它存储在内存中。
--application内第一次调用.nextval时才初始化.currval.

insert into catetory (cat_sql.nextval,’水果’,’绿色食品’);


2.1.4. 创建视图
定义:



1) 视图由一个或多个表(或视图)中提取数据而成
2) 视图是一种虚拟表
3) 视图一经创建,可以当作表来使用。

优点:

1) 简化复杂数据查询
2) 提高运行效率
3) 屏蔽数据库表结构,实现数据逻辑独立性
4) 限制数据库访问
5) 在相同数据上提供不同的视图,便于数据共享

创建视图:

基本语法:

create [or replace] view [schema.] view [(alias[,aliasx]...)] as subquery;

例如:

create or replace view myview1(编号, 姓名, 职位, 工资)
as select empno, ename, job, sal from emp where deptno = 20;

查询视图:

select * from myview1;


 创建复杂视图:

create or replace view v_sal(deptno, maxsal, minsal, avgsal)
as select deptno, max(sal), min(sal), avg(sal) from emp group by deptno;


create or replace view v_emp(工号, 姓名, 职位, 年薪,工龄(月),部门编号,部门名称)
as select empno, ename, job, sal*12, months_between(sysdate,hiredate), emp.deptno,dname
from emp, dept where emp.deptno = dept.deptno;

 创建只读视图:

语法:

create [or replace] [force | noforce] view [schema.] view [(alias[,aliasx]...)]as subquery [with read only];

例如:

create or replace force view myview2
as select empno, ename, job, sal from emp2 where deptno = 20
with read only;

inline视图:

Top-N分析:

select [colnum_list],rownum
from (select [colnum_list] from table order by top-n_colum desc);
Where rownum<=n;

例如:显示雇员表中薪水位列前三位的雇员名次、姓名及薪水。

select rownum as rank,ename,sal from (select ename,sal from emp order by sal desc) where rownum<=3;


2.1.5. 创建索引
定义:

1) 一种用于提升查询效率的数据库对象;
2) 通过快速定位数据的方法,减少磁盘I/O操作;
3) 索引信息与表独立存放;
4) Oracle 数据库自动使用和维护索引。

索引分类:

1) 唯一性索引
2) 非唯一索引

创建索引的方式:

1) 自动创建- 在定义主键或唯一键约束时系统会自动在相应的字段
上创建唯一性索引。
2) 手动创建- 用户可以在其它列上创建非唯一的索引,以加速查询。

语法:

create index [schema.]index on table (column[, column]...);

例如:
create index myindex on emp(ename);


 创建索引的原则:

下述情况可以创建索引:

1) 字段取值分布范围很广
2) 字段中包含大量空值
3) 字段经常出现在where 子句或连接条件中
4) 表经常被访问、数据量很大,且通常每次访问的数据量小于记录
总量的2%~4%

下列情况不适合创建索引:

1) 表很小
2) 字段不经常出现在where子句中
3) 每次访问的数据量大于记录总数的2%~4%
4) 表经常更新
5) 被索引的字段作为表达式的的一部分被引用

 基于函数的索引:

基于表达式的索引被统称为基于函数的索引——索引表达式由表中的字段、常量、SQL函数和自定义函数构建而成。

语法:

create index [schema.]index on table (function(column));

例如:

create index myindex on emp(lower(ename));

使用索引:


select * from emp  where lower(ename) = 'king';

2.1.6. 创建同义词
定义:

授权数据库对象容易记忆的名称。

同义词使用:

 所用者或表的实际名称需要隐藏时使用同义词。
 表的最初位置需要隐藏时使用同义词
 用户必须提供简单、容易记忆的表名时使用同义词

创建同义词:

create [public] synonym mem for scott.member;

说明:

1) 一个同义词(synonym)为任何表、视图、序列、过程、函数或包的别名。
2) 公用同义词命名为pulbic特殊用户组所持有,可为数据每一个用户所存取。
3) 一个专用同义词是包含在指定用户的模式中,仅为该用户和所授权的用户所使用。
4) 不同用户间原本必须使用user名.object名引用,公用同义词让所有用户可以通过同义词访问相应对象。
5) 注意:public同义词只是为数据库对象定义了一个公共的别名。其它用户能否通过此别名访问到相应数据库对象必须取决于权限管理。


2.2.删除数据库对象

2.2.1. 删除表
语法:

drop table 表名

例如: 

drop table student;  删除结构


说明:

1) 表中所有数据将被删除
2) 此前未完成的事务将被提交
3) 所有相关的索引被删除
4) 为DDL语句,一经执行不可撤消

2.1.2. 删除约束
语法:

alter table table  drop constraint constraint_name;

例如:

alter table student drop constraint  fk_stu;

删除主键约束的另一种方式:

语法:
alter table table drop primary key;

例如:

alter table student drop primary key ;

 删除级连约束

1. 在删除约束时,如果还存在与该约束相关联的其它约束,则删除操作会失败,此时可使用cascade子句将其它关联约束一并删除。

例如:

create table empinfo(
eid number(3) constraints empinfo_eid_pk primary key,
ename varchar2(20)
---
);
create table salary(
eid number(3) references empinfo(eid)
---
);
alter table empinfo
drop constraints empinfo_eid_pk  cascade;


2. 在删除表中字段时,如果该字段处于多字段联合约束条件(联合主键、联合唯一键、存在参照当前字段的外键)中,则删除会失败,此时可使用cascade constraints子句将
与该字段相关的约束一并删除。
例如:

语法:

drop (column [, column] ...) cascade constraints;

创建约束

create table record(
student_id number(3),
subject_id varchar2(20),
record number(3),
constraint record_stuId_subId_pk primary key(student_id, subject_id)
);

删除约束:
alter table record
drop (student_id)  cascade constraints ;

 禁用约束

在alter table语句中,还可使用disable constraint子句禁用已有约束。也可使用cascade选项将相关联的约束也一并禁用。
语法:

alter table table
disable constraint constraint_name [cascade];

创建约束:
create table student(
sid number(10) ,
name varchar2(20),
constraint student_sid_pk primary key(sid)
);

禁用约束:
alter table student disable constraint student_sid_pk ;


 启用约束

在alter table语句中,可使用enable constraint子句启用先前被禁用的约束。

语法:
alter table table
enable constraint constraint_name;

创建约束:
create table student(
sid number(10) ,
name varchar2(20),
constraint student_sid_pk primary key(sid)
);


禁用约束:



alter table student disable constraint student_sid_pk ;

启用约束:

alter table student enable constraint student_sid_pk ;

说明:

和关闭约束操作的情形有所不同,此时无法再使用cascade选项一并启
用相关联的其它约束。


2.1.3. 删除序列

语法:



Drop sequence 序列名

说明:

操作者须是序列的所有者、或拥有drop 该sequence的权限。


2.1.4. 删除视图
例如:

drop view myview1;


2.1.5. 删除索引

语法:

drop index 索引名

例如:

drop index myindex;


2.1.6. 删除同义词
语法:

Drop synonym 同义词名称

例如:

Drop synonym mem



2.3.修改数据库对象
2.3.1. 修改表

使用alter table 语句可以修改表的结构。

 添加字段:

语法:

alter table table  add (column datatype [default expr] [, column datatype] ...);

例如:

alter table test1 add (grade number(3), phone varchar2(20) default '无');

说明:

在alter table 语句中,使用add子句添加新字段,新字段只能被加到整个表的最后。


 修改字段:

在alter table 语句中,使用modify子句修改现有字段,包括字段的数据类型、大小和默认值。

语法:

alter table table  modify (column datatype [default expr] [, column datatype] ...);

例如:

alter table test modify ( grade number(2),phone varchar2(15) default '010-12345678');

说明:

1) 修改操作会受到当前表中已有数据的影响——当已有记录的相应字段只包含空值时,类型、大小都可以修改,否则修改可能失败。
2) 修改的缺省值设置,只对此后新插入的记录有效。

删除字段:

在alter table 语句中,使用drop子句删除字段——从每行中删除掉该字段占据的长度和数据、释放在数据块中占用的存储空间。

语法:

alter table table drop (column [, column] ...);


例如:

alter table test1 drop (grade, phone);

2.3.2. 修改序列
语法:

alter sequence [schema.]sequence
[increment by n]
[{maxvalue n | nomaxvalue}]
[{minvalue n | nominvalue}]
[{cycle | nocycle}]
[{cache n | nocache}]
[{order | noorder}];

注意:

1) 操作者必须是序列的所有者、或者拥有alter该序列的权限;
2) 只有未来再生成的序列数受影响;
3) 序列的初始值不可更改;
4) 更改中会进行一些验证,比如新的maxvalue如果小于当前的序列
5) 值就会报错。


注意alter并不影响当前值。

如:改变minvalue, currval并不被重置为初始值。Alter不能改变start with子句。


2.3.3. 修改视图

 在可更新视图上进行DML操作,可以修改基表中数据。

1) 可更新视图的定义中不能使用分组函数、group by子句、distinct关
键字、rownum伪列,字段的定义不能为表达式……
2) 由两个以上基表中导出的视图不可更新
3) 基表中非空的列在视图定义中未包括,则不可在视图上进行insert操作……

 在视图上进行DML操作,语法与在表上操作相同

1) insert
2) update
3) delete

2.4.授权数据库对象




3. 事物控制语句(TCL)
事物:一个完整的对数据的DML操作,是进行数据库操作的基本单位。

TCL 即Transaction Control Language 事物控制语句,往往跟在DML语句的后面。

规则:

1) DML语句后跟上DDL语句 DML语句的事务会被自动提交
2) exit/quit命令 退出 SQLPLUS环境时也会自动提交事务
3) 点小叉子关闭sqlplus窗口 事务都自动回滚了
4) 非法操作是不能提交事务的 ,只能导致事务回滚

3.1. 事物提交(commit)
Commit是事务提交命令。为了保证数据的一致性,在内存中将为每个客户机建立工作区,客户机对数据进行操作处理的事务都在工作区内完成,只有在输入commit命令后,工作区内的修改内容才写到数据库上,称为物理写入,这样可以保证在任意的客户机没有物理提交修改以前,别的客户机读取的后台数据库中的数据是完整一致的。



作用:

事物提交,将修改保存到数据库中。

语法:

Commit;

例如:

Update  emp set sal=4000 where ename=’SMITH’;
Commit; --将修改保存到数据库


3.2. 事物回滚(rollback)
Rollback是事务回滚命令,在尚未提交commit命令之前,如果发现delete、insert、和update等操作需要恢复的话,可以使用roollback命令回滚到上次commit时的状态。


作用:

事物回滚,取消内存中的改动。

语法:

Rollback;

例如:

Update  emp set sal=4000 where ename=’SMITH’;
rollback; --将内存中的修改撤销。


3.3. 事物保存点(savepoint)
定义:

定义事物语句的执行时的一个保存点。


 “保存点”就像一个标记,用来将很长的事务划分为若干个较小的事务。
 标识事务中某个点以便将来可以回滚事务。
 它与回滚一起使用以回滚当前事务部分。

语法:

Savepoint 保存点名

例如:

  update student set sal = null where xh =1000;
  savepoint c111;
  insert into student(xh,name,sex) values (1004,'MIKE','男');
  rollback to c111; --撤销了插入的数据
  rollback;  --从c111这个点回滚到事务的开始点

4. 数据控制语句(DCL)
数据控制语句主要执行对用户权限或角色的一个授予与撤销。


权限:

select ,insert,delete,update ,all

角色:

connect (登陆数据库),resource(建立表和对象)

4.1. 创建用户(create)

连接到超级用户:

connect system/manager

建立用户:

create user zhangsan identified by m123;

修改密码:

alter user zhangsan identified by mm1;

4.2. 授予权限(grant)
例如:

1) grant connect,resource to zhangsan; --和scott用户的权限是一样的
2) grant DBA to zhangsan; --和System权限一样
3) grant select on dept to zhangsan;


4.3. 撤销权限(revoke)
例如:

revoke select on dept from zhangsan;

你可能感兴趣的:(数据结构,oracle,sql,嵌入式,Tcl)