sql杂学

学习的需求:
sql语句,多表连接,查询


orecle plsql



见一个function,orecle的存储过程。查询过程,
1、定义
所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过
编译后存储在数据库系统中。在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数
来调用并执行它,从而完成一个或一系列的数据库操作。

2、存储过程的创建
Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。

(1)无参存储过程语法

复制代码
create or replace procedure NoParPro  
 as  //声明  
 ;  
 begin // 执行  
 ;  
 exception//存储过程异常  
 ;  
 end;  
复制代码
(2)带参存储过程实例

复制代码
create or replace procedure queryempname(sfindno emp.empno%type)   
as  
   sName emp.ename%type;  
   sjob emp.job%type;  
begin  
       ....  
exception  
       ....  
end;
复制代码


(3)带参数存储过程含赋值方式

复制代码
create or replace procedure runbyparmeters    
    (isal in emp.sal%type,   
     sname out varchar,  
     sjob in out varchar)  
 as   
    icount number;  
 begin  
      select count(*) into icount from emp where sal>isal and job=sjob;  
      if icount=1 then  
        ....  
      else  
       ....  
     end if;  
exception  
     when too_many_rows then  
     DBMS_OUTPUT.PUT_LINE('返回值多于1行');  
     when others then  
     DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS过程中出错!');  
end;  
复制代码
其中参数IN表示输入参数,是参数的默认模式。
OUT表示返回值参数,类型可以使用任意Oracle中的合法类型。
OUT模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程
IN OUT表示该参数可以向该过程中传递值,也可以将某个值传出去。

(4)存储过程中游标定义使用

复制代码
as //定义(游标一个可以遍历的结果集)   
CURSOR cur_1 IS   
  SELECT area_code,CMCODE,SUM(rmb_amt)/10000 rmb_amt_sn,  
         SUM(usd_amt)/10000 usd_amt_sn   
  FROM BGD_AREA_CM_M_BASE_T   
  WHERE ym >= vs_ym_sn_beg   
       AND ym <= vs_ym_sn_end   
  GROUP BY area_code,CMCODE;   

begin //执行(常用For语句遍历游标)       
FOR rec IN cur_1 LOOP   
  UPDATE xxxxxxxxxxx_T   
   SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn   
   WHERE area_code = rec.area_code   
   AND CMCODE = rec.CMCODE   
   AND ym = is_ym;   
END LOOP;  
复制代码


(5)游标的定义

复制代码
--显示cursor的处理
declare  
---声明cursor,创建和命名一个sql工作区
cursor cursor_name is  
    select real_name from account_hcz;
    v_realname varchar2(20);
begin 
    open cursor_name;---打开cursor,执行sql语句产生的结果集
    fetch cursor_name into v_realname;--提取cursor,提取结果集中的记录
    dbms_output.put_line(v_realname);
    close cursor_name;--关闭cursor
end;
复制代码
3、在Oracle中对存储过程的调用 

(1)过程调用方式一

复制代码
declare  
      realsal emp.sal%type;  
      realname varchar(40);  
      realjob varchar(40);  
begin   //过程调用开始  
      realsal:=1100;  
      realname:='';  
      realjob:='CLERK';  
      runbyparmeters(realsal,realname,realjob);--必须按顺序  
      DBMS_OUTPUT.PUT_LINE(REALNAME||'   '||REALJOB);  
END;  //过程调用结束 
复制代码
(2)过程调用方式二

复制代码
declare  
     realsal emp.sal%type;  
     realname varchar(40);  
     realjob varchar(40);  
begin    //过程调用开始  
     realsal:=1100;  
     realname:='';  
     realjob:='CLERK';  
     --指定值对应变量顺序可变  
     runbyparmeters(sname=>realname,isal=>realsal,sjob=>realjob);           
    DBMS_OUTPUT.PUT_LINE(REALNAME||'   '||REALJOB);  
END;  //过程调用结束  
复制代码
(3)过程调用方式三(SQL命令行方式下)

