select*|列 from 表名
where 条件
groupby 列
having 条件
orderby 列 desc/asc
运算符
关系运算符:>、<、>=、<=、<>、(!=)
逻辑运算符:AND、OR、NOT;
范围运算符:BETWEEN、AND;
谓词范围:IN、NOT IN
空判断:IS NULL、IS NOT NULL;
模糊查询:LIKE
算术运算符:+ - * /
连接符:||
DISTINCT 关键字
Oracle DISTINCT关键字的作用可以对Oracle查询结果进行重复数据的消除
select distinct stu_name,stu_money,stu_date from student;
查询条件
= 表示精确查询
in 表示范围查询
select * from emp where deptno not in (10,20)
like 表示模糊查询
select * from emp where ename like 'S%'
BETWEEN...AND 表示数字的范围
select * from emp where sal between 1000 and 4000
连接查询
内联
inner join
select * from emp inner join dept on emp.deptno=dept.deptno
select * from emp,dept where emp.deptno=dept.deptno
特点:将两张表有关联的数据全部查出,
左外联
select * from emp left join dept on emp.deptno=dept.deptno
特点:以左表emp为基准,查出关联右表的数据。
emp的数据会全部查出来
右外联
select * from emp right join dept on emp.deptno=dept.deptno
全联
select * from emp full join dept on emp.deptno=dept.deptno
两张表的数据会全部查询出来,如果没有关联的数据以null代替
select * from emp , dept
Oracle伪列
ROWID
Oracle表中的每一行在数据文件中都有一个物理地址, ROWID 伪列返回的就是该行的物理地址。使用 ROWID 可以快速的定位表中的某一行。 ROWID 值可以唯一的标识表中的一行。通过Oracle select 查询出来的ROWID,返回的就是该行数据的物理地址。
select t.*,t.rowid from emp t ;
ROWNUM
ORACLE ROWNUM表示的Oracle查询结果集的顺序,ROWNUM为每个查询结果集的行标识一个行号,第一行返回1,第二行返回2,依次顺序递增。
ROWNUM 与 ROWID 不同, ROWID 是插入记录时生成, ROWNUM 是查询数据时生成。ROWID 标识的是行的物理地址。 ROWNUM 标识的是查询结果中的行的次序。
select t.*,t.rowid,rownum from emp t ;
例如查询前3条数据
select t.*,t.rowid from emp t where rownum<=3
函数
有系统函数和自定义函数
字符函数
函数
说明
案例
结果
ASCII(X)
求字符X的ASCII码
select ASCII(‘A’) FROM DUAL;
65
CHR(X)
求ASCII码对应的字符
select CHR(65) FROM DUAL;
‘A’
LENGTH(X)
求字符串X的长度
select LENGTH(‘ORACLE技术圈’)from DUAL;
9
CONCATA(X,Y)
返回连接两个字符串X和Y的结果
select CONCAT(‘ORACLE’,‘技术圈’) from DUAL;
ORACLE技术圈
INSTR(X,Y[,START])
查找字符串X中字符串Y的位置,可以指定从Start位置开始搜索,不填默认从头开始
SELECT INSTR(‘ORACLE技术圈’,‘技术’) FROM DUAL;
7
LOWER(X)
把字符串X中大写字母转换为小写
SELECT LOWER(‘ORACLE技术圈’) FROM DUAL;
oracle技术圈
UPPER(X)
把字符串X中小写字母转换为大写
SELECT UPPER(‘Oracle技术圈’) FROM DUAL;
ORACLE技术圈
INITCAP(X)
把字符串X中所有单词首字母转换为大写,其余小写。
SELECT INITCAP('ORACLE is good ') FROM DUAL;
Oracle Is Good
LTRIM(X[,Y])
去掉字符串X左边的Y字符串,Y不填时,默认的是字符串X左边去空格
SELECT LTRIM(’–ORACLE技术圈’,’-’) FROM DUAL;
ORACLE技术圈
RTRIM(X[,Y])
去掉字符串X右边的Y字符串,Y不填时,默认的是字符串X右边去空格
SELECT RTRIM(‘ORACLE技术圈–’,’-’) FROM DUAL;
ORACLE技术圈
TRIM(X[,Y])
去掉字符串X两边的Y字符串,Y不填时,默认的是字符串X左右去空格
SELECT TRIM(’–ORACLE技术圈–’,’-’) FROM DUAL;
ORACLE技术圈
REPLACE(X,old,new)
查找字符串X中old字符,并利用new字符替换
SELECT REPLACE(‘ORACLE技术圈’,‘技术圈’,‘技术交流’) FROM DUAL;
1,
SYSDATE函数:该函数没有参数,可以得到系统的当前时间。
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
2,
select systimestamp from dual;
3,数据库时区函数:
select dbtimezone from dual;
4,给日期加上指定的月份函数
ADD_MONTHS(r,n)
select ADD_MONTHS(to_date('2020-10-10','yyyy-mm-dd'),1) from dual
select add_months(sysdate,1) from dual
5,月份最后一天函数:
LAST_DAY(r)
select last_day(sysdate) from dual
select last_day(to_date('2021-2-10','yyyy-mm-dd')) from dual
6,指定日期后一周的日期函数:
NEXT_DAY(r,c)
select next_day(to_date('2018-11-12','yyyy-mm-dd'),'星期四') from dual;
select next_day(sysdate,'星期四') from dual;
7,回指定日期中特定部分的函数:
EXTRACT(time)
select extract( year from timestamp '2018-11-12 15:36:01') as year,
extract( month from timestamp '2018-11-12 15:36:01') as month,
extract( day from timestamp '2018-11-12 15:36:01') as day,
extract( minute from timestamp '2018-11-12 15:36:01') as minute,
extract( second from timestamp '2018-11-12 15:36:01') as second
from dual;
8,返回两个日期间的月份数:
MONTHS_BETWEEN(r1,r2)
select MONTHS_BETWEEN(
to_date('2020-10-10','yyyy-mm-dd'),
to_date('2021-11-10','yyyy-mm-dd'))
from dual
9,日期截取函数
ROUND(r[,f])
DECLARE
V_ORG_NAME SF_ORG.ORG_NAME%TYPE;--与ORG_NAME类型相同
V_PARENT_ID SF_ORG.PARENT_ID%TYPE;--与PARENT_ID类型相同BEGINSELECT ORG_NAME,PARENT_ID INTO V_ORG_NAME,V_PARENT_ID
FROM SF_ORG SO
WHERE SO.ORG_ID=&ORG_ID;
DBMS_OUTPUT.PUT_LINE('部门名称:'|| V_ORG_NAME);
DBMS_OUTPUT.PUT_LINE('上级部门编码:'|| TO_CHAR(V_PARENT_ID));end;
declare
v_org_rec sf_org%rowtype;--定义一个变量,变量的类型是一条记录,beginselect*into v_org_rec from sf_org
where org_id =&org_id;
dbms_output.put_line(v_org_rec.org_id||v_org_rec.org_name||v_org_rec.parent_id);end;
--- 异常处理declare
v_num number ;begin
v_num :=1/0;select empno into v_num from emp where empno=100;
exception
when ZERO_DIVIDE then
dbms_output.put_line('异常');when NO_DATA_FOUND then
dbms_output.put_line('没有数据');when others then
dbms_output.put_line('未知异常');end;
捕获抛出的逻辑异常
declare
v_age number;begin
v_age:=&age;if(v_age<0or v_age>130)then
raise_application_error(-88888,'年龄非法!');endif;
Dbms_Output.put_line('您的年龄:!'||v_age);
exception
when others then
Dbms_Output.put_line('出现异常!');end;
捕获自定义异常
declare
v_age number;
ex_myage exception;--自定义异常
pragma exception_init(ex_myage,-20000);--注册自定义异常,编号范围20000-20300 默认前缀都是 ORA-begin
v_age:='&age';if(v_age<0or v_age>130)then
raise_application_error(-20000,'年龄非法!');endif;
Dbms_Output.put_line('您的年龄:!'||v_age);
exception
when ex_myage then
Dbms_Output.put_line(SQLERRM);--sqlerrm 获取异常信息end;
declare
v_count number;begininsertinto stu_info (id, name, sex)values(3,'瑶瑶','女');ifsql%found then
dbms_output.put_line('插入成功!');endif;update stu_info t set t.name ='悠悠'where t.id =3;ifsql%found then
dbms_output.put_line('更新成功!');endif;deletefrom stu_info t where t.id =3;ifsql%found then
dbms_output.put_line('删除成功!');endif;selectcount(1)into v_count from stu_info t;ifsql%found then
dbms_output.put_line('总记录为: '|| v_count);endif;ifsql%isopen then
dbms_output.put_line('不可能的,永远不可能走这一步');else
dbms_output.put_line('系统已自动关闭游标');endif;end;
显式游标 cursor 带参数
declare--定义游标cursor cursor_org(id_ sf_org.org_id%type)isselect*from sf_org where org_id=id_;
v_org_rec sf_org%rowtype;begin--打开游标 带参数 将1的值 赋值id_open cursor_org(2);fetch cursor_org into v_org_rec ;
dbms_output.put_line(v_org_rec.org_id||v_org_rec.org_name||v_org_rec.parent_id);close cursor_org;end;
动态游标
自定义类型 ref cursor
declare-- 定义类型,该类型是一个动态游标type cousor_org_type is ref cursor;
cousor_org cousor_org_type;
v_org_rec sf_org%rowtype;
sql_str varchar2(100) :='select * from sf_org';begin-- 打开游标open cousor_org for sql_str;loopfetch cousor_org into v_org_rec;exitwhen cousor_org%notfound;
dbms_output.put_line(v_org_rec.org_id||v_org_rec.org_name||v_org_rec.parent_id);endloop;close cousor_org;end;
declare
--type cursor_org_type is ref cursor return sf_org%rowtype;
cousor_org sys_refcursor;
v_org_rec sf_org%rowtype;
begin
open cousor_org for select * from sf_org;
loop
fetch cousor_org into v_org_rec ;
exit when cousor_org%notfound;
dbms_output.put_line(v_org_rec.org_id||v_org_rec.org_name||v_org_rec.parent_id);
end loop;
close cousor_org;
end;
使用绑定变量
-- 使用绑定变量declare
cousor_org sys_refcursor;
v_org_sql varchar2(100);
v_org_rec sf_org%rowtype;begin
v_org_sql :='select * from sf_org where org_id=:id_';open cousor_org for v_org_sql
using3;fetch cousor_org into v_org_rec ;
dbms_output.put_line(v_org_rec.org_id||v_org_rec.org_name||v_org_rec.parent_id);close cousor_org;end;
记录 record
declare-- 独立定义记录,可以定义参数 %rowtype也是记录,但是这个必须是和表的字段一致type record_sf_org is record(
v_org_id sf_org.org_id%type,
v_org_name sf_org.org_name%type);
sf_org_row record_sf_org;beginselect org_id,org_name into sf_org_row from sf_org
where org_id =1;
dbms_output.put_line(sf_org_row.v_org_id||sf_org_row.v_org_name);end;
-- 编写存储过程,获得某个员工的姓名,工资,职位createorreplaceprocedure pro_emp(
empid in emp.empno%type,
empname out emp.ename%type,
empsal out emp.sal%type,
empjob out emp.job%type)asbeginselect ename,sal,job into empname,empsal,empjob
from emp where empno = empid;end;
参数形式
存储过程传递参数有哪三种模式?
IN
用于接受调用程序的值
默认的参数模式
OUT
用于向调用程序返回值
IN OUT
用于接受调用程序的值,并向调用程序返回更新的值