ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

SQL · PLSQL - 复习笔记

2022-01-05 01:32:16  阅读:225  来源: 互联网

标签:复习 -- name cursor SQL var table select PLSQL


Oracle的发展

Oracle的发展历程

Oracle数据库的基本结构

image-20220104200658824

Oracle数据库的逻辑结构

image-20220104201730508

Oracle数据库的物理结构

数据文件

日志文件

控制文件

参数文件

Oracle的内存结构

Oracle的进程结构

数据库及管理

数据库操作

相关术语

  • 数据库名

  • 数据库实例名

    数据库名与实例名之间的关系

  • 操作系统环境变量

  • 数据库域名

  • 全局数据库名

  • 数据库服务名

数据库配置修改

  • NET服务名
  • TNS文件配置

创建数据库 - create database database_name

表空间的创建和管理

SQL语言

数据定义语言 - DDL

常见数据类型

  • char
  • varchar
  • int 或者 integer
  • smallint
  • real \ float \ double
  • numeric
  • DateTime
  • Text
  • Image

create

create table Student(
	sno char(20) primary key,
	sname varchar(20) not null
);

-- Oracle中
    -- 复制表
    create table table_name as select * from table_name;
    -- 只复制表结构
    create table table_name as select * from table_name
        where 1=2;

primary key 用来指示表的关键字(主码)

也可以这样用:primary key(sno,cno)

not null 用以表现字段不能为空

创建视图

create view view_name as (select * from table_name);
-- 注意 as

创建约束


alter

  • add

    alter table table_name add column_name 数据类型;
    -- 例如,给Student表添加字段 phone char(16)
    alter table Student add phone char(16);
    
  • alter

    -- 修改表结构
    -- alter table 表名 alter column 字段名 字段类型
    alter table table_name alter column sdept varchar(1);
    
  • drop

    -- 删除字段
    alter table table_name drop column column_name;
    

drop

drop table Student;

删除表顺序应当是:关联表 -- 基本表

删除约束

数据操纵语言 - DML

select

select column_name from table_name where 
select column_name from table_name table_name_temp where
-- table_name_temp为table_name的代替,此时不使用as说明
-- where条件中table_name由table_name_temp代替

rownum

select * from (select * from table_name) 
	where rownum<=number;
	-- 找出在结果select * from table_name中的前number列
	-- 只能使用 "<" or "<="

insert

insert into table_name() values ();
-- 也可省略成
insert into table_name values();

update

update table_name set colmun=() where 

delete

delete from table_name where 

数据控制语言 - DCL

grant

-- 给用户赋予连接权
grant connect to user_name;
    -- 具有connect权限的用户 == 具有权限
    -- alter table
    -- create table/index
    -- drop table/view/index
    -- grant
    -- revoke
    -- insert/select/update/delete
    -- audit/noaudit
    
-- 给用户分配建表权
grant create table to user_name;
	-- 此时用户不能成功建表,因为没有表空间操作权
alter user user_name quota size on table_space_name;
	-- table_space_name一般为users
	
-- 将select权限赋予一个角色
grant select on table_name to (角色名);
	-- 将select权限赋予所有人
grant select on table_name to public;

在给用户赋予连接权之前,创建用户:
create user user_name identified by password

如果使用某版本的 Oracle,用户名前需要带上 C##
即写为 C##user_name

注意 create table权限和 create any table权限的区别

revoke

-- 收回用户的建表权
revoke create table from user_name;

deny

常用SQL语句

通配符

  • "%" 匹配任意字符串
    
  • "_" 匹配任意一个字符
    

如果需要查询的条件中包括通配符,例如:查找名字中带有 "__"的数据

-- escape 规定转义字符为'\'
select sname from Student where sname like '%\_%' escape '\';

order by

  • ASC - 升序
  • DESC - 降序

group by

聚合函数

  • avg

  • sum

  • min

  • max

  • count

    统计去重后的数量:count (distinct column_name)

having

用在 group by子句后面,针对聚合函数的结果值进行筛选

块插入

insert into Student() 
	select column_name from table_name where 
-- select子句的column与Student()对应

连接

内连接

外连接

查看常量

-- Oracle
	-- Oracle中常量放在dual中
	select sysdate from dual; 
	
-- SQL Server
	select getdate();

用户输入

select * from table_name where column_name=&temp;
-- &temp为用户输入

PL/SQL

匿名块 - 测试程序

不能直接使用DDL

declare
	变量
	-- 变量赋值语句为 var_name:=constant
