Oracle数据库的常用SQL语句的书写

--创建表空间
create tablespace mytablespace1
datafile 'd:\orc1.ora'
size 100M;

create tablespace mytablespace2
datafile 'd:\orc2.ora'
size 100M;
--删除表空间
--drop tablespace mytablespace1;

--创建用户
/**
创建用户
create user 用户名
identified by 密码
[default tablespace 表空间名];
*/
create user myadmin
identified by java
default tablespace mytablespace1;

--授权
/**
grant 权限 to 用户名;
权限:dba,resouces(存储过程、视图、触发器),select|insert|update|delete
*/
grant dba to myadmin;

--回收权限
--revoke dba from myadmin;

--访问myadmin用户的表
select * from myadmin.clazz;

--oracle的数据备份
/**
只备份数据,不会备份约束
*/
create table neworders
as
select * from oe.orders;
/**
只备份表的结构,不会备份约束
*/
create table neworders1
as
select * from oe.orders where 1=2;
/*********************************************/

select * from neworders;
--oracle使用||连接字符串
/*********************************************/
select c.cust_first_name||'.'||c.cust_last_name 姓名 from oe.customers c;
/*********************************************/


--创建表
create table clazz(
  cid number(9) primary key,
  cname varchar2(50) not null
);

create table student(
  sid number(9) primary key,
  sname varchar2(50) not null,
  sex varchar2(4) default '男',
  address varchar2(100),
  birthday date,
  classid number(9) not null references clazz(cid)
);

--插入
insert into clazz values(1,'java1班');
insert into clazz values(2,'java2班');
insert into clazz values(3,'java3班');
insert into clazz values(4,'java4班');
insert into clazz values(5,'java5班');
--提交数据事务
commit;
select * from clazz;

--插入学生数据(注意日期类型的字段)
insert into student values(1,'张飞','男','北京','11-12月-1998',1);
commit;

select * from student;

/***********************************************/
select * from oe.orders order by order_id;
--获取订单表的订单金额最高的前5条记录
/**
使用rownum进行取值
*/
select a.*,rownum  from
(select  od.*,rownum from oe.orders od order by od.order_total desc) a
where rownum>0 and rownum<=5;
/************************************************/

--按照每页5条记录获取订单表的数据
/**
分页语法
select a.* from (select b.*,rownum r from 表 b 
where rownum<=(当前页数*每页记录数)) a
where r>(当前页-1)*每页记录数
*/
/**************第1页*********************/
select a.* from (select b.*,rownum r from oe.orders b 
where rownum<=5 order by b.order_id) a
where r>0;

/**************第2页*********************/
select a.* from (select b.*,rownum r from oe.orders b 
where rownum<=10 order by b.order_id) a
where r>5;

/**************第3页*********************/
select a.* from (select b.*,rownum r from oe.orders b 
where rownum<=15 order by b.order_id) a
where r>10;
/********************************************************/


--同义词,相当于表的别名
create public synonym  myorders for oe.orders;

--访问同义词
select * from myorders;

--删除同义词
drop public synonym myorders;

--序列
/**
用于生成连续的唯一的整数
主要为表的主键字段提供键值
*/
create sequence seq_sid
increment by 5
start with 1000;

delete from myadmin.student;
commit;

select * from myadmin.student;

--使用序列的值为student表的主键赋值
/**
seq_sid.nextval:用于获取序列的下一个值
*/
insert into myadmin.student 
values(seq_sid.nextval,'曹操'||seq_sid.currval,'男','西安','8-8月-1998',1);
commit;

--获取序列的下一个值
select seq_sid.nextval from dual;

--获取序列的当前值
select seq_sid.currval from dual;

--删除序列
drop sequence seq_sid;

--创建和更新视图的语法
/**
create or replace view 视图名
as
select语句;
*/
--oracle的函数库
--字符函数
/****************************************************/
--字符的截取
/*select substr('helloworld',开始位置,截取的长度) from dual;*/
select substr('helloworld',6,5) from dual;
/****************************************************/
/****************************************************/
--字符的去除字符串左右空格
/*select substr('helloworld',开始位置,截取的长度) from dual;*/
select trim('   hello world  ') from dual;
/****************************************************/

