创建table

create table TABLENAME
(col_name1 number not null, col_name2 varchar2(30) not null)
#描述数据表
describe TABLENAME;

修改列名+ 列属性

alter table TABLENAME rename column COL_NAME_BEFORE to COL_NAME_AFTER;alter table TABLENAME modify (COL_NAME NEWTYPE)
alter table table_test modify (colname1 varchar2(15)) #example

增加列+删除列

alter table TABLENAME add (COL_NAME TYPE)
alter table table_test add (colname1 varchar2(15))alter table TABLENAME drop column COL_NAME

删除表以及相关表约束

drop table TABLENAME cascade constraints

临时表

临时表数据被清理的条件:
- 事务提交或回滚 commit/rollback
- 会话结束 (当前界面窗口如sql window或command window)

#会话临时表
create global temporary table TABLENAME (COL_NAME1 TYPE1, COL_NAME2 TYPE2) on commit preserve rows;
#事务临时表
create global temporary table TABLENAME (COL_NAME1 TYPE1, COL_NAME2 TYPE2) on commit delete rows;

Dual表的应用场景

select sysdate from dual
select 1+2*3 as result from dual

主键+外键+唯一性约束

create table TABLENAME
(col_name1 number not null, col_name2 varchar2(30) not null,
constraint pk_col primary key(col1,col2))
#为已存在的表创建主键
alter table TABLENAME modify(COL_NAME TYPE primary key)
alter table TABLENAME drop primary key
alter table TABLENAME drop constraint pk/fk/unique_name
alter table TABLENAME disable primary key
alter table TABLENAME disable constraint pk/fk/unique_name
alter table TABLENAME enable primary key
alter table TABLENAME rename constraint name1 to name2
#唯一性约束
create table TABLENAME
(col_name1 number not null, col_name2 varchar2(30) unique,
constraint pk_col primary key(col1,col2))
alter table TABLENAME add constraint name unique(col_name)
#检查性约束
create table employees (employee_id number primary key, grade varchar2(20), salary number,
constraint chk_salary check(grade in 'MANAGER', 'LEADER', 'STAFF') and
(grade = 'MANAGER' and salary < 8000 or grade = 'LEADER' and salary < 5000 or grader = 'STAFF' and salary < 3000))#默认值约束
create table employees (employee_id number primary key, grade varchar2(20), salary number, e_date date default sysdate)

外键约束使得修改主表或者外键表受到一定程度的外键列约束。比如删除主表里customer_id = 1的,如果orders表里也有customer_id = 1的列,就无法执行

#建立orders表到customers表的外键关联
alter table orders add constraint fk_orders_customers foreign key(customer_id) references customers(customer_id)
  • 级联更新
alter table orders add constraint fk_orders_customers foreign key(customer_id) references customers(customer_id) deferrable initially deferredupdate customers set customer_id = 3 where customer_id = 1
update orders set customer_id = 3 where customer_id = 1
commit
  • 级联删除
alter table orders add constraint fk_orders_customers foreign key(customer_id) references customers(customer_id) on delete cascadedelete from customers where customer_id = 3
#主外表均被删除

视图

视图用于存储查询,但不存储数据。通过修改、更新视图可以修改基础数据表中和视图直接相关的列表。

create or replace view vw_employees as select employee_id,
last_name||first_name as employee_name,
province || '-' || city as location, salary from employees;

lpad() / rpad()

select lpad('21',6,'0') stock_code from dual;
#return 000021
select lpad('1234567',6,'0') stock_code from dual;
#return 123456

lower() / upper() / initcap() / length()

substr()

select substr('1234567890',5,4) from dual;
#return 5678 从第五位开始的4个字符。index从1开始。
select substr('1234567890',5) from dual;
#return 567890

instr()

select instr('big big tiger','big') from dual;
#return 1 返回big首次出现的位置
select instr('big big tiger','big',2) from dual;
# return 5 从第二个字符开始,返回找到的big首次出现的位置
select instr('big big tiger','big',2,2) from dual;
# return 0 从第二个字符开始,返回找到的big第二次出现的位置

ltrim() / rtrim() / trim()

to_char()

select to_char(0.96,'9.99') from dual;
#return .96 9代表0-9任意数字
select to_char(0.96,'0.00') from dual;
#return 0.96 0可保留数字为0的数
select to_char(5897.098,'$/U999,999,999.000') from dual;
#return $/¥5,897.098
select to_char(sysdate,'yyyy-mm-dd') from dual;
#return 2020-04-11

