返回顶部

【转载】oracle(一)

[复制链接]
飘在云端Lv.9 显示全部楼层 发表于 2017-2-9 15:55:56 |阅读模式 打印 上一主题 下一主题

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 飘在云端 于 2017-2-9 16:01 编辑

是本笔记以orcal数据库为例,其它数据库略有不同.
一、写子句顺序
    Select [ALL | DISTINCT]  column_name [, column_name]...
    From  {table_name | view_name}
              [, {table_name | view_name}]...
    [Where  search_conditions]
    [Group By  column_name [, column_name]
      [Having  search_condition]]
    [Order By  {column_name | select_list_number} [ASC | DESC]
        [,  {column_name | select_list_number} [ASC | DESC]]... ];    --最后
二、常用SQL:
  1.建表前检查语句:
    MySQL的: drop table if exists 表名;
    SQL Server的: IF EXISTS (SELECT name FROM sysobjects  WHERE name = '表名' AND type = 'U') DROP TABLE 表名;
    Oracle的: create or replace table 表名 ...; -- 直接写建表语句
  2.建表语句: create table 表名(memid int , points numeric(10,1) default 0,
        primary key (`memid`, `courseid`),
        FOREIGN KEY (`memid`) REFERENCES 表名2 (`memid`) on delete cascade on update cascade ,
        CHECK ( points>=0 and points<=100 ) );
  3.复制表: CREATE TABLE 新表名 AS SELECT *  FROM 旧表名; -- 仅复制数据,没复制表结构(自增主键等不会复制)
            CREATE TABLE 新表名 like 旧表名; -- 使用旧表创建新表,复制表结构(数据不会复制)
  4.插入语句: INSERT INTO 表名(id,name,price,vend_name) VALUES(11,'TV',222,'US'),(22,'ss',12.22,'kk');
              INSERT INTO 表名(id,name,price,vend_name) SELECT id,name,price,vend FROM 表名2;
  5.更新语句: UPDATE 表名 SET column_name = expression, prod_name = 'NEWCOMPUTER' [WHERE];
              UPDATE 表1, 表2 SET 表2.column_name = expression, 表1.prod_name = 'NEWCOMPUTER' [WHERE];
  6.删除语句: DELETE FROM 表名 WHERE search_conditions;
  7.清空表格: TRUNCATE TABLE 表名;
  8.修改表结构
    修改字段: ALTER TABLE 表名 Modify col_name varchar(100);
    添加字段: ALTER TABLE 表名 Add col_name varchar(100) default NULL COMMENT '匯款帳號或者匯款人' after col_name0;
    减少字段: Alter Table 表名 Drop (column [,column]…);
    添加约束: Alter TABLE 表名 Add FOREIGN KEY(column1) REFERENCES 表名2(column2); -- 添加非空约束时,要用Modify语句
    删除约束: ALTER TABLE 表名 Drop FOREIGN KEY 表名_ibfk_1;
              Alter Table 表名 Drop CONSTRAINT column;
    添加主键: Alter table 表名 add primary key(col);
    删除主键: Alter table 表名 drop primary key(col);
    唯一约束: ALTER [IGNORE] TABLE 表名 ADD UNIQUE INDEX (column [,column]…); -- IGNORE:删除重复; 没这个则重复时报错
  9.创建索引: create [unique] index 索引名 on 表名(column [,column]…);
    删除索引: drop index 索引名;
  10.创建视图:create view 视图名 as select statement;
     删除视图:drop view 视图名;
三、注意事项:
    大小写不敏感,即不区分大小写。提倡关键字大写,便于阅读和调试。
    SQL语句是由简单的英语单词构成;这些英语单词称为关键字/保留字,不做它用。SQL由多个关键字构成。
    SQL语句由子句构成,有些子句是必须的,有些是可选的。
    在处理SQL语句时,其中所有的空格都被忽略(空格只用来分开单词,连续多个空格当一个用)。
    SQL语句可以在一行上写出,建议多行写出,便于阅读和调试。
    多条SQL语句必须以分号分隔。多数DBMS不需要在单条SQL语句后加分号,但特定的DBMS可能必须在单条SQL语句后加分号。
    SQL语句的最后一句以 “;”号结束。不同的数据库会有不同的结束符号。(go也会作结束符)
    {} 大括号包起来的单字或词组,表示至少从中选一个。
    [] 中括号包起来的部分,表示可选可不选的。
    () 小括号,表示一定要输入的。与大括号、中括号不同。
    | 表示最多只能从选项中选取一个。
    , 表示可按需选择多个选项,并且这些选项之间必须以逗号隔开。
    ... 表示可以重复地使用同样的语法部分。
    !  在SQL环境下执行Unix命令。
四、兼顾各数据库的 SQL 语句
    1.自增列:
       Oracle:     建立 Sequence
       MySQL:      create table test_t(id int primary key AUTO_INCREMENT, name varchar(80)); -- AUTO_INCREMENT 是自增关键字
       SQL Server: create table test_t(id int primary key identity(1,1), name varchar(80)); -- identity(1,1) 是自增函数
       access:    create table test_t(id Integer primary key Counter(1,1), name varchar(80));

       通用的: 使用表自身的自增列的最大值+1,如:
       insert into test_t(id, name) values((select nvl(max(id),0)+1 from test_t),'holer');  -- 这里 id 是表的自增列
     2.伪列(序号):
       SELECT (SELECT Count(表名.aa) AS AutoNum FROM xlh WHERE (表名.aa <= 表名_tem.aa)) AS 序号, 表名.aa
       FROM 表名 AS 表名_tem INNER JOIN 表名 ON 表名_tem.aa=表名.aa ORDER BY 表名.aa;
Rownum:纬列。内存里排序的前N个。
    在where语句中,可以用=1,和<=N 或 <N;但不能用=N 或 >N。
    因为这是内存读取,没有1就丢弃再新建1。只能从1开始。需要从中间开始时,需二重子rownum语句需取别名。
经典应用: Top-n Analysis  (求前N名或最后N名)
          Select [查询列表], Rownum
          From (Select  [查询列表(要对应)]
                   From 表
                   Order by  Top-N_字段)
          Where Rownum <= N   -- 不写这行则全部显示并排名。
SQL server的用法:
          Select  top N 查询列表
                  From 表
                  Order by  Top-N_字段
分页显示:
    --取工资第5~10名的员工(二重子rownum语句,取别名)
    select * From (
    select id,last_name,salary,Rownum rn
           From (Select id,last_name,salary
                     from s_emp
                     order by salary desc)
    where rownum <= 10)
    where rn between 5 and 10;

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

云萌主 云萌主-BIGSAAS旗下,由北京合智互联信息技术有限公司在2018年创立,为广大云应用技术爱好者的平台。在云萌主论坛可以查看云应用技术文章、云产品产品最新资讯、技术问答、技术视频。在畅游云上技术的同时,学到最新的云应用产品和技术。
  • 微信公众号

  • Powered by Discuz! X3.4 | Licensed | Copyright © 2001-2022, Aliyun Cloud. | 星点互联设计
  • 京ICP备18052714号 | 营业执照 | |合智互联| QQ