/****************************************************/
--字符的左右填充
/*select substr('helloworld',开始位置,截取的长度) from dual;*/
select lpad('hello',10,'*') from dual;
select rpad('hello',10,'*') from dual;
select rpad(substr('13909876543',1,7),11,'*') from dual;
/****************************************************/

/****************************************************/
--日期函数
--获取当前日期
select sysdate from dual;

--给当前日期增加3个月
select add_months(sysdate,3) from dual;

--获取指定月份最后一天的日期
select last_day('12-2月-2020') from dual

--获取两个月份之间的差值
--当前日期与2018年的6月25日相差多少月=12.3820463709677
select months_between(sysdate,'25-6月-2018') from dual;

--对日期四舍五入
select round(sysdate,'year') from dual;
select round(sysdate,'month') from dual;
select round(sysdate,'day') from dual;

--根据星期的数值,获取所在的日期
select next_day(sysdate,7) from dual;

--截断日期
select trunc(sysdate,'year') from dual;
select trunc(sysdate,'month') from dual;
select trunc(sysdate,'day') from dual;
/****************************************************/

/****************************************************/
--转换函数
--1将数字转为字符串
select '1'||'2' from dual;

--将日期转字符串
select to_char(sysdate,'yyyy-MM-dd') from dual; 
--12小时制
select to_char(sysdate,'yyyy-MM-dd HH:mi:ss') from dual;
--24小时制
select to_char(sysdate,'yyyy-MM-dd HH24:mi:ss') from dual;

select to_char(sysdate,'yyyy') from dual;
select to_char(sysdate,'month') from dual;
select to_char(sysdate,'dd') from dual;--一个月的第n天
select to_char(sysdate,'day') from dual;--一个星期的星期数
/****************************************************/

/****************************************************/
--字符串转日期
select to_date('2019-12-22','yyyy-MM-dd') from dual;
--12小时制
select to_date('2019-12-22 12:21:22','yyyy-MM-dd hh:mi:ss') from dual;
--24小时制
select to_date('2019-12-22 18:21:22','yyyy-MM-dd hh24:mi:ss') from dual;
/****************************************************/

/****************************************************/
--其它函数
--获取当前登录的用户id
select uid from dual;
select user from dual;

select nvl('111','test') from dual;--相当于a==null?a:b;
/****************************************************/

--oracle面向对象
/****************************************************/
--抽象数据类型(实体类,c/c++的结构体)
/**
create or replace type address_type as object(
    字段 类型,
    ....
         
); 
*/
create or replace type address_type1 as object(
  sheng varchar2(50),
  shi varchar2(50),
  jiedao varchar2(150),
  zip varchar2(50)
);
--类型的使用,字段的类型使用
create table authors(
  aid number(9) primary key,
  aname varchar2(50) not null,
  address  address_type1
);

--给表插入数据
insert into authors 
values(1,'武松',address_type1('山东省','淄博市','景阳冈','890009'))
commit;

--更新自定数据的值,使用自定义类型的字段时,使用表的别名访问
update authors a set 
       a.address.sheng='辽宁省',
       a.address.shi='铁岭市',
       a.address.jiedao='本山街'
 where a.aid=1;
 --或者
 update authors a set 
       a.address=address_type1('辽宁省','铁岭市','本山街','880099')
 where a.aid=1;
commit;

--删除自定义类型的数据(被表使用的数据类型不能删除)
drop type address_type1;
--注意:删除类型前,先删除使用了类型的表

select * from authors;
/****************************************************/


/****************************************************/
--oracle中的数组类型--收集器
/**
create or replace type 数组名称 as varray(数组长度) of 数组元素类型(长度);
*/
create or replace type namearray_type as varray(5) of varchar2(50);

--创建表,使用数组类型作为字段类型,一个客户对多个产品名称
create table myorders(
  mid number(9) primary key,
  cname varchar2(50) not null,
  pnames namearray_type
); 

--给数组插入数据
insert into myorders values(
  1,'武松',
  namearray_type('香皂','洗衣粉','牙刷','牙膏','洗衣液')
);
insert into myorders values(
  2,'鲁智深',
  namearray_type('西瓜','卤肉','炸鸡腿','圣代','冰激凌')
);
insert into myorders values(
  3,'林冲',
  namearray_type('苹果','葡萄','桃子','栗子','歪果仁')
);
commit;