begin
	程序
	-- "<>" "!=" 不等于
	-- "||" 连接
	-- "and" 并且
	-- "or" 或者
exception
	when then
end;

if then - elsif then - else - end if;

if then
elsif then
else
end if;

loop - end loop

-- 循环
loop
	exit when -- 结束循环
end loop;

-- while
while () loop
end loop;

-- for
for var in [] loop
end loop;

常用函数

输出一行:dbms_output.put_line();

dbms_output.put_line('muhuai');

输出不带空行:dbms_output.put()

字节填充:rpad();

dbms_output.put_line(rpad('muhuai',number,char_c));
-- number为输出行的字符长度,char_c为填充字符

游标

显式游标

声明游标

游标和查询关联

cursor cursor_name is select 

使用游标

-- 打开游标
open cursor_name;
close cursor_name;

-- 遍历游标
-- 需要一个游标类型的变量
var_cursor cursor_name%rowtype;
fetch cursor_name into var_cursor;
-- 此时游标将第一条数据放入var_cursor
open cursor_name;
	fetch cursor into var_cursor;
	while cursor%found loop
		-- 循环在游标便利结束后结束
	end loop;
close cursor_name;
select for update

隐式游标

无法open/close/loop/fetch

游标在commit操作后重置

sql%found -- 说明语句修改到行
sql%notfound -- 说明语句没有修改到行
sql%rowcount -- 语句修改到的行数

动态游标 - 游标变量 - 弱游标

游标的具体查询语句不在 declare 块中定义,在 declare 块中只定义游标名称,sql语句定义在 begin 块中

declare
	type ref_cursor_name is ref cursor; -- 定义变量
	var_ref_cursor ref_cursor_name; -- 动态游标
begin
	open var_ref_cursor for select ; -- 打开动态游标
	-- 此时游标为var_ref_cursor
	-- 遍历动态游标,方法同遍历游标
	close var_ref_cursor;
end;

存储过程

需要通过主程序调用(测试程序调用)

主程序调用之前,过程程序段需要运行保存一下

create or replace procedure procedure_name 
[(var_in in var_type,var_out out var_type)] is
	-- 变量定义
begin
	-- 程序
exception
end;
-- 测试程序调用
declare
begin
	procedure_name[(var_in,var_out)];
	-- 或者
	procedure_name[(var_1=>var_in,var_2=>var_out)];
end;

函数

需要通过主程序调用(测试程序调用)

主程序调用之前,过程程序段需要运行保存一下

create or replace function function_name
[(var_in in var_type)] [return return_type] is
begin
	-- 如果有 return,则一定要 return
end;

需要通过主程序调用(测试程序调用)

主程序调用之前,过程程序段需要运行保存一下

创建 -- 程序块 -- 包

包头和包体不在同一程序块中,但是保证包头名和包体名相同

-- 包头
create or replace package package_name is
	-- 变量定义
	var var_type;
	cursor cursor_name is select ;
	procedure procedure_name
	(var_in in_type,var_out out out_type);
	function function_name(var_in in_type)
    return return_type;
end package_name;
-- 包体
create or replace package body package_name as
	-- 包体变量定义
begin
	-- 包头程序、函数的实现
end package_name;
-- 测试程序
declare

begin
	var_1:=package_name.var;
	package_name.procedure_name();
	var_2:=package_name.function_name();
	open package_name.cursor_name;
	close package_name.cursor_name;
end;

SQL开发

动态SQL - 针对DDL和不确定的DML

execute immediate用以执行PL/SQL中的SQL语句

execute immediate
'create table table_name ···';

触发器

类似于过程或者函数

发生在DML操作上

触发器名字不可相同

-- 创建触发器
create or replace trigger trigger_name
[before|after|instead of] [insert|delete|update]
on table_name for each row
begin
	if inserting then
	elsif updating then
	elsif deleting then
	end if;
end;

-- 删除触发器
drop trigger trigger_name;

-- 禁止|打开触发器
alter trigger trigger_name disable|enable;

伪记录

-- :new
-- delete 语句不存在相应的 :new
-- :old
-- insert 语句不存在相应的 :old

raise_application_error

-- 自定义错误类型返回
-- 因为Oracle中错误码-20000以前都被占用了,所以自定义错误码从-20000开始
-- 错误码取值范围 [-20000,-20999]
if then
	raise_application_error(-20000,'报错内容');
end if;

标签:复习,--,name,cursor,SQL,var,table,select,PLSQL
来源: https://www.cnblogs.com/muhuai-bokeyuan/p/15765216.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有