消除重复行
SELECT DISTINCT DEPTNO FROM EMP
查看表结构
(CMD命令中)DISCRIBE EMP
优先级 NOT>AND>OR
ORDER BY ASC升序 DESC降序
LOWER 全部转换成小写
UPPER 全部转换成大写
INNITCAP 首字母大写其他小写
CONCAT 连接两个值等同于||
SUBSTR (expression,n1,n2)截取字符从n1开始,n2个字符,如果n1为负数则从右往左数
LENGTH(expression) 获取字符长度
INSTR (s1,s2,n1,n2)返回s2在s1中从n1开始第n2次出现的位置,n1,n2可以不写,默认值为1
LPAD (S1,N1,S2)返回S1被S2从左面填充到N1长度的字符串
SELECT LPAD(‘DE’,6,’*’) FROM DUAL 结果 ****DE
RPAD(S1,N1,S2) 返回S1被S2从右面填充到N1长度的字符串
SELECT LPAD(‘DE’,6,’*’) FROM DUAL 结果 DE****
TRIM去除字符串头部或尾部(头尾)的字符
SELECT TRIM(‘S’FROM ‘SSMITH’) FROM DUAL 结果 MITH
REPLACE(S1,S2,S3)把S1中的S2用S3替换
ROUND(expression,n1) 四舍五入到n1位,正数表示小数点后面,负数表示小数点前面
TRUNC(expression,n1) 截取到第n1位正数表示小数点后面,负数表示小数点前面
select to_char(23.45,'0000.000') from dual 结果: 0023.450
select to_char(23.45,'9999.999') from dual 结果: 23.450
select to_char(123123,'99,999,999.99') from dual 结果: 123,123.00
select to_char(123123.3,'FM99,999,999.99') from dual 结果:123,123.3
select to_char(123123.3,'$99,999,999.99') from dual 结果: $123,123.30
select to_char(123123.3,'L99,999,999.99') from dual 结果: ?23,123.30
select to_char(123123.3,'99,999,999.99C') from dual 结果: 123,123.30GBP
MOD(m,n)返回m除以n的余数
日期函数(格式碼CC世纪,YY,MM,DD,HH,MI,SS)
SYSDATE 返回系统日期
MONTHS_BETWEEN 返回两个日期相差的月数
SELECT MONTHS_BETWEEN(HIREDATE1,HIREDATE2) FROM DUAL
ADD_MONTHS 返回指定日期加上相应月数后的日期
SELECT ADD_MONTHS(HIREDATE,3)FROM DUAL
NEXT_DAY 返回某一日期指定的下一指定日期
SELECT NEXT_DAY(‘1,6月,2017’,‘星期一’)FROM DUAL 返回2017年6月1号的下一个星期一是几号
LAST_DAY 返回指定日期当月最后一天的日期
SELECT LAST_DAY(‘1,6月,2017’)FROM DUAL
ROUND(date[,’fmt’]) 将date按照fmt指定的格式四舍五入,如果没有指定fmt则默认为DD,将date四舍五入为最近的一天
TRUNC(date[,’fmt’]) 将date按照fmt指定的格式截断,如果没有指定fmt则默认为DD,将date四舍五入为最近的一天
EXTRACT 返回年或月或日
SELECT EXTRACT(MONTH FROM HIREDATE) FROM EMP
SELECT TO_CHAR(HIREDATE,'YY/MM/DD')FROM EMP指定格式转换
YYYY 完整数字表示的年份
YEAR 年份的英文表示
MM 两位数字表示月份
MONTH 月份的全名
DAY 星期几
DY 三个英文缩写表示星期
通用函数
NAL(N1,N2)如果N1不为null则返回N1,否则返回N2
NAL(N1,N2,N3)如果N1不为null则返回N2,否则返回N3
NULLIF(N1,N2)比较两个表达式,如果相等返回null,否则返回N1
SELECT COALESCE(COMM,0) COMM,DEPTNO FROM EMP返回第一个不为空的参数,参数个数不受限制
**************************************************
select ENAME,DEPTNO,
(CASE DEPTNO
WHEN 10 THEN '销售部'
WHEN 20 THEN '技术部'
WHEN 30 THEN '管理部'
else 'WU' END)
DEPTNAME
FROM DEPT
***************************************************
select ENAME,DEPTNO,
DECODE( DEPTNO
10, '销售部'
20, '技术部'
30, '管理部'
'WU' )
FROM EMP
99语法:
SELECT TABLE1.COLUM1 ,TABLE2. COLUM2 FROM TABLE1
CROSS JOIN TABLE2 交叉连接 ,产生笛卡尔积
NATURAL JOIN TABLE2 自然连接
JOIN TABLE2 USING COLUM
JOIN TBLE2 ON TABLE1.COLUM=TABLE2.COLUM
LEFT/RIGHT/FULL OUTER /JOIN TABLE2 ON TABLE1.COLUM=TABLE2.COLUM 全外连接为99独有
92语法
SELECT TABLE1.COLUM1 ,TABLE2. COLUM2 FROM TABLE1
WHERE TABLE1.COLUM=TABLE.COLUM 自然连接
WHERE TABLE1.COLUM=TABLE.COLUM(+) 左外连接
WHERE TABLE1.COLUM(+)=TABLE.COLUM 右外连接
授予视图权限:
登陆system 账户,密码oracle 语法:grant create view to scott
DDL(schema data definition)数据库模式定义语言create alter drop truncate
DCL(data control language) 数据库控制语言grant deny revoke
DML数据操作语言 insert delete update select
数值类型及函数
number是oracle中的数据类型
Precision代表精度,sacle代表小数位数;Precision范围[1,38],scale范围[-84,127]
常用方法:
abs()求绝对值:select abs(-3) as absvalue from dual
round()四舍五入:select round(33.54,1) as roundvalue from dual,第二个参数为保留到小数第几位
ceil()向上取整:select ceil(33.34) as roundvalue from dual 结果:234
floor()向下取整:select floor(33.34) as roundvalue from dual 结果:33
mod()取模:select mod(5,3) as roundvalue from dual 结果:2
Sign()正负性:select sign(-4) as roundvalue from dual正数为1,负数为-1
Sqrt()求平方根:select sqrt(9) as sqrtvalue from dual 结果:3
Power()求乘方:select power(2,3) as powervalue from dual 结果:8
Trunc截取:select trunc(274364.3645,3) as truncvalue from dual 结果:274364.364
select to_char(23.45,'0000.000') from dual 结果: 0023.450
select to_char(23.45,'9999.999') from dual 结果: 23.450
select to_char(123123,'99,999,999.99') from dual 结果: 123,123.00
select to_char(123123.3,'FM99,999,999.99') from dual 结果:123,123.3
select to_char(123123.3,'$99,999,999.99') from dual 结果: $123,123.30
select to_char(123123.3,'L99,999,999.99') from dual 结果: ?23,123.30
select to_char(123123.3,'99,999,999.99C') from dual 结果: 123,123.30GBP
set serverout on;让控制台输出信息
例1:
set serverout on;
begin
dbms_output.put_line('hello');
end;
/
例2:
set serverout on;
--声明变量
declare n number:=1;
v varchar2(20):='world';
begin
dbms_output.put_line('hello'||n||v);
end;
/
例3:
set serverout on;
declare emp_count number;
begin
select count(*) into emp_count from emp where sal>=3000;
if emp_count>0 then
dbms_output.put_line('有薪资大于3000的员工'||emp_count||'个');
else
dbms_output.put_line('没有薪资大于3000的员工'||emp_count||'个');
end if;
end;
/
例4:(switch case)
set serverout on;
declare emp_count number;
begin
select count(*) into emp_count from emp where sal>=3000;
case emp_count
when 0 then dbms_output.put_line('没有薪资超过3000的员工');
when 1 then dbms_output.put_line('有一个薪资超过3000的员工');
when 2 then dbms_output.put_line('有两个薪资超过3000的员工');
when 3 then dbms_output.put_line('有三个薪资超过3000的员工');
else dbms_output.put_line('有超过三个薪资超过3000的员工');
end case;
end;
/
例5:(if条件)
set serverout on;
declare g_id number:=2;
g_losal number;
g_hisal number;
begin
loop
if(g_id>4) then exit;
end if;
select hisal,losal into g_hisal,g_losal from salgrade where grade=g_id;
dbms_output.put_line('id号'||g_id||'最低工资'||g_losal|| '最高工资'||g_hisal);
g_id:=g_id+1;
end loop;
end;
/
例6:(while循环)
set serverout on;
declare g_id number:=2;
g_losal number;
g_hisal number;
begin
while g_id<5 loop
select hisal,losal into g_hisal,g_losal from salgrade where grade=g_id;
dbms_output.put_line('id号'||g_id||'最低工资'||g_losal|| '最高工资'||g_hisal);
g_id:=g_id+1;
end loop;
end;
/
例7:(for循环)
set serverout on;
declare g_id number:=2;
g_losal number;
g_hisal number;
begin
for g_id in 2..4 loop
select hisal,losal into g_hisal,g_losal from salgrade where grade=g_id;
dbms_output.put_line('id号'||g_id||'最低工资'||g_losal|| '最高工资'||g_hisal);
end loop;
end;
/
游标简介:使用游标我们可以具体操作数据,比如对查询的结果,行,列进行更加细致的处理,以及对其他DML进行判断等操作。
显示游标:
例1:
set serverout on;
declare cursor cu_emp is select empno,ename,sal from emp;
e_no number;
e_name varchar2(10);
e_sal number;
begin
open cu_emp;
fetch cu_emp into e_no,e_name,e_sal;
while cu_emp%found loop
dbms_output.put_line('编号: '||e_no||', 姓名: '||e_name||', 薪资: '||e_sal);
fetch cu_emp into e_no,e_name,e_sal;
end loop;
close cu_emp;
end;
/
例2:
set serverout on;
declare cursor cu_emp is select empno,ename,sal from emp;
--动态指定类型
e_no emp.empno%type;
e_name emp.ename%type;
e_sal emp.sal%type;
begin
open cu_emp;
fetch cu_emp into e_no,e_name,e_sal;
while cu_emp%found loop
dbms_output.put_line('编号: '||e_no||', 姓名: '||e_name||', 薪资: '||e_sal);
fetch cu_emp into e_no,e_name,e_sal;
end loop;
close cu_emp;
end;
/
例3:
set serverout on;
declare cursor cu_emp is select * from emp;
e emp%rowtype;
begin
open cu_emp;
fetch cu_emp into e;
while cu_emp%found loop
dbms_output.put_line('编号: '||e.empno||', 姓名: '||e.ename||', 薪资: '||e.sal);
fetch cu_emp into e;
end loop;
close cu_emp;
end;
/
例4:
set serverout on;
declare cursor cu_emp is select * from emp where sal>2000 and sal<3000;
e emp%rowtype;
begin
open cu_emp;
fetch cu_emp into e;
while cu_emp%found loop
dbms_output.put_line('编号: '||e.empno||', 姓名: '||e.ename||', 薪资: '||e.sal);
fetch cu_emp into e;
end loop;
close cu_emp;
end;
/
隐式游标:
隐式游标的属性 返回值类型 意义
SQL%ROWCOUNT 整型 代表DML语句成功执行的行数
SQL%FOUND 布尔型 值为TRUE代表插入,删除,更新或单行查询操作成功
SQL%NOTFOUND 布尔型 与SQL%FOUND返回值属性相反
SQL%ISOPEN 布尔型 DML执行过程中为真,结束为假
例1:
set serverout on;
begin
update emp set sal=1000 where empno=1002;
if sql%rowcount=1 then
dbms_output.put_line('更新成功');
else
dbms_output.put_line('更新失败');
end if;
end;
动态游标
强类型动态游标
弱类型动态游标
例1:
set serverout on;
declare type customType is ref cursor;
e_count number;
e emp%rowtype;
s salgrade%rowtype;
cType customType;
begin
select count(*) into e_count from emp where job='PRESIDENT';
if e_count=0 then
open cType for select * from salgrade;
fetch cType into s;
while cType%found loop
dbms_output.put_line('等级: '||s.grade||', 最低薪资:'||s.losal||', 最高薪资:'||s.hisal);
fetch cType into s;
end loop;
close cType;
else
open cType for select * from emp;
fetch cType into e;
while cType%found loop
dbms_output.put_line('编号: '||e.empno||', 姓名: '||e.ename||', 薪资: '||e.sal);
fetch cType into e;
end loop;
close cType;
end if;
end;
/
触发器
例1:
create trigger tr_book
before insert or update
on book
begin
if user!='cc' then
raise_application_error(-2001,'权限不足');
end if;
end;
/
例2:
create trigger tr_book_log
after insert or update or delete
on book
begin
if inserting then
insert into book_log values(user,'insert',sysdate);
else if updating then
insert into book_log values(user,'update',sysdate);
else if deleting then
insert into book_log values(user,'delete',sysdate);
end if;
end if;
end if;
end;
/
例3:
create trigger tr_bkk_add
after insert
on book
for each row
begin
update booktype set num=num+1 where id=:new.typeid;
end;
/
例4:
create or replace trigger tr_bkk_delete
after delete
on book
for each row
begin
update booktype set num=num-1 where id=:old.typeid;
end;
/
禁用触发器:alter trigger triggerName disabled;
解禁触发器:alter trigger triggerName enable;
自定义函数:
例1:
create function getBookCount return number as
begin
declare book_count number;
begin
select count(*) into book_count from book;
return book_count;
end;
end getBookCount;
调用:
set serveroutput on;
begin
dbms_output.put_line('表boo有 '||getBookCount()||'条数据。');
end;
例2:
create function getRecordCount(tablename varchar2) return number as
begin
declare record_count number;
query_sql varchar2(100);
begin
query_sql:='select count(*) from '||tablename;
execute immediate query_sql into record_count;
return record_count;
end;
end getRecordCount;
调用:
set serveroutput on;
begin
dbms_output.put_line('表boo有 '||getRecordCount('book')||'条数据。');
end;
存储过程:
例1:
create procedure addBook(bookname in varchar2,typeid in number) as
begin
declare maxid number;
begin
select max(id) into maxid from book;
insert into book values(maxid+1,bookname,typeid);
commit;
end;
end addBook;
/
调用存储过程:
execute addBook('德语',2);
例2:
create or replace procedure addBook2(bn in varchar2,typeid in number) as
begin
declare maxid number;
n number;
begin
select count(*) into n from book where bn=bookname;
if n>0 then
return;
end if;
select max(id) into maxid from book;
insert into book values(maxid+1,bn,typeid);
commit;
end;
end addBook2;
/