--修改可变数组的值
update myorders m set m.pnames= namearray_type('鸡爪子','猪头肉','炸鸡腿','烤肉串','冰啤酒')
where m.mid=2;
commit;
select * from myorders;

--查看可变数组的数据
/****************************************************/
select a.mid,a.cname,b.* from myorders a,the(select mo.pnames from myorders mo where mo.mid=1) b
where a.mid=1; 
--
select a.mid,a.cname,b.* from myorders a,the(select mo.pnames from myorders mo where mo.mid=2) b
where a.mid=2; 

--
select a.mid,a.cname,b.* from myorders a,the(select mo.pnames from myorders mo where mo.mid=3) b
where a.mid=3; 

select a.* from 
       the(select mo.pnames from myorders mo where mo.mid=1) a
/****************************************************/

--嵌套表
/****************************************************/
--1建立抽象类型
create or replace type stu_type as object(
  sid number(9),
  sname varchar2(50),
  sex varchar2(4)
);

--2基于学生类型建立表类型
create or replace type stu_table_type as table of stu_type;

--创建表使用表类型
create table clazz(
  cid number(9) primary key,
  cname varchar2(50) not null,
  stu stu_table_type 
)nested table stu store as student_type_table;

--插入数据
insert into clazz
values(
   1,'java1班',
   stu_table_type(
      stu_type(1,'张飞','男'),            
      stu_type(2,'马超','男'),
      stu_type(3,'关羽','男'),
      stu_type(4,'赵云','男'),
      stu_type(5,'黄忠','男')
   )
);

commit;
select * from clazz;

--查看表类型的数据 
select a.* from table(select c.stu from clazz c where c.cid=1) a
/**************************************************************************************/

--pl/sql
/**********************************************/
declare--声明区
  a number(9):=5;
  b number(9):=10;
  c number(9);
begin--代码区
  c:=a+b;
  dbms_output.put_line('a+b='||c);--输出
end;
/**********************************************/

--使用into关键字将表的字段值传递给变量
/**********************************************/
--编写pl/sql将订单表的订单编号、日期、客户名称和订单总金额进行输出显示
declare
   oid number(9);
   odate date;
   cname varchar2(50);
   ototal number;
   cid number(9);
begin
   --获取订单编号为2458的订单数据   
   select 
          od.order_id,od.order_date,od.customer_id,od.order_total
          into
          oid,odate,cid,ototal
    from oe.orders od where od.order_id=2459;
    
    --根据客户编号,获取客户姓名
    select
         cs.cust_first_name||'.'||cs.cust_last_name
         into cname
    from oe.customers cs where cs.customer_id=cid;
   
     --输出显示
     dbms_output.put_line('订单编号:'||oid);
     dbms_output.put_line('订单日期:'||to_char(odate,'yyyy-MM-dd'));
     dbms_output.put_line('客户名称:'||cname);
     dbms_output.put_line('订单金额:'||ototal);
end;

/**********************************************/

--引用类型
/***
1、表名.列名%type:引用表的列类型做为变量的数据类型使用
2、表名%rowtype:引用表的行记录为变量的数据类型,又称为行类型
*/
/**********************************************/
--编写pl/sql将订单表的订单编号、日期、客户名称和订单总金额进行输出显示
declare
   oid oe.orders.order_id%type;
   odate oe.orders.order_date%type;
   cname varchar2(50);
   ototal oe.orders.order_total%type;
   cid oe.customers.customer_id%type;
begin
   --获取订单编号为2458的订单数据   
   select 
          od.order_id,od.order_date,od.customer_id,od.order_total
          into
          oid,odate,cid,ototal
    from oe.orders od where od.order_id=2458;
    
    --根据客户编号,获取客户姓名
    select
         cs.cust_first_name||'.'||cs.cust_last_name
         into cname
    from oe.customers cs where cs.customer_id=cid;
   
     --输出显示
     dbms_output.put_line('订单编号:'||oid);
     dbms_output.put_line('订单日期:'||to_char(odate,'yyyy-MM-dd'));
     dbms_output.put_line('客户名称:'||cname);
     dbms_output.put_line('订单金额:'||ototal);