abs() / round() / ceil() / floor() / mod() / sqrt() / power()

sign()

select sign(8) from dual;
#return 1
select sign(-8) from dual;
#return -1
select sign(0) from dual;
#return 0

to_number()

select to_number('257.90') from dual;
#return 257.9

to_date()

select to_date('12/02/09','mm/dd/yy') from dual;
#return 2009-12-02

add_months()

select to_char(add_months(sysdate,2),'yyyy-mm-dd') from dual;
#return 2020-06-11

last_day()

select to_char(last_day(sysdate),'yyyy-mm-dd') from dual;
#return 2020-04-30

months_between()

select months_between(sysdate,to_date('2020-08-01','yyyy-mm-dd')) from dual;
#return -3.643100358422939

current_date

select sessiontimezone, to_char(current_date,'yyyy-mm-dd hh:mi:ss') from dual;

extract()

select extract(year from sysdate) from dual;

nvl()

处理空值

select employee_id, nvl(employee_name, '未知') employee_name,
nvl(sum(s.salary),0) salary from t_employees;
#如果employee_name值为空,返回未知
#如果sum(salary)值为空,返回0

cast()

强制转换列的数据类型

create table tmp_salary as
select cast(salary_id as varchar2(20)) salary_id,
cast(salary as varchar2(20)) salary
from t_salary

between/in/like/is null/exists

all/some/any

select * from t_salary where salary > all(select distinct salary from t_salary where employee_id = 4 or employee_id = 5);
#salary > 6000 and salary > 7000
select * from t_salary where salary > some/any(select distinct salary from t_salary where employee_id = 4 or employee_id = 5);
#salary > 6000 or salary > 7000

decode()

类似于if elseif else

select e.employee_id, e.employee_name, decode(sign(avg(s.salary)-6000),'1','high_income', '0','avg_income','low_income') incoming
from t_employees e, t_salary s
where e.employee_id = s.employee_id
group by e.employee_id, e.employee_name

rank() / dense_rank() / row_number()

select student_name, rank() over(order by student_age) position from students;
#return 1 2 2 4 4 4 7
select student_name, dense_rank() over(order by student_age) position from students;
#return 1 2 2 3 3 3 4
select student_name, row_number() over(order by student_age) position from students;
#return 1 2 3 4 5 6 7

partition by

select t.*, dense_rank over(partition by department order by salary) position
from salary t
order by t.employee_id### !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
select t.*,
sum(salary) over(partition by department) total_salary,
round(avg(salary) over(partition by department)) average_salary
from salary t
order by t.employee_id
##与group by不同的是输出形式,这个可以保留其他列,新增列会有重复显示。

rows子句

select employee_id, employee_name, sum(salary) over(order by employee_id rows between 1 preceding and 1 following) three_total
from salary
#如不足3条,则返回有的条数的运算结果
#参见14.8

range子句

select employee_id, employee_name, count(1) over(partition by department order by salary range between 500 preceding and 500 following) employee_count
from salary
order by employee_id
#参见14.8

first_value() / last_value()

取得第一行的数据

select distinct department, first_value(employee_name) over(partition by department order by salary) employee_name,
first_value(salary) over(partition by department order by salary) salary
from salary
#参见14.8

lead()

向下取

#增加一列next_name记录按部门划分薪资排序每个雇员后面的雇员名(薪资高一位)
select employee_id, employee_name, salary, lead(employee_name,1,'N/A') over(partition by department order by salary) next_name
from salary
order by employee_id
#参见14.8

lag()

同lead(),向上取

greatest()

函数

## 创建函数
create or replace function hello_world()
return varchar2 as
begin return "Hello World!";
end hello_world;## 调用函数输出返回值
set serverout on;
declare msg varchar2(20);
begin msg := hello_world();dbms_output.put_line(msg);
end;## Or
select hello_world msg from dual;## Ex.2
create or replace function get_tax(p_salary number)
return number as
begin declare tax_salary number;begin tax_salary := p_salary - 2000;if tax_salary <= 0 thenreturn 0;end if;if tax_salary <= 500 then return tax_salary*5/100;end if;end;
end get_tax;
## 存储过程
## in参数:可传入数值,但不可在存储过程中更改值
## out参数:可存入数值并输出
create or replace procedure update_students(in_age in number, out_age out number) as
begin update students set student_age = in_age;select student_age into out_age from students where student_id = 1;commit;
end update_students;## 调用
set serverout on;
declare update_age number;
beginupdate_students(20,update_age);dbms_output.put_line(update_age); //return 20;
end;
## in out 参数
create or replace procedure swap(inOut_param1 in out number, inOut_param2 in out number) as
begin declare param number;beginparam := inOut_param1;inOut_param1 := inOut_param2;inOut_param2 := param;end;
end swap;

