学习的需求:
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]之间,这个数值越大,越应该使用索引。