end;

/**********************************************/

--行类型的使用
select * from oe.product_information;
/**
获取商品编号为1755的商品信息
*/
/**********************************************/
declare
   prows oe.product_information%rowtype;--声明行变量prows
begin
   select 
          p.* into prows --将整行记录传递给变量prows  
    from oe.product_information p where p.product_id=1755;
    dbms_output.put_line('产品名称:'||prows.product_name);
    dbms_output.put_line('产品种类:'||prows.category_id);
    dbms_output.put_line('产品价格:'||prows.list_price);
    dbms_output.put_line('产品网址:'||prows.catalog_url);
end;
/**********************************************/

--条件控制if
/**
语法
if 条件 then
   sql语句块
else
   sql语句块
end if;       
*/
/**********************************************/
--根据产品编号查询产品信息,如果存在则显示信息,否则显示查无此记录
declare
   prows oe.product_information%rowtype;--声明行变量prows
   num number;
begin
   --获取指定编号的记录数量
   select count(p.product_id) into num from  oe.product_information p
           where  p.product_id=1756;
   if num>0 then
     
       select 
              p.* into prows --将整行记录传递给变量prows  
        from oe.product_information p where p.product_id=1756;
        dbms_output.put_line('产品名称:'||prows.product_name);
        dbms_output.put_line('产品种类:'||prows.category_id);
        dbms_output.put_line('产品价格:'||prows.list_price);
        dbms_output.put_line('产品网址:'||prows.catalog_url);
   else
       dbms_output.put_line('查无记录存在!');     
   end if;    
end;
/**********************************************/

--oracle的循环语句
--loop循环
/**
语法:
loop
  循环语句
  exit when 退出循环的条件;
  ....
end loop;  
*/
/**************************************************/
--使用loop循环实现1-100的累加
declare
   i number:=0;
   j number:=0;
begin
   loop
     i:=i+1;
     j:=j+i;
   exit when i>100;
     dbms_output.put_line('i='||i);
     dbms_output.put_line('j='||j);
     dbms_output.put_line('----------------');
   end loop;
end;
/**************************************************/
--while循环
/**
语法
while 条件表达式 loop
   ......
end loop;   
*/
/**************************************************/
/**
使用while循环完成1-100累加
*/
declare
   i number:=0;
   j number:=0;
begin
  while i<100 loop
    i:=i+1;
    dbms_output.put_line('i='||i);
    j:=j+i;
    dbms_output.put_line('j='||j);
    dbms_output.put_line('----------------');     
  end loop;
end;
/**************************************************/

/**
使用for
语法:
for 变量 in 范围 loop
   ...
end loop;   
*/
/**************************************************/
--使用for循环实现1-100累加
declare
   j number:=0;
begin
  for i in 1..100 loop
    dbms_output.put_line('i='||i);
    j:=j+i;
    dbms_output.put_line('j='||j);
    dbms_output.put_line('----------------');
  end loop;
end;
/**************************************************/

--异常的使用
/**************************************************/
--根据产品编号查询产品信息,如果存在则显示信息,否则显示查无此记录
declare
   prows oe.product_information%rowtype;--声明行变量prows
begin
       select 
              p.* into prows --将整行记录传递给变量prows  
        from oe.product_information p;--where p.product_id=1756;
        dbms_output.put_line('产品名称:'||prows.product_name);
        dbms_output.put_line('产品种类:'||prows.category_id);
        dbms_output.put_line('产品价格:'||prows.list_price);
        dbms_output.put_line('产品网址:'||prows.catalog_url);
exception
     when no_data_found then dbms_output.put_line('无此记录存在!');
     when too_many_rows then dbms_output.put_line('查找的记录太多,无法赋值!');
end;
/**********************************************/

--游标的使用
/**************************************************/
/**
语法
declare
    cursor 游标名 is select语句;
begin
    open 游标名;--打开游标
    ....
    fetch 游标 into 变量;--操作游标
    ...
    close 游标名;
end;
*/
/*******************************************************/
--使用游标获取客户编号为101的所有订单信息
select * from oe.orders od where od.customer_id=101;
---
declare
  cursor myorders_cursor is select * from oe.orders od where od.customer_id=101;
  orows oe.orders%rowtype;
