精华内容
下载资源
问答
  • Oracle基本语法

    2010-06-28 15:45:09
    Oracle基本语法 学习很实用。关于oracle sql语法的书写
  • oracle 基本语法

    2011-11-15 15:51:49
    oracle基本语法,比较详细可以学习学习
  • oracle基本语法

    2012-02-17 14:45:16
    oracle基本语法,很简单的语句。随便看看哈。
  • Oracle 基本语法

    2013-07-23 17:56:17
    详细介绍oracle语法,配套案例说明,方便去执行和学习
  • oracle基础语法

    2010-06-04 17:19:08
    这是一部很好的介绍oracle语法基础的书籍,非常不错的啦
  • Oracle基础语法

    2018-07-29 11:28:31
    1.Oracle中的专业术语  SID---------数据库名称 2.Oracle的安全体系  基于分用户原则进行数据库管理,即:在一个...3.基本学习Oracle只需要启动两个服务:  (1)监听:OracleOraDb11g_home1TNSListener ...

    1.Oracle中的专业术语

          SID---------数据库名称

    2.Oracle的安全体系

         基于分用户原则进行数据库管理,即:在一个用户Admin下的数据库,另一个用户User在没有权限时,Admin下的数据库对User是不可见的。

    3.基本学习Oracle只需要启动两个服务:

        (1)监听:OracleOraDb11g_home1TNSListener

        (2)实例:OracleServiceORCL

    4.在cmd下创建一个用户名 admin,密码admin1234

         (1)输入Oracle客户端启动命令: sqlplus    回车

         (2)输入Oracle的超级用户名: sys    -------------超级用户名的密码可以按回车绕过

      (3)输入创建Oracle用户的命令:

            CREATE USER admin PROFILE DEFAULT
            IDENTIFIED BY admin1234 ACCOUNT UNLOCK;
            GRANT SYSDBA,SYSOPER TO admin;
            GRANT CONNECT,DBA    TO admin;

            最后两行表示将超级用户及DBA的权限授权给用户admin

    5.创建表的语法:------注意:在Oracle中全部大写

        CREATE TABLE 表名

        (  

                  列名1  数据类型 PRIMARY KEY,

                  列名2  数据类型,

                 ......

                 列名n  数据类型

            );

    示例如下:

         CREATE TABLE PERSON
    (
        PID NUMBER,
        PNAME     VARCHAR(6,CHAR),
        PNUMBER VARCHAR(20),
        PSEX         VARCHAR(1),
        PSTATE     VARCHAR(1),
        PMONEY  NUMBER(10,2),
        PRIMARY KEY(PID)
    );

    6.添加语句的句法:

     INSERT INTO 表名(列名1,列名2,列名3,....列名n)

                  VALUES(值1,值2,值3,.....值n)

    7.删除的语法

      DELETE FROM 表名

                  WHERE 条件列表;

    8.更新的语法

        UPDATE SET  列名1 =     ,列名2 =

                    FROM  表名

                 WHERE    条件列表;

    9.查找的句法

    (1) SELECT * FROM 表名

    (2)SELECT 列名1,列名2,列名3,......列名n

                FROM 表名

              WHERE 条件列表;

    展开全文
  • oracle基础语法信息

    2011-07-11 13:26:34
    oracle基础语法信息oracle基础语法信息oracle基础语法信息
  • Oracle基本语法全集

    2009-10-12 22:29:16
    Oracle基本语法全集+终级整理版+全集文档版
  • oracle 基础语法

    千次阅读 2013-01-10 14:28:23
    1。添加和修改字段 ALTER TABLE 表名 ADD 系统时间字段 DATE DEFAULT SYSDATE;--新增 ALTER TABLE 表名 MODIFY 要修改的字段 VARCHAR2...在开始讲解Oracle序列使用方法之前,先加一点关于Oracle client sqlplus的
    1。添加和修改字段
    ALTER   TABLE  表名   ADD   系统时间字段  DATE DEFAULT SYSDATE;--新增  
    
    ALTER   TABLE   表名 MODIFY   要修改的字段  VARCHAR2(12);--修改
     
    2. 序列建立, 删除,使用
     

    在开始讲解Oracle序列使用方法之前,先加一点关于Oracle client sqlplus的使用

    ,就是如果执行多行语句的话一定要加“/”才能表示结束,并执行!本篇文章的主题是通过创建Oracle序列和触发器实现表的主键自增。

    1.首先创建序列,Oracle序列的语法格式为: CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCACHE}];

    1)INCREMENT BY用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表Oracle序列的值是按照此步长递减的。

    2)START WITH 定义序列的初始值(即产生的第一个值),默认为1。

    3)MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增Oracle序列,系统能够产生的最大值是10的27次方;对于递减序列,最大值是-1。

    4)MINVALUE定义序列生成器能产生的最小值。选项NOMAXVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是?10的26次方;对于递增序列,最小值是1。

    5)CYCLE和NOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。

    6)CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。

    2.删除Oracle序列的语法是DROP SEQUENCE 序列名;

    假设有表TEST,其主键为TEST_ID 1)建立递增序列SEQ_TEST: create sequence SEQ_TEST increment by 1 start with 1 minvalue 1 nomaxvalue nocylce

    2)建立触发器,当有数据插入表TEST时,使用Oracle序列为其去的递增的主键值 create trigger TRG_TEST before insert on TEST for each row begin select SEQ_TEST.nextval into :new.TEST_ID from dual; end;

    至此,创建完成!

    当然也可以不使用触发器,而是在插入时在sql语句中调用序列,例如 insert into TEST values(SEQ_TEST.nextval, ……)

    展开全文
  • Oracle基本语法大全

    2011-01-10 11:05:27
    Oracle基本语法及应用示例。(建库,建表,新建用户,表空间,分配用户权限,游标,索引,视图,存储过程,触发器等)。保证下载后绝不让你失望哦!
  • ORACLE基本语法集锦

    2007-07-20 18:48:05
    ORACLE基本语法集锦
  • 超全面的oracle基本语法,适合初学者的使用。
  • Oracle基本语法 存储过程 触发器介绍 PL/SQL 语言介绍 PL/SQL是Oracle数据库的编程语言我们可以将PL/SQL看成是对标准SQL的扩展使用它编写的代码通常是放在Oracle数据库中执行 概述 PL/SQL是Oracle数据库专用的语言...
  • Oracle基本语法.pdf

    2011-05-05 09:51:15
    本书记载了Oracle基本语法 可以做入门教程
  • ORACLE| ORACLE基础语法汇总

    万次阅读 多人点赞 2018-07-18 16:47:34
    1.建表的语法  create table 表名(  字段名(列名) 字段类型 [约束 默认值],  .....  字段名(列名) 字段类型 [约束 默认值]    );    注意:1.表名,字段名,关键字大小写忽略  2.表名,字段名不能使用...

    1.建表的语法

       create table 表名(

        字段名(列名) 字段类型 [约束 默认值],

        .....

        字段名(列名) 字段类型 [约束 默认值]

      

       );

     

      注意:1.表名,字段名,关键字大小写忽略

           2.表名,字段名不能使用关键字

           3.表名,字段名不可以使用数字开头,中间不能出现特殊符号

           4.表名,字段名长度不能超过30个字符

           5.表名,字段名定义需要有含义

           

    2.创建一个用户表 t_user

        |-姓名name,字符串

        |-性别gender,字符串

        |-年龄age,数字型

       

        create table t_user(

         name varchar2(30),

         gender varchar2(3),

         age number

        );  

      --注意: desc命令必須在命令窗口中執行.sql window中不能執行

        desc t_user;   

       

    3.Oracle中常见的数据类型

       字符串

         |-varchar2(length):可变长的字符串,length定义最长字符串的字节数.

                            length最大值位4000,节省空间,查询效率低

         |-char(length):定长的字符串,length定义最长的字符串的字节数,最大值2000

                        浪费空间,查询效率高

         |-varchar(length):等价于varchar2(length),varchar2Oracle独有的. 

       

       数字类型

         |-number(p,s):p表示定义数字的长度(不包含小数点),s表示小数点后面的尾数

            |-定义商品的价格 number(5,2),表示小数点前面有3个数字,后面有两个数字

                 123.23  12.23(合法,在精度里面)  1234.10(不合法

            |-number:表示描述整数  

          

       日期类型

         |-date:七个字节,如果是英文环境 DD-MOR-RR "11-JUN-15" 如果是中文环境 15-7-15

                                              

    4.删除表 drop table 表名

        drop table test2;

       

       

        create table  test2(

         str varchar(200)

        );

     

    5.创建表员工表 t_emp

       |-员工id 长度最长为11的整数

       |-员工姓名 name

       |-员工工资 salary 12345.12

       |-生日 birth 日期

       |-职位 job 字符串

       |-员工性别 gender

          

         create table t_emp(

           id number(11),

           name varchar2(30),

           salary number(7,2),

           birth date,

           job varchar2(30),

           gender char(3)

         );

       

      --使用default设置字段的默认值

        drop table t_emp;--将性别默认值为M

        create table t_emp(

          gender char(3) default 'm'  /*单引号表示字符串*/

         

        );

      

      --使用not null设置字段值不能为空

        create table t_emp(

         name varchar2(30) not null

        );

       

     

    6.使用ALTER修改表结构

         --添加新的字段

           语法:alter table  表名 add (新的字段 字段类型,...); 

           --t_emp表中追加deptno的字段

           alter table t_emp add(deptno number(11));

         --删除字段

           语法:alter table 表名 drop column 字段名;

           --删除t_emp表中的gender字段

            alter table t_emp drop column gender;

         --修改列名

            语法:alter table 表名 rename column 旧列名 to 新列名;   

           --t_emp表中的deptno修改为dept_no

           alter table t_emp rename column deptno to dept_no;

         --修改字段类型

            语法:alter table 表名 modify (列名 新类型,...);

            --t_emp表的salary的类型修改为number(5,2)

            alter table t_emp modify (salary number(5,2));

          

    7.truncate:删除表中的数据

        语法:truncate table 表名;

       

        truncate只是清空表中的数据,但是保留表的结构

        drop:将表结构删除

       

    8.DML语句:操作表数据

       |-8.1 插入数据 insert into

              |-语法 INSERT INTO 表名 [(字段名,...)] VALUES(,...)

              --注意:如果是向表中的所有字段添加数据时,可以省略字段名

       --t_emp表中插入数据

       --开发中推荐使用明确字段名

       insert into t_emp(id,name,salary,birth,job,dept_no)

                   values(1001,'yves',123.23,sysdate,'开发',10);

       --不便于维护

       insert into t_emp values(1003,'yvesHe',123.45,sysdate,'测试',20);  

       commit;--提交数据        

                  

       查询表中的所有数据:select * from 表名;-- *通配符,表示所有的字段

      

       |-8.2 删除数据 delete

             |-语法:delete from 表名 [where 过滤条件];  

             delete from t_emp;   --注意:将表中的数据全部删除 

             /*删除数据通常使用where条件

             */

             //删除id=1001的用户

             delete from t_emp where id=1001;/*where是过滤条件*/

     

      deletetruncate的区别

         |-1.delete属于DML语句需要事务的支持

         |-2.truncate属于DDL语句无需事务的支持      

         |-3.delete需要回滚内存空间truncate无需回滚内存空间

         |-4.delete性能要低于truncate 

         |-5.delete保留高水位线truncate删除高水位线 

       

       /*

        DML语句需要事务的管理:

           commit提交数据

           rollback回滚数据

          

          

        */ 

        |-8.3 修改记录 update

              |-语法:update 表名 set 字段名=[,....] [where 过滤条件];

             

              update t_emp set name='jerry';

              //id=1001的用户名改为 jerry,工资改为 888

              update t_emp set name='jerry',salary=888 where id=1001;

             

    9.事务控制语句(配合DML语句一起使用)

        commit:提交事务

        rollback:事务回滚   

        savepoint 事务保存点  

       

        create table temp( id number);  

       

        insert into temp values(1);

        insert into temp values(2);

        savepoint A;--设置事务的保存点

        insert into temp values(3);

        insert into temp values(4);

        insert into temp values(5);

        savepoint B;

        insert into temp values(6);

        insert into temp values(7);

        savepoint C;

        insert into temp values(8);

        rollback to B;--回滚到保存点B,数据到5

        rollback to A;--可以成功,数据到2

        /*rollback to C 报错,事务已经到了B,C不存在了*/

       

        select * from temp;

             

    ❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤

    1.补充的函数

       coalesce(参数列表):返回参数列表中第一个非空参数,最后一个参数通常为常量

     

     --案例:

       年终提成:

         |-1.如果员工的comm不为空,comm

         |-2.如果员工的comm为空,发工资的一半

         |-3.如果salcomm为空,100安慰

        

      select ename,sal,comm,coalesce(comm,sal*0.5,100) comms

      from emp;  

      

     

       case语句:类似于java中的switch语句

      

       case 表达式

         when then 执行的语句 /*没有逗号*/

           ...

         when then 执行的语句

         else 执行语句  /*类似于switch语句中的default*/

       end;

      

       --加薪

        |-ANALYST职位,提高10%

        |-SALESMAN,提高5%

        |-CLERK,提供2%

       

      select ename,sal,job,

         case job

           when 'ANALYST' then sal*1.1

           when 'SALESMAN' then sal*1.05

           when 'CLERK' then sal*1.02

           else sal

         end new_sal

      from emp

       

       

        decode(判断条件,匹配1,1,匹配2,2,...,默认值):函数,case语句的简写

       

      --加薪

        |-ANALYST职位,提高10%

        |-SALESMAN,提高5%

        |-CLERK,提供2%

       

        select ename,sal,job,

        decode(job,'ANALYST',sal*1.1,'SALESMAN',sal*1.05,'CLERK',sal*1.02,sal) new_sal

        from emp;

       

    2.单行函数:一条数据经过函数处理获得一条结果.

        组函数:多条记录经过组函数的处理只会得到一条结果

       

       常见的组函数

        |-count(表达式):计数

          --统计员工表中有多少个员工

          select count(*) from emp;

          select count(ename) from emp;

          --员工表中有多少个员工有提成

          select count(comm) from emp;--可以进行空值处理

          --员工表中有多少个职位

          select count(distinct job) from emp;

        |-max():最大值,min()最小值,avg()平均值,sum()求和

        --员工表中最高的工资

        select max(sal),min(sal),sum(sal),count(ename),avg(sal) from emp;

        --求平均值是需要注意空值处理 

        select sum(comm),avg(nvl(comm,0)),count(ename) from emp;

         

       --获得每个职位的平均工资,最大值,最小值

       group by:分组的关键子

       select job,max(sal),min(sal),avg(sal)

       from emp

       group by job;--表示根据职位进行分组  

         

       --获得每个部门的平均工资,最大值,最小值

       select deptno ,max(sal),min(sal),round(avg(sal)) avg_sal

       from emp

       group by deptno

       order by avg_sal;

      

       注意:如果select后面出现了组函数,那么其他内容必须出现在 group by 子句中.

      

       --获得平均工资大于2000的职位

       select job,round(avg(sal)) avg_sal

       from emp

       group by job

       having round(avg(sal))>2000;/*having是对分组后的结果进行过滤,不能使用别名*/

     

      havingwhere的区别

          |-where是对表中的数据进行过滤,先执行

          |-having是对分组后的结果进行过滤,如果有where先执行where然后分组

        

       

       --获得管理者下面的员工的平均工资, 最低工资不能少于800,没有管理者的不参与统计

       select mgr,round(avg(sal)),min(sal)

       from emp

       where mgr is not null  /*1.where先执行*/

       group by mgr           /*2.分组*/

       having min(sal)>800;   /*3.对分组的结果进行过滤*/

      

       --获得各个部门中工资大于1500的员工人数(先过滤再分组)

            select deptno,count(*)

            from emp

            where sal>1500  /*先过滤*/

            group by deptno;

       

       --平均工资最高的部门

         select  max(avg(sal))

         from emp

         group by deptno;

         

       --那些职位的人数超过2个人,对人数进行排序

       select job,count(ename) nums

       from emp

       group by job  

       having count(ename)>2

       order by nums ; /*注意order by需要保存到最后面*/

      

        

       --薪水最高的员工

       select max(sal) from emp;--获得最高薪水

       select  * from emp where sal=5000;

      

       子查询:在主查询执行之前执行,将执行的结果作为主查询的一个判断依据  

       select ename,sal,deptno

       from emp

       where sal=(select max(sal) from emp);  

      

       注意:1.子查询需要定义在括号当中

            2.子查询通常定义在条件判断的右边

            3.在子查询中不建议使用 order by

           

       --查询谁的薪水比 BLAKE     

         select ename,sal

         from emp

         where sal>(select sal from emp where ename='BLAKE') ;/*避免值过多*/

         /*如果子查询的结果为null 那么结果为null*/

         select ename,sal

         from emp

         where sal>(select sal from emp where ename='yves') ;

         

       --子查询中多行比较符

         in :等于列表中的任何一个

         any:和子查询结果中的任意一个值进行比较

         all:和子查询结果中的所有值进行比较

      

       --获得各个部门中工资最高的员工 

        select ename,sal,deptno

        from emp

        where (deptno,sal) in (select deptno,max(sal) from emp group by deptno);

        

       --谁的工资比20号部门员工的工资都高

       select ename,sal,deptno

       from emp

       where sal>all(select sal from emp where deptno=20) ;/*all大于最大值*/

      

       select ename,sal,deptno

       from emp

       where sal>any(select sal from emp where deptno=20) ;/*any 大于最小值*/

       

      --获得SIMTH 的同部门的员工,除了SIMTN以外 

     

      select ename,deptno

      from emp

      where deptno in (select deptno from emp where ename='SMITH') /*in 可能其他部门有同名的人*/

      and ename!='SMITH';/*ename <> 'SMITH'*/

         

     

      关联子查询:子查询不再是一个独立的SQL语句,依赖外部的主查询传入的参数.

     

      --那些员工的薪水比公司的平均薪水低(非关联子查询实现)

      select ename,sal

      from emp

      where sal<(select avg(sal) from emp);

     

      --那些员工的薪水比本部分的平均薪水要低 

      select ename,sal,deptno

      from emp e /*为当前的emp表取别名*/

      where sal<(select avg(sal) from emp where deptno=e.deptno);

     

      --有下属的员工

      select empno,ename,deptno

      from emp  e

      where exists (select 1 from emp where mgr=e.empno);

     

      注意: exists:如果子查询的有结果返回,true,如果没有结果返回为false,所以exists不关心

      子查询的结果,通常返回一个常量 1,获得定义一个任何字段

        

      select * from emp;

     

      select distinct mgr from emp where mgr is not null;

     

      哪些人不是下属

      select empno,ename,deptno

      from emp  e

      where not exists (select 1 from emp where mgr=e.empno);

     

      select empno,ename

      from emp

      where empno not in (select distinct mgr from emp where mgr is not null);

     

      注意:not in 当中如果有null那么结果为null

     

     

      集合的操作 

       union 去掉重复记录

      

       create table ta( str number);

       insert into ta values(4);

       insert into ta values(3);

       insert into ta values(1);

       insert into ta values(2);

      

      

      

       create table tb(stb number);

       insert into tb values(5);

       insert into tb values(3);

      

       ta={4,3,1,2};

       tb={5,3};

      

       select * from ta

       union    /*合集*/

       select * from tb;

     

       ta union tb={1,2,3,4,5};

      

       select * from ta

       union all

       select * from tb;

      

       ta union all tb={4,3,1,2,5,3};

      

       unionunion all的区别

         |-union:去重复,排序

         |-union all:不重复也不排序.(推荐)

     

       select * from ta

       intersect   /*交集*/

       select * from tb;

      

       ta intersect tb={3};

      

       select * from ta

       minus            /*差集*/

       select * from tb;

      

       ta minus tb ={1,2,4};

       tb minus ta ={5};

      

      

       连接查询:查询多个视图或者数据表时成为连接查询

          |-内连接:返回所有符合连接条件的记录

          |-外连接:返回符合连接条件的记录,同时返回不符合连接条件的记录(左外连接,右外连接)

          |-全外连接:左外连接和右外连接的结果总和

          |-自连接:数据的来源是一个表表,关联条件来自同一个数据表或者视图中

         

         

       --查询员工的姓名和所在部门的名称和地区

       --采用内连接: 1 [inner] join 2 on 关联的条件

       select e.ename,d.dname,d.loc,d.deptno

       from emp e join dept d on e.deptno=d.deptno;

     

       --inner通常被省略,建议在写关联查询时提供表的别名

       select e.ename,d.dname,d.loc,d.deptno

       from emp e inner join dept d on e.deptno=d.deptno;

      

       select e.ename,d.dname,d.loc

       from emp e,dept d

       where e.deptno=d.deptno;

      

      

       --使用外外连接:

         |-左外连接: 1  left outer join 2 on 关联条件

             |-结果集的组成:匹配的数据+1中没有匹配上的数据(结果集中保留表1的完整性)

         |-右外连接: 1 right outer join 2 on 关联条件

             |-结果集的组成:内连接的结果集+2中没有匹配上的数据(保留表2的完整性)  

         |-左左左全,右右右全    

       --获得没有员工的部门

       select e.ename,d.dname,d.loc,d.deptno

       from dept d left outer join emp e on e.deptno=d.deptno

       where e.ename is null;

      

      select e.ename,d.dname,d.loc,d.deptno

      from dept d ,emp e

      where e.deptno(+)=d.deptno;/*保留 d 表的完整性 早期的外连接*/

     

      

      

       查询并显示SALES部门的职位

       select distinct e.job

       from emp e join dept d

       on e.deptno=d.deptno

       where d.dname='SALES';

      

       查询部门的名称,所在地,员工数量,平均工资

      

       select d.dname,d.loc,e.avg_sal,e.count_e

       from dept d

       join

       ( select deptno,avg(sal) avg_sal,count(ename) count_e

         from emp

         group by deptno

       ) e

       on d.deptno=e.deptno;

      

       --自连接

       查询员工以及上司的名称

       select e1.ename employee,e2.ename lidao

       from emp e1,emp e2

       where e1.mgr=e2.empno;

      

       --全外连接 1 full outer join 2

          |-结果集:内连接结果集+左外连接+右外连接

     

       select e.id,e.name,d.name

       from temp_emp e full outer join temp_dept d

       on e.d_id=d.id;

     

       create table temp_emp(id number ,name varchar2(30),d_id number);

       insert into temp_emp values (1001,'yves',1);

       insert into temp_emp values(1002,'yvesHe',2);

       insert into temp_emp values(1003,'lucy',3);

       insert into temp_emp values(1004,'outMan',null);

      

       create table temp_dept(id number,name varchar2(30));

       insert into temp_dept values(1,'开发');

       insert into temp_dept values (2,'财务');

       insert into temp_dept values (3,'测试');

       insert into temp_dept values (4,'前台');

     

    3.表的复制:如果需要对表中的数据进行删除和修改,建议通过复制表中的数据来对数据进行操作

      create table 表名 as 查询语句;

     

      --emp表中的数据复制到t_emp表中

      create table t_emp

      as

      select * from emp;

      --只需要表的结构

      --emp表的结构复制到t_emp表中

      create table t_emp

      as

      select * from emp

      where 1=0;/*提供一个否定条件*/

     

      --只复制一部分数据

      --emp表中部门10的员工的数据复制到t_emp表中

      create table t_emp

      as

      select * from emp

      where deptno=10;

     

      --emp表中的员工姓名,工资,年薪保存到t_emp表中

      create table t_emp

      as

      select ename,sal,sal*12 year_sal /*如果字段中出现函数或者计算需要提供别名*/

      from emp;

     

      --统计emp表中部门的人数,将部门编码和人数保存到t_emp表中

      create table t_emp(did,ecount)

      as

      select deptno,count(ename)

      from emp

      group by deptno;

     

      注意:表的复制只会复制表中的数据,不会复制表中的约束

     

     

    4.伪列

       select rowid ,e.* from emp e;

       rowid:是一个伪列,Oracle独有的.每一条记录的rowid的记录是唯一的

       --删除表中的重复记录

      

       select e.*,d.*

       from emp e,dept d

       where e.deptno=e.deptno;/*连接条件不合理:产生笛卡尔积*/

       笛卡尔积产生的原因

         |-1.没有连接条件

         |-2.连接条件无效

      

       避免笛卡尔积的方法:提供合理的连接条件 

        

       迪卡集的作用:临时获得大量的测试数据.

      

       create table t_emp

       as

       select e.*

       from emp e,dept d

       where e.deptno=e.deptno;

      

       select rowid,e.* from t_emp e;

       --删除重复的记录

       delete from t_emp where rowid not in(

                  select max(rowid) from t_emp group by empno,ename,job,mgr );

      

       select * from t_emp;

      

       rownum:伪列,表示行号

      

       select rownum ,e.* from t_emp e;

      

       --显示t_emp表中前五条记录

       select rownum ,e.* from t_emp e where rownum<=5; /*rownum最小值从1开始*/

      

       --显示t_emp表中第3条到第9条记录

       select rownum ,e.* from t_emp e

       where rownum>=3 and rownum<=9; /*查不出任何结果*/

      

      

       --Oracle,使用rownum进行分页查询

      

       select ee.*

       from

            (select rownum r,e.* from t_emp e ) ee

       where ee.r>=3 and ee.r<=9;    

      

      

       --t_emp表中按照工资进行排序,显示出第 5条到第10

       select ee.*

       from

            (select rownum r,e.* from (select * from t_emp order by sal) e ) ee

       where ee.r>=5 and ee.r<=10;

      

    5.约束条件  

       |-主键约束(PK):primary key

          |-一张表中只能有一个主键约束

          |-主键约束的特点:不能为空,具有唯一性

          |-关系型数据库中使用主键约束唯一标识一行数据

          |-主键约束分为两类

            |-行级约束

            |-表级约束

       --建表时定义主键约束   

       create table 表名(

         字段名 类型 primary key , --列级约束,只能作用一个字段

         ...

        

       );    

      

       --建表时定义表级约束

       create table 表名(

         字段1 类型,

         字段2 类型,

         ...,

         constraint 表名_字段名_PK primary key(字段1,字段2/*字段 1和字段 2 联合作为主键 */

        

       );

      

      

       非空约束(NN):not null

       --语法

       create table 表名(

        字段名 类型 not null

        ....

       );

      

       --定义非空约束名称

       create table 表名(

        字段名 类型 constraint 表名_字段名_NN not null,

        ...

       );

      

       注意:非空约束只有列级约束,没有表级约束

      

       唯一性约束(uk):unique:值必须唯一,可以为null

       --列级约束

       create table 表名(

        字段名 类型 unique,

        ....

       );

       --表级约束

       create table 表名(

        字段1 类型,

        字段2 类型,

        ...,

        constraint 表名_字段名_uk unique(字段1,字段2)

       

       

       );

      

       检测约束(CK):check

       --列级约束

       create table 表名(

        字段名 类型 check(字段名 in(1,...)),

        ....

       );

       --表级约束

       create table 表名(

        字段1 类型,

        字段2 类型,

        ...,

        constraint 表名_字段名_ck check(字段1 in(1,...))

        );

      

       --提供一个用户表 t_user

       create table t_user(

        id number constraint USER_ID_PK primary key,/*表示用户编号,主键*/

        name varchar2(30) constraint USER_NAME_NN not null,

        gender char(3) default 'F',

        constraint USER_NAME_UK unique(name),

        constraint USER_GENDER_CK check(gender in('F','M'))

        );

       

        user_constraints:数据库提供的查看表中约束条件的

       

        --查询t_user表中的约束条件

        select CONSTRAINT_TYPE,CONSTRAINT_NAME from user_constraints where table_name ='T_USER';

       

        insert into t_user values(1001,'yves','F');

        insert into t_user values(1001,'yvesHe','M');--报错,违法主键约束

       

       

        预习:外键约束

        ❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤

    1.关于tab3表内容

    2005-05-09

    2005-05-09

    2005-05-09

    2005-05-09

    2005-05-10

    2005-05-10

    2005-05-10

     

    如果要生成下列结果, 该如何写sql语句?

    /*建表*/

    create table tab3(

     playday date,

     result varchar2(3)

    );

     

    insert into tab3 values(to_date('2005-05-09','yyyy-MM-dd'),'胜');

    insert into tab3 values(to_date('2005-05-09','yyyy-MM-dd'),'胜');

    insert into tab3 values(to_date('2005-05-09','yyyy-MM-dd'),'负');

    insert into tab3 values(to_date('2005-05-09','yyyy-MM-dd'),'负');

     

    insert into tab3 values(to_date('2005-05-10','yyyy-MM-dd'),'胜');

    insert into tab3 values(to_date('2005-05-10','yyyy-MM-dd'),'负');

    insert into tab3 values(to_date('2005-05-10','yyyy-MM-dd'),'负');

     

    要求:

               

    2005-05-09  2  2

    2005-05-10  1  2

    方法1:

    select playday,

           sum(

           case

             when result='胜' then 1

             else 0

           end

           ) ,

            sum(

           case

             when result='负' then 1

             else 0

           end

           )

           from tab3

           group by playday;

    方法2:

    select playday,

           sum(

            decode(result,'胜',1,'负',0)

           ) ,

            sum(

            decode(result,'负',1,'胜',0)

           )

           from tab3

           group by playday;

     

     

     

    2.表中有A B C三列,SQL语句实现

         A列大于B列时选择A列否则选择B

         B列大于C列时选择B列否则选择C

         /*建表*/

         建立一个表:tab4里面有三个字段:A,B,C

      方法1:

      select

       case

         when A>B then A

         else B

       end resultAB,

       case

         when B>C then B

         else C

       end resultBC

      from tab4

     

      sign比较大小的函数

      select sign(-22),sign(100),sign(0) from dual;

      /*结果为:-1,1,0*/

      方法2:

      select decode(sign(A-B),1,A,B) resultAB,decode(sign(B-C),1,B,C) from tab4;

     

    3.一个日期判断的sql语句

    请取出tab5表中日期(SendTime字段)为当天的所有记录?

       (SendTime字段为datetime包含日期与时间)

     /*建表:tab5*/

     select * from tab5 t

     where to_char(t.datetime,'yyyy-MM-dd')=to_char(sysdate,'yyyy-MM-dd');

     

    4.有一张表里面有3个字段语文数学英语其中有3条记录分别表示

      语文70数学80英语58

      请用一条sql语句查询出这三条记录并按以下条件显示出来并写出您的思路): 

      大于或等于80表示优秀大于或等于60表示及格小于60分表示不及格。 

           显示格式: 

           语文              数学                英语 

           及格              优秀                不及格   

      /*建表:tab6*/

      create table tab6(

        语文 number,

        数学 number,

        英语 number

      );

      insert into tab6 values(70,80,58);

     

      方法1:case语句

      select

        (case when 语文>=80 then '优秀'

             when 语文>=60 then '及格'

             else '不及格' end) 语文,

        (case when 数学>=80 then '优秀'

             when 数学>=60 then '及格'

             else '不及格' end) 数学,

        (case when 英语>=80 then '优秀'

             when 英语>=60 then '及格'

             else '不及格' end) 英语               

      from tab6;

     

      方法2:decode

      select

      decode(sign(语文-80),1,'优秀',0,'优秀',-1,

                decode(sign(语文-60),1,'及格',0,'及格',-1,'不及格')) 语文,

      decode(sign(数学-80),1,'优秀',0,'优秀',-1,

                decode(sign(数学-60),1,'及格',0,'及格',-1,'不及格')) 数学,

      decode(sign(英语-80),1,'优秀',0,'优秀',-1,

                decode(sign(英语-60),1,'及格',0,'及格',-1,'不及格')) 英语                   

      from tab6;

     

     

    5用一条SQL语句 查询出每门课都大于80分的学生姓名

    name   kecheng   fenshu

    张三     语文       81

    张三     数学       75

    李四     语文       76

    李四     数学       90

    王五     语文       81

    王五     数学       100

    王五     英语       90

     

     

    /*建表:*/

    create table tab7(

     name varchar2(30),

     course varchar2(39),

     score number

    );

     

    insert into tab7(name,course,score) values('张三','语文',81);

    insert into tab7(name,course,score) values('张三','数学',75);

     

    insert into tab7(name,course,score) values('李四','语文',76);

    insert into tab7(name,course,score) values('李四','数学',90);

     

    insert into tab7(name,course,score) values('王五','语文',81);

    insert into tab7(name,course,score) values('王五','数学',100);

    insert into tab7(name,course,score) values('王五','英语',90);

     

     

    select distinct name from tab7 where name not in(

        select distinct name from tab7 where score<80);

     

     

     

    1.标间约束

       |-主键约束(PK):primary key

          |-作用:唯一标识一行数据

          |-特点:不能为空,唯一

       |-唯一性约束(UK):unique

          |-作用:字段值不能重复

          |-特点:可以为空

       |-非空约束(NN):not null

          |-作用:字段值不能为空

          |-注意:非空约束不能定义表级约束

       |-检测约束(CK):check

          |-作用:字段值只能在指定的内容中选择  

         

         

    2.外键(foreign key):在数据库内部,使用外键来描述表与表之间的关系 

           有外键列的表称为从表(子表),提供参考值的表称为主表(父表)

           外键字段可以参考主表的主键约束或者唯一性约束的字段

          

          

        用户表和订单表

           |-一个用户肯能有多个订单,为了在数据库中描述关系,在订单表中提供外键

          

        --用户表

        create table t_user(

         id number primary key,

         name varchar2(30) not null

         );

        

          

        

       --订单表

       create table t_order(

         oid number primary key,/*订单编号*/

         account number(7,2) not null,/*总金额*/

         pronums number not null,/*货品总数*/

         orderday date,/*下单日期*/

         u_id number references t_user(id) /*定义表级的外键约束,参考用户表的中id*/

       );    

             

       /*注意*/

          |-1.建表时:先建主表,在建立从表

          |-2.插入数据时,先操作主表,再操作从表

          |-3.删除数据时,如没有级联操作,必须先删除子表中的数据,在删除主表中的数据

          |-4.删除表结构,要先删除子表

         

        /*插入数据*/

        insert into t_user values(1001,'yves');

        insert into t_user values(1002,'yvesHe');

       

        insert into t_order

            values(231001,250.25,4,to_date('2015-05-29','yyyy-MM-dd'),1001);

        insert into t_order

             values(231002,1250.25,4,to_date('2015-05-30','yyyy-MM-dd'),1001);

        --插入下列数据出

        --ORA-02291: 违反完整约束条件 (SCOTT.SYS_C004141) - 未找到父项关键字

        --原因:子表中的外键列必须参考父表中的主键值,必须存在的值

        insert into t_order

             values(231002,1250.25,4,to_date('2015-05-30','yyyy-MM-dd'),1003); 

         

         

         

        --删除数据

          --执行下条SQL语句出现

          --ORA-02292: 违反完整约束条件 (SCOTT.SYS_C004141) - 已找到子记录

          --原因:主表的当前数据被从表参考.要先删除从表中的数据

          delete from t_user where id=1001;

         

         

          delete from t_order where  u_id=1001;

         

        --删除表结构

         --执行下条SQL语句出现

         --ORA-02449: 表中的唯一/主键被外键引用

         --原因:当前表的主键被作为其他表的外键

           drop table t_user;

          

           

        --表级约束定义外键  

         --用户表

        create table t_user(

         id number primary key,

         name varchar2(30) not null

         );

        

          

        

       --订单表

       create table t_order(

         oid number primary key,/*订单编号*/

         account number(7,2) not null,/*总金额*/

         pronums number not null,/*货品总数*/

         orderday date,/*下单日期*/

         u_id number, /*定义表级的外键约束,参考用户表的中id*/

         constraint order_user_id_fk foreign key(u_id) references t_user(id)

       );   

      

       级联删除:

        1.默认情况下,必须先删除从表的数据在删除主表的数据

       

       --如何删除表中的约束

       alter table t_order drop constraint order_user_id_fk;

     

      

       on delete set null:当主表的数据被删除时,子表参考的值设为null

        --重新为表t_order添加外键约束

       alter table t_order add constraint order_user_id_fk

                           foreign key(u_id) references t_user(id) on delete set null;

         先删除父表

         delete from t_user where id=1001;

         子表t_order中对应的u_id字段的值被置空

                          

       on delete cascade :当主表的数据被删除时,子表中对应的值也被删除

        --重新为表t_order添加外键约束

       alter table t_order add constraint order_user_id_fk

                           foreign key(u_id) references t_user(id) on delete cascade;

         先删除父表

         delete from t_user where id=1001;

         子表t_order中对应的u_id的整条记录被删除

      

       

         

       drop table t_order;

       drop table t_user;  

      

      

      

      

      

         

        --用户表

        create table t_user(

         id number primary key,

         name varchar2(30) unique  /*唯一性约束*/

         );

        

          

        

       --订单表

       create table t_order(

         oid number primary key,/*订单编号*/

         account number(7,2) not null,/*总金额*/

         pronums number not null,/*货品总数*/

         orderday date,/*下单日期*/

         u_name varchar2(30), /*定义表级的外键约束,参考的主表的唯一性约束的字段*/

         constraint order_user_id_fk foreign key(u_name) references t_user(name)

       );     

         

      

      

       用户表和身份证

       用户表 t_person

       身份证 t_idcard

       一个用户只能有一张身份证,一张身份证对应一个用户

      

       11的描述的策略:唯一外键

       create table t_person(

         id number primary key,

         name varchar2(30)

       );

      

       create table t_idcard(

         id number primary key,

         serial number, /*有效期 */

         p_id number ,

         constraint idcard_person_id_fk foreign key(p_id) references t_person(id),/*外键*/

         constraint idcard_p_id_uk unique(p_id)/*唯一性约束*/

       );

      

       drop table t_idcard;

       drop table t_person;

      

        11的描述的策略:共享主键

       create table t_person(

         id number primary key,

         name varchar2(30)

       );

      

       create table t_idcard(

         id number primary key references t_person(id),/*id即为外键又为主键*/

         serial number /*有效期 */

        );        

         

         

       多对多的关系:必须通过第三张表进行描述

       --学生表

          create table t_stu(

           id number primary key,

           name varchar2(30)

          );

       --课程表

         create table  t_course(

          id number primary key,

          name varchar2(30),

          score number /*总的学分*/

         );  

         

        学生表和课程表示多对多,提供第三张关系表

         create table t_s_c(

          id number primary key,

          s_id number references t_stu(id),

          c_id number references t_course(id),

          score number /*某个学生实际的成绩*/

         );  

        

       约束的建立时机:为了更好的对约束条件进行管理,建议对约束进行命名.在建表之后在提供约束

         --添加约束

         alter table 表名 add constraint 自定义约束名 约束条件;

         注意:非空约束,不能定义表级约束

         alter table 表名 modify (字段名 字段列席 not null );

        

         --删除约束

         alter table 表名 drop constraint 指定的约束名;

        

    3.数据库设计的三范式 

       |-在数据设计时需要遵守的规则,关系型数据库中对这类规则称为范式.

      

      第一范式:每个字段要确保原子性.每个字段不能再进行分解

      第二范式:在第一范式的基础上,确保表中的每一列和主键相关.

      第三范式:在第二范式的基础上,却表表中的字段和主键是直接相关而不是间接相关

      

              

    4.作业

     

      购物系统中的关系

        用户表  t_user

        商品表  t_product

        订单表  t_order

        地址表  t_address

        订单详细表 t_orderitem

         

    ❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤

    1.数据库脚步文件的定义

       1.删除约束条件

       2.删除表结构(先删除主表再删除父表)

       3.建表

       4.定义约束条件

       5.插入测试数据

     

    2.数据字典  

       2.1 数据字典的格式

           user_xxx:当前用户自己的对象

           all_xxx:当前用户能够访问的对象(自己的对象+其他用户授权访问的对象)

           dba_xxx:当前数据库所有的对象

          

           user_tables:当前用户中可以操作的表,查询当前用户下的所有的表名

                        select table_name from user_tables;

           user_constraints:当前用户所有的约束条件

           user_objects:当前用户包含的对象  

     

    3.数据库的对象

       3.1 table :是关系型数据库中基本的存储单元,是一个二维结构由行和列组成.

       3.2 view 视图:是一个虚表,视图会对应一个查询语句.将查询语句的结果赋予一个名字,

                     就是试图的名称,可以像操作表一样操作视图.视图的目的可以保证表的

                     安全和简化查询操作.

       3.3 index 索引:在数据库中用来加速查询的数据库对象.减少磁盘的IO操作,提高访问性能 

       3.4 sequence 序列:用来唯一生成数值的数据库对象.通常使用序列来控制主键值.由数据库内

                         部提供具有安全性和高效性

       3.5 procedure 存储过程:在数据库中完成特定的任何和操作.实现小部分的业务逻辑

       3.6 function 函数:用来进行复杂的计算,返回结果.

       3.7 package :将函数和存储过程组织起来,形成程序组.由包头和包体组成

       3.8 trigger 触发器:在事件发生时隐式的执行,类似于java中的事件监听器

      

      

    4.序列 sequence:连续产生不同的数值作为表的主键值

                     |-oracle,db2中有序列,mysql,sqlserver没有序列

                     |-序列是数据库中独立的对象

                    

       --创建序列 :默认从1开始,步进为 1

       create sequence mytest_seq;   

      

       序列的属性

          |-nextval:获得序列进行步进操作的值,会引起序列值得变化

          |-currval:获得当前序列最大的值,不会引起序列值得变化

      

       访问序列属性:自定义的序列名.nextval / 自定义的序列名.currval

        

        --创建指定的起始值和步进

        create sequence 自定义名称 start with 指定的值 increment by 步进;

       

        create sequence test_seq start with 10000 increment by 2;

       

        create table t_test(

          id number primary key ,

          name varchar2(30)

        );

      

       insert into t_test(id,name) values(test_seq.nextval,'yves');

       insert into t_test(id,name) values(test_seq.nextval,'yves');

       insert into t_test(id,name) values(test_seq.nextval,'yves');

       insert into t_test(id,name) values(test_seq.nextval,'yves');

       insert into t_test(id,name) values(test_seq.nextval,'yves');

       insert into t_test(id,name) values(test_seq.nextval,'yves');

      

       --删除序列

       drop sequence 序列名;

       drop sequence test_seq;--表中的数据不会受影响

     

    5.视图 view

       视图的特点

          |-1.简化复制查询的操作

          |-2.隐藏表中字段 

          |-3.视图是虚表,基表数据的影射

         

      简单视图:视图中的数据就是基表中的子集.

      drop table t_emp;

      --复制emp

      create  table t_emp

      as

      select * from emp where deptno in (10,20);

            

      --使用t_emp表作为基表创建视图

     

      create view v_emp

      as

      select ename,empno,deptno from t_emp where deptno=20;

      

      --查询视图

      select * from v_emp;

      

      --查询视图的结构

      desc v_emp;

     

      --更新基表中的数据,那么视图中对应的记录也会变化

      update t_emp set ename='yves' where empno=7369;

     

      --更新视图中的数据:简单视图在默认情况下可以通过修改视图影响基表中的数据

      update v_emp set ename='yves' where empno=7369;

     

      简单视图防止修改视图影响基表在创建视图时使用 with read only

      --删除视图

      drop view v_emp;

      --创建只读的简单视图

      create view v_emp

      as

      select ename,empno,deptno from t_emp where deptno=20 with read only;

     

     

      复杂视图:数据是通过基表中的数据计算获得.特点只读.

         |-关联视图:视图中的数据通过多张表联合查询获得

      --创建一个试图,显示每个部门有多少员工

      create view v_emp_count

      as

      select deptno,count(ename) emp_num from t_emp group by deptno;

     

      --向基表中插入数据:视图中的数据会变化

      insert into t_emp(ename,empno,deptno) values('yves',1001,10);

      

      --修改视图

      delete from v_emp_count where deptno=10;

     

      --创建视图可以使用create or replace 进行创建:如果没有创建,有就覆盖

     

      create or replace view v_emp_count

      as

      select max(sal) max_sal,avg(nvl(sal,0)) avg_sal from t_emp;

     

     

      --通过数据字典查寻视图

      select text from user_views where view_name='V_EMP_COUNT';--视图对应的sql语句

     

      --scott授予创建视图的权限

       使用sys以管理员身份登录

        grant create view to scott;

     

    6.索引 index:目的提高查询效率

              |-结构:内容+地址

              |-注意:如果字段有频繁的DML操作那么不适合创建索引(可能造成频繁的创建索引)

      

       建表时对于主键约束和唯一性约束自动创建索引(user_indexes)     

         create table t_test(

         id number constraint t_test_id_pk primary key,

         name varchar2(20) constraint t_test_name_uk unique,

         age number constraint t_test_age_nn not null,

         gender varchar2(3) constraint t_test_gender_ck check(gender in('F','M'))

         );

        

         select index_name,index_type from user_indexes where table_name='T_TEST';   

             

         --对于主键字段和唯一性字段如果有where条件会使用到索引

         select * from t_test where id=1000;

         --如果对索引字段进行的计算,那么不会使用索引

         select * from t_test where id/100=10;   --不会使用索引 

         优化=> select * from t_test where id=1000; --可以使用索引

         --条件查询中没有使用索引字段

         select * from t_test where age=10;--全表扫描

     

         手动创建索引

         create index 自定义索引名称 on 表名(字段名);

        

         create index t_test_age on t_test(age);

        

         删除索引

         drop index 自定义名称;

        

    6.如何进行SQL语句的优化  

       |-** select语句中避免使用 *  

       |-** 减少数据库的访问次数

       |-** 删除重复记录

       |-尽量多使用commit

       |-** 使用where替换having

       |-多使用内部函数提高sql语句效率

       |-多使用表的别名

       |-使用exists替换in,使用 not exists替换not in

       |-尽量使用索引类进行查询

       |-sql语句尽量大写.oracle会自动转换成大写

       |-** 避免在索引列上进行计算

       |-** 避免在索引类上使用not,oracle遇到not就使用全表扫描

       |-可以使用>=替换>

       |-使用in替换or

       |-尽量使用where替换group by

       |-** 避免使用消耗资源的操作. union

      

     

    7.数据库的物理组件(物理结构)  

       Oracle主要的物理文件有三类

         |- 数据文件:存储数据,如数据表中的数据,索引数据

         |- 控制文件:记录数据库结构的二进制文件

         |-在线日志文件:记录数据库的日常操作. 用于故障恢复.

        

       费主要的物理文件

         |-密码文件, 参数文件,备份文件,警告和跟踪文件

      

    8.逻辑结构  

       Oracle的逻辑组件:数据库->表空间-->-->->数据块->模式

      

       表空间是oracle中最大的逻辑组件.一个Oracle至少包含一个表空间,系统默认的就是名为

       SYSTEM的系统表空间

       表空间是由一个或者多个数据文件组成,一个数据文件只能和一个表空间进行关联.

      

       :是构成表空间的逻辑结构,段由一组区组成

       为段分配空间区是由数据块组成

       数据块是数据库能够读取操作分配的最小逻辑单元

       模式等同于用户用户所创建数据库对象的总称

      

      

    9.jdbc

    展开全文
  • Oracle基本语法精简详细版本 内容 创建表空间、创建用户、伪列、插入和更改、分区、同义词等相当多的操作
  • oracle基础语法学习

    2012-03-07 21:16:52
    oracle 四大语言
  • oracle 基本语法大全

    千次阅读 2019-01-19 11:38:06
    一、基础 1、说明:创建数据库 CREATE DATABASE database-name  2、说明:删除数据库 drop database dbname 3、说明:备份sql server --- 创建 备份数据的 device USE master EXEC sp_addumpdevice 'disk', '...

    一、基础

    1、说明:创建数据库
    CREATE DATABASE database-name 
    2、说明:删除数据库
    drop database dbname
    3、说明:备份sql server
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
    --- 开始 备份
    BACKUP DATABASE pubs TO testBack 
    4、说明:创建新表
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

    根据已有的表创建新表: 
    A:select * into table_new from table_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only<仅适用于Oracle>
    5、说明:删除新表
    drop table tabname 
    6、说明:增加一个列,删除一个列
    A:alter table tabname add column col type
    B:alter table tabname drop column colname
    注:DB2DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
    7、说明:添加主键: Alter table tabname add primary key(col) 
    说明:删除主键: Alter table tabname drop primary key(col) 
    8、说明:创建索引:create [unique] index idxname on tabname(col….) 
    删除索引:drop index idxname
    注:索引是不可更改的,想更改必须删除重新建。
    9、说明:创建视图:create view viewname as select statement 
    删除视图:drop view viewname
    10、说明:几个简单的基本的sql语句
    选择:select * from table1 where 范围
    插入:insert into table1(field1,field2) values(value1,value2)
    删除:delete from table1 where 范围
    更新:update table1 set field1=value1 where 范围
    查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count as totalcount from table1
    求和:select sum(field1) as sumvalue from table1
    平均:select avg(field1) as avgvalue from table1
    最大:select max(field1) as maxvalue from table1
    最小:select min(field1) as minvalue from table1
    11、说明:几个高级查询运算词
    A: UNION 运算符 
    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 
    B: EXCEPT 运算符 
    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 
    C: INTERSECT 运算符
    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 
    注:使用运算词的几个查询结果行必须是一致的。 
    12、说明:使用外连接 
    A、left (outer) join: 
    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 
    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
    B:right (outer) join: 
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 
    C:full/cross (outer) join: 
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
    12、分组:Group by:
    一张表,一旦分组 完成后,查询后只能得到组相关的信息。
    组相关的信息:(统计信息) count,sum,max,min,avg 分组的标准)
    在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据
    在selecte统计函数中的字段,不能和普通的字段放在一起;

    13、对数据库进行操作:
    分离数据库: sp_detach_db; 附加数据库:sp_attach_db 后接表明,附加需要完整的路径名
    14.如何修改数据库的名称:
    sp_renamedb 'old_name', 'new_name'

    二、提升

    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    法一:select * into b from a where 1<>1(仅用于SQlServer)
    法二:select top 0 * into b from a
    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
    insert into b(a, b, c) select d,e,f from b;

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

    4、说明:子查询(表名1:a 表名2:b)
    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

    5、说明:显示文章、提交人和最后回复时间
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

    6、说明:外连接查询(表名1:a 表名2:b)
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    7、说明:在线视图查询(表名1:a )
    select * from (SELECT a,b,c FROM a) T where t.a > 1;

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2

    9、说明:in 的使用方法
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息 
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

    11、说明:四表联查问题:
    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

    12、说明:日程安排提前五分钟提醒 
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    13、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
    具体实现:
    关于数据库分页:

    declare @start int,@end int 

    @sql nvarchar(600)

    set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’

    exec sp_executesql @sql


    注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引)

    14、说明:前10条记录
    select top 10 * form table1 where 范围

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC)

    17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()

    18、说明:随机选择记录
    select newid()

    19、说明:删除重复记录
    1),delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
    2),select distinct * into temp from tablename
    delete from tablename
    insert into tablename select * from temp
    评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作
    3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段

    alter table tablename
    --添加一个自增列
    add column_b int identity(1,1)
    delete from tablename where column_b not in(
    select max(column_b) from tablename group by column1,column2,...)
    alter table tablename drop column column_b

    20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U' // U代表用户

    21、说明:列出表里的所有的列名
    select name from syscolumns where id=object_id('TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3

    23、说明:初始化表table1

    TRUNCATE TABLE table1

    24、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

    三、技巧

    1、1=1,1=2的使用,在SQL语句组合时用的较多

    “where 1=1” 是表示选择全部 “where 1=2”全部不选,
    如:
    if @strWhere !='' 
    begin
    set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere 
    end
    else 
    begin
    set @strSQL = 'select count(*) as Total from [' + @tblName + ']' 
    end 

    我们可以直接写成

    错误!未找到目录项。
    set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere 2、收缩数据库
    --重建索引
    DBCC REINDEX
    DBCC INDEXDEFRAG
    --收缩数据和日志
    DBCC SHRINKDB
    DBCC SHRINKFILE

    3、压缩数据库
    dbcc shrinkdatabase(dbname)

    4、转移数据库给新用户以已存在用户权限
    exec sp_change_users_login 'update_one','newname','oldname'
    go

    5、检查备份集
    RESTORE VERIFYONLY from disk='E:\dvbbs.bak'

    6、修复数据库
    ALTER DATABASE [dvbbs] SET SINGLE_USER
    GO
    DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
    GO
    ALTER DATABASE [dvbbs] SET MULTI_USER
    GO

    7、日志清除
    SET NOCOUNT ON
    DECLARE @LogicalFileName sysname,
    @MaxMinutes INT,
    @NewSize INT


    USE tablename -- 要操作的数据库名
    SELECT @LogicalFileName = 'tablename_log', -- 日志文件名
    @MaxMinutes = 10, -- Limit on time allowed to wrap log.
    @NewSize = 1 -- 你想设定的日志文件的大小(M)

    Setup / initialize
    DECLARE @OriginalSize int
    SELECT @OriginalSize = size 
    FROM sysfiles
    WHERE name = @LogicalFileName
    SELECT 'Original Size of ' + db_name() + ' LOG is ' + 
    CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + 
    CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
    FROM sysfiles
    WHERE name = @LogicalFileName
    CREATE TABLE DummyTrans
    (DummyColumn char (8000) not null)


    DECLARE @Counter INT,
    @StartTime DATETIME,
    @TruncLog VARCHAR(255)
    SELECT @StartTime = GETDATE(),
    @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

    DBCC SHRINKFILE (@LogicalFileName, @NewSize)
    EXEC (@TruncLog)
    -- Wrap the log if necessary.
    WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
    AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName) 
    AND (@OriginalSize * 8 /1024) > @NewSize 
    BEGIN -- Outer loop.
    SELECT @Counter = 0
    WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
    BEGIN -- update
    INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans
    SELECT @Counter = @Counter + 1
    END
    EXEC (@TruncLog) 
    END
    SELECT 'Final Size of ' + db_name() + ' LOG is ' +
    CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 
    CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
    FROM sysfiles 
    WHERE name = @LogicalFileName
    DROP TABLE DummyTrans
    SET NOCOUNT OFF 

    8、说明:更改某个表
    exec sp_changeobjectowner 'tablename','dbo'

    9、存储更改全部表

    CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
    @OldOwner as NVARCHAR(128),
    @NewOwner as NVARCHAR(128)
    AS

    DECLARE @Name as NVARCHAR(128)
    DECLARE @Owner as NVARCHAR(128)
    DECLARE @OwnerName as NVARCHAR(128)

    DECLARE curObject CURSOR FOR 
    select 'Name' = name,
    'Owner' = user_name(uid)
    from sysobjects
    where user_name(uid)=@OldOwner
    order by name

    OPEN curObject
    FETCH NEXT FROM curObject INTO @Name, @Owner
    WHILE(@@FETCH_STATUS=0)
    BEGIN 
    if @Owner=@OldOwner 
    begin
    set @OwnerName = @OldOwner + '.' + rtrim(@Name)
    exec sp_changeobjectowner @OwnerName, @NewOwner
    end
    -- select @name,@NewOwner,@OldOwner

    FETCH NEXT FROM curObject INTO @Name, @Owner
    END

    close curObject
    deallocate curObject
    GO


    10、SQL SERVER中直接循环写入数据
    declare @i int
    set @i=1
    while @i<30
    begin
    insert into test (userid) values(@i)
    set @i=@i+1
    end
    案例:
    有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:

    Name score

    Zhangshan 80

    Lishi 59

    Wangwu 50

    Songquan 69

    while((select min(score) from tb_table)<60)

    begin

    update tb_table set score =score*1.01 

    where score<60

    if (select min(score) from tb_table)>60

    break

    else

    continue

    end
    数据开发-经典

    1.按姓氏笔画排序:
    Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多

    2.数据库加密:
    select encrypt('原始密码')
    select pwdencrypt('原始密码')
    select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同 encrypt('原始密码')
    select pwdencrypt('原始密码')
    select pwdcompare('原始密码','加密后密码') = 1--相同;否则不相同

    3.取回表中字段:
    declare @list varchar(1000),
    @sql nvarchar(1000) 
    select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'
    set @sql='select '+right(@list,len(@list)-1)+' from 表A' 
    exec (@sql)

    4.查看硬盘分区:
    EXEC master..xp_fixeddrives

    5.比较A,B表是否相等:
    if (select checksum_agg(binary_checksum(*)) from A)
    =
    (select checksum_agg(binary_checksum(*)) from B)
    print '相等'
    else
    print '不相等'

    6.杀掉所有的事件探察器进程:
    DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses
    WHERE program_name IN('SQL profiler',N'SQL 事件探查器')
    EXEC sp_msforeach_worker '?'

    7.记录搜索:
    开头到N条记录
    Select Top N * From 表
    -------------------------------
    N到M条记录(要有主索引ID)
    Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID Desc
    ----------------------------------
    N到结尾记录
    Select Top N * From 表 Order by ID Desc
    案例
    例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句, 找出表的第31到第40个记录。

    select top 10 recid from A where recid not in(select top 30 recid from A)

    分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。

    select top 10 recid from A where……是从索引中查找,而后面的select top 30 recid from A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。

    解决方案

    1, 用order by select top 30 recid from A order by ricid 如果该字段不是自增长,就会出现问题

    2, 在那个子查询中也加条件:select top 30 recid from A where recid>-1

    例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。
    set @s = 'select top 1 * from T where pid not in (select top ' + str(@count-1) + ' pid from T)'

    print @s exec sp_executesql @s

    9:获取当前数据库中的所有用户表
    select Name from sysobjects where xtype='u' and status>=0

    10:获取某一个表的所有字段
    select name from syscolumns where id=object_id('表名')

    select name from syscolumns where id in (select id from sysobjects where type = 'u' and name = '表名')

    两种方式的效果相同

    11:查看与某一个表相关的视图、存储过程、函数
    select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'

    12:查看当前数据库中所有存储过程
    select name as 存储过程名称 from sysobjects where xtype='P'

    13:查询用户创建的所有数据库
    select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')
    或者
    select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01

    14:查询某一个表的字段和数据类型
    select column_name,data_type from information_schema.columns
    where table_name = '表名' 

    15:不同服务器数据库之间的数据操作

    --创建链接服务器 

    exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 

    exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' 

    --查询示例 

    select * from ITSV.数据库名.dbo.表名 

    --导入示例 

    select * into 表 from ITSV.数据库名.dbo.表名 

    --以后不再使用时删除链接服务器 

    exec sp_dropserver 'ITSV ', 'droplogins ' 

    --连接远程/局域网数据(openrowset/openquery/opendatasource) 

    --1、openrowset 

    --查询示例 

    select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 

    --生成本地表 

    select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 

    --把本地表导入远程表 

    insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 

    select *from 本地表 

    --更新本地表 

    update b 

    set b.列A=a.列A 

    from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b 

    on a.column1=b.column1 

    --openquery用法需要创建一个连接 

    --首先创建一个连接创建链接服务器 

    exec sp_addlinkedserver 'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 

    --查询 

    select * 

    FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') 

    --把本地表导入远程表 

    insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') 

    select * from 本地表 

    --更新本地表 

    update b 

    set b.列B=a.列B 

    FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a 

    inner join 本地表 b on a.列A=b.列A 

    --3、opendatasource/openrowset 

    SELECT * 

    FROM opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta 

    --把本地表导入远程表 

    insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名 

    select * from 本地表

    SQL Server基本函数

    SQL Server基本函数

    1.字符串函数 长度与分析用 

    1,datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格
    2,substring(expression,start,length) 取子串,字符串的下标是从“1”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度
    3,right(char_expr,int_expr) 返回字符串右边第int_expr个字符,还用left于之相反
    4,isnull( check_expression , replacement_value )如果check_expression為空,則返回replacement_value的值,不為空,就返回check_expression字符操作类 

    5,Sp_addtype 自定義數據類型
    例如:EXEC sp_addtype birthday, datetime, 'NULL'

    6,set nocount {on|off}使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。
    SET NOCOUNT 为 OFF 时,返回计数

    常识

    在SQL查询中:from后最多可以跟多少张表或视图:256

    在SQL语句中出现 Order by,查询时,先排序,后取

    在SQL中,一个字段的最大容量是8000,而对于nvarchar(4000),由于nvarchar是Unicode码。

    SQLServer2000同步复制技术实现步骤

    一、 预备工作

    1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户

    --管理工具

    --计算机管理

    --用户和组

    --右键用户

    --新建用户

    --建立一个隶属于administrator组的登陆windows的用户(SynUser)

    2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:

    我的电脑--D:\ 新建一个目录,名为: PUB

    --右键这个新建的目录

    --属性--共享

    --选择"共享该文件夹"

    --通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户(SynUser) 具有对该文件夹的所有权限

    --确定

    3.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)

    开始--程序--管理工具--服务

    --右键SQLSERVERAGENT

    --属性--登陆--选择"此账户"

    --输入或者选择第一步中创建的windows登录用户名(SynUser)

    --"密码"中输入该用户的密码

    4.设置SQL Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)

    企业管理器

    --右键SQL实例--属性

    --安全性--身份验证

    --选择"SQL Server 和 Windows"

    --确定

    5.在发布服务器和订阅服务器上互相注册

    企业管理器

    --右键SQL Server组

    --新建SQL Server注册...

    --下一步--可用的服务器中,输入你要注册的远程服务器名 --添加

    --下一步--连接使用,选择第二个"SQL Server身份验证"

    --下一步--输入用户名和密码(SynUser)

    --下一步--选择SQL Server组,也可以创建一个新组

    --下一步--完成

    6.对于只能用IP,不能用计算机名的,为其注册服务器别名(此步在实施中没用到)

    (在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)

    开始--程序--Microsoft SQL Server--客户端网络实用工具

    --别名--添加

    --网络库选择"tcp/ip"--服务器别名输入SQL服务器名

    --连接参数--服务器名称中输入SQL服务器ip地址

    --如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号

    二、 正式配置

    1、配置发布服务器

    打开企业管理器,在发布服务器(B、C、D)上执行以下步骤:

    (1) 从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导

    (2) [下一步] 选择分发服务器 可以选择把发布服务器自己作为分发服务器或者其他sql的服务器(选择自己)

    (3) [下一步] 设置快照文件夹

    采用默认\\servername\Pub

    (4) [下一步] 自定义配置

    可以选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置

    否,使用下列默认设置(推荐)

    (5) [下一步] 设置分发数据库名称和位置 采用默认值

    (6) [下一步] 启用发布服务器 选择作为发布的服务器

    (7) [下一步] 选择需要发布的数据库和发布类型

    (8) [下一步] 选择注册订阅服务器

    (9) [下一步] 完成配置

    2、创建出版物

    发布服务器B、C、D上

    (1)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令

    (2)选择要创建出版物的数据库,然后单击[创建发布]

    (3)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)

    (4)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,SQLSERVER允许在不同的数据库如 orACLE或ACCESS之间进行数据复制。

    但是在这里我们选择运行"SQL SERVER 2000"的数据库服务器

    (5)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表

    注意: 如果前面选择了事务发布 则再这一步中只能选择带有主键的表

    (6)选择发布名称和描述

    (7)自定义发布属性 向导提供的选择:

    是 我将自定义数据筛选,启用匿名订阅和或其他自定义属性

    否 根据指定方式创建发布 (建议采用自定义的方式)

    (8)[下一步] 选择筛选发布的方式

    (9)[下一步] 可以选择是否允许匿名订阅

    1)如果选择署名订阅,则需要在发布服务器上添加订阅服务器

    方法: [工具]->[复制]->[配置发布、订阅服务器和分发的属性]->[订阅服务器] 中添加

    否则在订阅服务器上请求订阅时会出现的提示:改发布不允许匿名订阅

    如果仍然需要匿名订阅则用以下解决办法

    [企业管理器]->[复制]->[发布内容]->[属性]->[订阅选项] 选择允许匿名请求订阅

    2)如果选择匿名订阅,则配置订阅服务器时不会出现以上提示

    (10)[下一步] 设置快照 代理程序调度

    (11)[下一步] 完成配置

    当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库

    有数据

    srv1.库名..author有字段:id,name,phone,

    srv2.库名..author有字段:id,name,telphone,adress

    要求:

    srv1.库名..author增加记录则srv1.库名..author记录增加

    srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新

    --*/

    --大致的处理步骤

    --1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步

    exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql实例名或ip'

    exec sp_addlinkedsrvlogin 'srv2','false',null,'用户名','密码'

    go

    --2.在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动。

    我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动

    go

    --然后创建一个作业定时调用上面的同步处理存储过程就行了

    企业管理器

    --管理

    --SQL Server代理

    --右键作业

    --新建作业

    --"常规"项中输入作业名称

    --"步骤"项

    --新建

    --"步骤名"中输入步骤名

    --"类型"中选择"Transact-SQL 脚本(TSQL)"

    --"数据库"选择执行命令的数据库

    --"命令"中输入要执行的语句: exec p_process

    --确定

    --"调度"项

    --新建调度

    --"名称"中输入调度名称

    --"调度类型"中选择你的作业执行安排

    --如果选择"反复出现"

    --点"更改"来设置你的时间安排

    然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行

    设置方法:

    我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定.

    --3.实现同步处理的方法2,定时同步

    --在srv1中创建如下的同步处理存储过程

    create proc p_process

    as

    --更新修改过的数据

    update b set name=i.name,telphone=i.telphone

    from srv2.库名.dbo.author b,author i

    where b.id=i.id and

    (b.name <> i.name or b.telphone <> i.telphone)

    --插入新增的数据

    insert srv2.库名.dbo.author(id,name,telphone)

    select id,name,telphone from author i

    where not exists(

    select * from srv2.库名.dbo.author where id=i.id)

    --删除已经删除的数据(如果需要的话)

    delete b

    from srv2.库名.dbo.author b

    where not exists(

    select * from author where id=b.id)

    go
    --------------------- 
    作者:紫絮慕雪 
    来源:CSDN 
    原文:https://blog.csdn.net/u012974916/article/details/53156202 
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • oracle基本语法练习

    2011-09-14 11:49:31
    适用SCOTT用户下的mp和depth表的练习
  • oracle基础语法(一)

    2010-12-31 11:29:00
    最最简单的oracle基础语法。慢慢完善中。
  • Oracle基本语法查询语句

    万次阅读 2016-12-21 20:55:39
    Oracle基本查询语法 本文含含: 基础/基本查询/排序/函数(单/多) 一.前言知识 1.oracle如何操作硬盘上的文件,最终都是以进程方式操作硬盘上的文件,最基本进程:读 写 ,还有其他客户端访问内存中的数据库实例,实例在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 111,622
精华内容 44,648
关键字:

orcale基本语法