1、SQL>exec  proc_emp('参数1','参数2');//无返回值过程调用  
2、SQL>var vsal number  
     SQL> exec proc_emp ('参数1',:vsal);// 有返回值过程调用  
      或者:call proc_emp ('参数1',:vsal);// 有返回值过程调用  












如何建一个function
创建一个sql
orecle的存储过程平移到大数据平台上,insert语句
主要是sql语句:多表连接,数据库的检索,那个字段出自不同的表,gruoby,计算,用文本编辑器把脚本写出来编译到大数据平台。
posql命令怎么做。


SELECT - 从数据库中提取数据
UPDATE - 更新数据库中的数据
DELETE - 从数据库中删除数据
INSERT INTO - 向数据库中插入新数据
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引

-----------------------------------------------------------
sql升序
SELECT column_name,column_name
FROM table_name
ORDER BY column_name,column_name ASC|DESC;

-------------------------------------------------------------
插入语句;
第一种形式无需指定要插入数据的列名,只需提供被插入的值即可:

INSERT INTO table_name
VALUES (value1,value2,value3,...);
第二种形式需要指定列名及被插入的值:

INSERT INTO table_name (column1,column2,column3,...)
VALUES (value1,value2,value3,...);
--------------------------------------------------------------
SQL UPDATE 语句
UPDATE 语句用于更新表中已存在的记录。

SQL UPDATE 语法
UPDATE table_name
SET column1=value1,column2=value2,...
WHERE some_column=some_value;
-------------------------------------------------------------
SQL DELETE 语句
DELETE 语句用于删除表中的行。

SQL DELETE 语法
DELETE FROM table_name
WHERE some_column=some_value;

DELETE FROM Websites
WHERE name='百度' AND country='CN';

删除所有数据
您可以在不删除表的情况下,删除表中所有的行。这意味着表结构、属性、索引将保持不变:

DELETE FROM table_name;

或

DELETE * FROM table_name;
-------------------------------------------------------------
SQL GROUP BY子句用于协同SELECT语句用来安排相同的数据分组。
GROUP BY子句在SELECT语句的WHERE子句之后并ORDER BY子句之前。
GROUP BY子句的基本语法如下。GROUP BY子句中必须遵循WHERE子句中的条件,如果使用必须先于ORDER BY子句。

SELECT column1, column2
FROM table_name
WHERE [ conditions ]
GROUP BY column1, column2
ORDER BY column1, column2

SQL> SELECT NAME, SUM(SALARY) FROM CUSTOMERS
     GROUP BY NAME;


CREATE INDEX index_name
ON table_name (column_name)
------------------------------------索----------引----------------------------------
 SQL中的索引分为两种,一种为聚集索引和非聚集索引,下面介绍两者的异同。

一、聚集索引与非聚集索引:
  1、聚集索引:
  聚集索引的意思可以理解为顺序排列,比如一个主键自增的表即为聚集索引,即id为1的存在于第一条,id为2的存在于第二条...假使数据库中是使用数组来存放的这张表中的数据,那么如果我需要查找第100条,那么直接第一条数据的地址加上100即为第一百条的地址,一次就能查询出来。
  因为数据库中的数据只能按照一个顺序进行排列,所以聚集索引一个数据库只能有一个。在mysql中,不能自己创建聚集索引,主键即为聚集索引,如果没有创建主键,那么默认非空的列为聚集索引,如果没有非空的列那么会自动生成一个隐藏列为聚集索引。
  所以一般在mysql中,我们创建的主键即为聚集索引,数据是按照我们的主键顺序进行排列。所以在根据主键进行查询时会非常快。

 2、非聚集索引:
 非聚集索引可以简单理解为有序目录,是一种以空间换取时间的方法。举个例子,在一个user表中,有一个id_num,即身份号,此不为主键id,那么这些数据在存储的时候都是无序的,比如
  id为1的id_num为100,id为2的id_num为97,id为3的id_num为98,id为4的id_num为99,id为5的id_num为96。。。id为67的id_num为56。。。
  那么如果我要查找id_num为56的人,那么只能一条一条的遍历,n条就需要查询n次,时间复杂度为O(n),这是非常耗费性能的。

  所以,现在就需要为id_num增加非聚集索引,添加了非聚集索引后,会给id_num进行排序(内部使用结构为B+树),并且排序后,我只需要查询此目录(即查询B+树),很快就知道为id为56的在数据库中的第67条,而不需要在去遍历表中的所有数据。
  所以,在非聚集索引中,不重复的数据越多,那么索引的效率越高。