begin
  open myorders_cursor;--打开游标
  loop
      fetch myorders_cursor into orows;--操作游标
      exit when myorders_cursor%notfound;
      dbms_output.put_line('订单编号:'||orows.order_id);
      dbms_output.put_line('订单日期:'||orows.order_date);
      dbms_output.put_line('订单模式:'||orows.order_mode);
      dbms_output.put_line('订单金额:'||orows.order_total);
      dbms_output.put_line('--------------------------');
  end loop;
  close myorders_cursor;--关闭游标
end;

/*******************************************************/
--使用for循环游标
declare
  cursor myorders_cursor is select * from oe.orders od where od.customer_id=101;
  --orows oe.orders%rowtype;
begin
  for orows in myorders_cursor loop --for循环游标
      dbms_output.put_line('订单编号:'||orows.order_id);
      dbms_output.put_line('订单日期:'||orows.order_date);
      dbms_output.put_line('订单模式:'||orows.order_mode);
      dbms_output.put_line('订单金额:'||orows.order_total);
      dbms_output.put_line('--------------------------');
  end loop;
end;
/*******************************************************/
--oracle的存储过程和函数
--存储过程
/****
语法:
create or replace procedure 过程名(参数1 类型,参数2 out 类型,.....)
is
  --局部变量的声明
  变量 类型
begin
   ....
end;

--过程的执行
declare
   变量 类型;
   ...
begin
   过程名(传入的参数值,变量,....); 
   ..... 
end;        
*/
/***************************************************************/
--编写存储过程,传递订单编号,获取订单的日期、金额和客户的名称
create or replace procedure proc_orders(oid number,odate out date,
                                        ototal out number,cname out varchar2)
is
   cid number;
begin
    --获取订单信息 
    select 
          od.order_date,od.customer_id,od.order_total
          into
          odate,cid,ototal
    from oe.orders od where od.order_id=oid;
    --获取客户信息
    --根据客户编号,获取客户姓名
    select
         cs.cust_first_name||'.'||cs.cust_last_name
         into cname
    from oe.customers cs where cs.customer_id=cid; 
end;     
/*************执行存储过程**************/
declare
   odate date;
   ototal number;
   cname varchar2(50);
begin
   proc_orders(2458,odate,ototal,cname);
   dbms_output.put_line('订单日期:'||odate);
   dbms_output.put_line('订单金额:'||ototal);
   dbms_output.put_line('订单客户:'||cname);
end;
                                   
/***************************************************************/

/****使用存储过程调用游标*******************/
create or replace procedure proc_order_cursor(cid number)
is
   cursor myorders_cursor is select * from oe.orders od where od.customer_id=cid;
begin
    for orows in myorders_cursor loop --for循环游标
      dbms_output.put_line('订单编号:'||orows.order_id);
      dbms_output.put_line('订单日期:'||orows.order_date);
      dbms_output.put_line('订单模式:'||orows.order_mode);
      dbms_output.put_line('订单金额:'||orows.order_total);
      dbms_output.put_line('--------------------------');
  end loop;
end;
/*******************************************/
--执行过程
begin
     proc_order_cursor(103);
end;

--函数
/****
函数语法
create or replace function 函数名(参数1 类型,....) return 返回值类型
is
   局部变量 类型;
   ..... 
begin
  ....
  return 返回值;
end;

函数的调用
select 函数名(参数...) from dual;
或者
declare
  变量 类型;
begin
  变量:=函数(参数值...);
end;
*/
/********************************************/
create or replace function addx(a number,b number) return number
is
 c number;
begin
 c:=a+b;
 return c;
end;  
/********************************************/
select addx(12,2) from dual;--调用函数
/********************************************/

/***************************************************/
--编写函数,传递客户编号,获取客户的姓名
create or replace function getCname(cid number) return varchar2
is
  cname varchar2(50);
begin
  select 
         c.cust_first_name||'.'||c.cust_last_name
         into 
         cname
  from oe.customers c where c.customer_id=cid; 
  
  return cname;
end;
--调用
select getCname(101) from dual;
/***************************************************/

你可能感兴趣的:(数据库)