其他

##查询雇员姓名中第二个字母是A的所有雇员
select * from emp where ename like "_A%"
  1. 空字符和null在查询时都需要通过is null来查询

Oracle常用语法总结相关推荐

  1. oracle常用语法

    Oracle常用语法: 添加一列: alter   table   A   add( CFYJSNR  varchar2(20)); 修改列: alter  table A  rename   col ...

  2. ORACLE 常用的SQL语法和数据对象

    一.数据控制语句 (DML) 部分 1.INSERT  (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, --) VALUES ( 值1, 值2, --); INSE ...

  3. Oracle常用傻瓜问题1000问

    1. Oracle安装完成后的初始口令? internal/oracle sys/change_on_install system/manager scott/tiger sysman/oem_tem ...

  4. Oracle存储过程语法

    原文链接:http://www.jb51.net/article/31805.htm Oracle存储过程基本语法 存储过程  1 CREATE OR REPLACE PROCEDURE 存储过程名  ...

  5. 给oracle用户赋权限导入导出,Oracle常用命令-用户、表空间、赋权限、导入导出...

    1.1   删除表空间 drop tablespace QBKJ including contents and datafiles; 1.2   删除用户 drop user admin cascad ...

  6. ORACLE基础语法学习

    ORACLE 常用的 SQL 语法和数据对象 一 . 数据控制语句 (DML) 部分 1.INSERT ( 往数据表里插入记录的语句 ) INSERT INTO 表名 ( 字段名 1, 字段名 2, ...

  7. Oracle常用命令大全(经典收藏)

    一.ORACLE的启动和关闭  1.在单机环境下  要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下  su - oracle a.启动ORACLE系统  oracle>svr ...

  8. Oracle 常用命令举例

    Oracle 常用命令举例 ? 基本语法 ? % type用法 ? %rowtype用法 ? TYPE用法 ? 游标的使用 ? for 循环 ? loop循环 ? while循环 ? if / els ...

  9. Oracle常用sql操作总结

    一.选择行 1. 简单的SELECT 语句  SELECT 字段名1 [AS] '字段名1 解释' FROM table; 2. 处理NULL  NVL函数可把NULL转换成其它类型的符号  编程技巧 ...

最新文章

  1. SharedPreferences小细节
  2. 1.14 sort()数组排序(升序和降序)
  3. php缓存实例,一个PHP缓存类实例
  4. 解决flask端口被占用的问题
  5. C/C++ OpenCV之Canny边缘检测
  6. 服务器访问危险网站降权重,网站权重下降,原因有哪些?如何处理?
  7. datetime(0) NULL DEFAULT NULL报错
  8. 思科钱伯斯:云安全是根本
  9. 邹城的关于机器人教育_【喜报】我校机器人队问鼎全国大学生机器人大赛冠军!...
  10. 国外计算机论文翻译,计算机论文外文翻译
  11. IXI数据预处理 + Linux + freesurfer
  12. Excel单元格的相对绝对混合引用
  13. linux内核 自旋锁示例,自旋锁(示例代码)
  14. 瑞芯微RK3399六核-迅为3399开发板介绍
  15. 网络游戏服务器之 日志系统
  16. 计算机类普刊有哪些,可以快速发表论文的计算机普刊
  17. 麻进:这次不烧作品!
  18. 蓝桥杯 Basic--3 字母图形
  19. 802.11协议WIFI扫描
  20. js 数组遍历方法详解(map、filter、find、findIndex、reduce)

热门文章

  1. 超过65536行的数据导入Vfp9、导出至Excel
  2. 淮阴工学院计算机科学与技术咋样,淮阴工学院计算机学院计算机科学与技术专业(NIIT)人才培养方案介绍...
  3. 在线教育巨头3P大战 猿辅导可能第一个倒下
  4. Log4j文章的补遗
  5. 大图片上的像素风格游戏图片分割
  6. js 中有关字符串的操作
  7. 【软件包合集】keil C51 C251 MDK V5 V4 v3 v2 所有版本软件包下载(包括最新)【官网地址】
  8. 呼伦贝尔计算机学院广场舞,有一种记忆,叫做呼院人的民族民间广场舞
  9. jQuery已经是时代的眼泪了吗?
  10. 字典树应用——词频统计 (C++实现)