二、索引的操作:
  我们平常在数据库中使用的索引一般非聚集索引,下面介绍其使用方法:

1、创建索引:
1.1、创建普通索引:
模式:
CREATE INDEX 索引名 ON 表名(列名1,列名2,...);
或者
修改表: ALTER TABLE 表名ADD INDEX 索引名 (列名1,列名2,...);
或者
创建表时指定索引:CREATE TABLE 表名 ( [...], INDEX 索引名 (列名1,列名 2,...) );

eg:
CREATE INDEX name_index ON index_test(name);
此为在index_test表上的name列上创建一个索引name_index。

测试的表为:
CREATE TABLE index_test (
id INT  NOT NULL,
    name VARCHAR(50),
    idNum INT,
    PRIMARY KEY (id)
);

1.2、创建唯一索引:
表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique
下面三种模式都可以创建唯一索引:
  1、创建索引:CREATE UNIQUE INDEX 索引名 ON 表名(列的列表);
  2、在表上增加索引:ALTER TABLE 表名ADD UNIQUE 索引名 (列的列表);
  3、创建表时指定索引:CREATE TABLE 表名( [...], UNIQUE 索引名 (列的列表) );
eg:
 CREATE UNIQUE INDEX id_num_index ON index_test(idNum);
也可以写成下面的形式:
 ALTER TABLE index_test ADD UNIQUE id_num_index(idNum);
此为在index_test表的idNum列上创建一个唯一索引id_num_index

在创建了唯一索引之后,列中即不能重复,比如,现在我给表中插入一条重复的值,会报:
Error Code: 1062. Duplicate entry '3' for key 'id_num_index'
即在id_num_index唯一索引上出现了重复。

  2、删除索引:
以下两种模式都可以删除索引:

DROP INDEX index_name ON talbe_name
ALTER TABLE table_name DROP INDEX index_name

eg:
DROP INDEX name_index ON index_test;
此为删除在index_test表上的name_index索引                                             

  3、查看索引:
    SHOW INDEX FROM index_test;
即返回index_test表中的所有索引。

在返回的字段中,

Table:表的名称
Non_unique:是否不唯一,0为唯一,1不为唯一
Key_name:索引的名称
Seq_in_index:索引中的列序列号,从1开始
Column_name:列名称
Collation:列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。
Cardinality:索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。
Sub_part:如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
Packed:指示关键字如何被压缩。如果没有被压缩,则为NULL。
Null:如果列含有NULL,则含有YES。如果没有,则该列含有NO。
Index_type:用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment:更多评注。

三、索引的选择原则:
  非聚集索引在数据库创建、增加、删除、修改的时候都需要作出相应的修改,所以,使用索引也是有一定的原则,即:

  1、较频繁的作为查询条件的字段应该创建索引
  2、重复太多的字段不适合单独创建索引,即使频繁作为查询条件
  3、不会出现在WHERE子句中的字段不应该创建索引

 以下两种情况不建议使用索引:
  1、表的记录比较少,比如只有几百,一千条记录,那么没必要建立索引,直接全表查询即可。
  2、不重复的字段越多,那么索引的价值越高,查看不重复的字段占总体的比例可以使用下面的sql语句:
    SELECT count(DISTINCT(name))/count(*) AS Selectivity FROM index_test;
  比如上面这个sql就是判断index_test表中name字段中不重复的值占整体的比例,这个比例应该在(0,1]之间,这个数值越大,越应该使用索引。






















猜你喜欢

转载自blog.csdn.net/qq_33202508/article/details/80643535