oracle基本查询用法入门示例
本文实例讲述了oracle基本查询用法。分享给大家供大家参考,具体如下:
一、基本select语句
SELECT*|{[DISTINCT]column|expression[alias],...} FROMtable;
例如:
--查询所有数据 select*fromemp; --查询指定列数据 selectempno,ename,salfromemp; --算数运算符(+-*/) selectename,sal,sal+30fromemp; --使用括号 selectename,sal,12*(sal+30)fromemp; --定义空值 --(空值是无效的,未指定,未知的或不可预知的值,空值不是空格或是0) selectename,job,sal,commfromemp; --空值的数学运算 --包含空值的数学表达式的值都为空值 selectename,12*sal+commfromemp; --列的别名 --别名使用双引号,AS可以省略 selectdeptnoas"no",enameas"name"fromemp; --连接符,把列与列,列与字符连接在一起 selectdeptno||'--'||enamefromemp; --字符串 --日期和字符只能在单引号中出现 select'hello'||enamefromemp; --删除重复行 selectdistinctdeptnofromemp; --显示表结构 desc[ribe]tablename;
二、过滤和排序
SELECT*|{[DISTINCT]column|expression[alias],...} FROMtable [WHEREcondition(s)];
例如:
--查询指定条件数据 selectdeptno,enamefromempwheredeptno=10; --字符串和日期包含在单引号中 --字符串大小写敏感,日期格式敏感 selectename,job,deptnofromempwhereename='King'; --比较运算符(=><<=>=<>!=) selectename,salfromempwheresal<1500; --其他比较运算符 --BETWEEN...AND...在两个值之间包含边界 --IN(set)等于值列表中的一个 --LIKE模糊查询 --ISNULL空值 selectename,sal,deptnofromempwheredeptnoin(10,30); selectename,sal,commfromempwherecommisnull; --逻辑运算(ANDORNOT) selectename,salfromempwheredeptno=10andsal>1500;
排序
ORDERBY字段[DESC|ASC]
例如:
selectename,salfromemporderbysaldesc; --多列排序 --先按第一列排序,如果相同,则按第二列排序,以此类推 select*fromemporderbysaldesc,hiredatedesc;
三、单行函数
1、字符函数
--LOWER转换小写 --UPPER转换大写 --INITCAP首字母大写 selectlower(ename)fromemp; --CONCAT接接字符串 --SUBSTR截取字符串 --LENGTH字符串长度 --INSTR查找字符串 --LPAD左边填充字符 --RPAD右边填充字符 --TRIM([leading|trailing|both]字符串1from字符串2) --TRIM可以删除两边空格,也可删除其他字符 --REPLACE替换字符串 selectconcat('aa','bb')fromemp; selectsubstr('abcdefg',2,3)fromemp; selectlength('test...')fromemp; selectinstr('helloworld','w')fromemp; selectlpad(sal,'10','0')fromemp; selectrpad(sal,'10','*')fromemp; selecttrim('test')fromemp; --从尾部删除字符串*号 selecttrim(trailing'*'from'**1212121**')fromemp; --把字符串中的22替换成88 selectreplace('11223344','22','88')fromemp;
2、数字函数
--ROUND四舍五入 --TRUNC截断 --MOD求余 selectround(25.533,2)fromdual; selecttrunc(25.323,2)fromdual; selectmod(8,3)fromdual;
3、日期
oracle中日期型数据实际含有两个值:日期和时间。
默认格式为:DD-MON-RR
--返回系统时间 selectsysdatefromdual; --两个日期相减,返回日期之间相差的天数 selectename,(sysdate-hiredate)/7"weeks"fromemp; --MONTHS_BETWEEN两日期相差月数 --ADD_MONTHS指定日期加上若干月数 --NEXT_DAY指定日期的下一个日期 --LAST_DAY本月的最后一天 --ROUND日期四舍五入 --TRUNC日期截断 selectmonths_between(sysdate,hiredate)fromemp;
4、显式数据类型转换
--TO_CHAR(date,'format_model') --把日期转换成字符串 selectto_char(sysdate,'YYYYMMDDHH:MI:SS')fromdual; --TO_CHAR(number,'format_model') selectename,sal,to_char(sal,'$99,999.00')fromemp; --TO_NUMBER(char[,'format_model']) --TO_DATE(char[,'format_model'])
通用函数,适用于任何数据类型,也适用于空值
NVL(expr1,expr2) NVL2(expr1,expr2,expr3) NULLIF(expr1,expr2) COALESCE(expr1,expr2,...)
5、条件表达式
在sql语句中使用if-then-else逻辑
case表达式,sql99语法,类似basic,比较繁锁
decode函数,oracle自已语法,类似java,比较简洁
CASEexprWHENcomparison_expr1THENreturn_expr1 [WHENcomparison_expr2THENreturn_expr2 WHENcomparison_expr3THENreturn_expr3 ELSEelse_expr] END
DECODE(col|expression,search1,result1 [,search2,result2,...,] [,defautl] )
selectename,sal,decode(round(sal/1000), 1,'一倍', 2,'二倍', 3,'三倍', '不知倍数' )fromemp;
6、函数嵌套
单行函数可以嵌套,嵌套函数的执行是由内到外。
四、分组函数
分组函数作用于一组数据,并对一组数据返回一个值。
常用组函数
--AVG --COUNT --MAX --MIN --SUM selectsum(sal)as"total"fromemp; selectmax(sal)fromemp; selectcount(*)fromempwheredeptno=10; selectcount(distinctdeptno)fromemp;
分组数据
通过GROUPBY可以将数据分成若干组
selectdeptno,avg(sal)fromempgroupbydeptno;
(*注意:在select列表中所有未包含在组函数中的列都必须包含在groupby中。)
--多列分组 selectdeptno,job,avg(sal)fromempgroupbydeptno,job;
过滤分组
通过HAVING子句对分组进行过滤
selectdeptno,avg(sal)fromempgroupbydeptnohavingdeptnoin(10,20);
(*注意:不能在where子句中使用组函数,having子句中可以。)
嵌套组函数
selectmax(avg(sal))fromempgroupbydeptno;
五、多表查询
oracle的连接 sql99的连接
等值连接 crossjoins
不等值连接 naturaljoins
外连接 usingclause
自连接 fullortwosidedouterjoins
SELECTtable1.column,table2.column FROMtable1,table2 WHEREtable1.column1=table2.column2;
--等值连接 selectd.dname,e.ename,e.salfromempe,deptdwheree.deptno=d.deptno; --多连接条件和and操作符 selectd.dname,e.ename,e.salfromempe,deptdwheree.deptno=d.deptnoande.deptno=10;
表的别名
1、使用表别名可简化查询
2、使用表名前缀可以提高执行效率
3、如果使用了表的别名,则不能再使用表的真名。
--不等值连接 --查询员工部门名称和工资等级 selectd.dname,e.ename,e.sal,s.grade fromempe,deptd,salgrades wheree.deptno=d.deptno ande.sal>=s.losal ande.sal<=s.hisal;
外连接语法
外连接查询可以查询不满足连接条件的数据。
外连接的符号是(+)
SELECTtable1.column,table2.column FROMtable1,table2 WHEREtable1.column(+)=table2.column; SELECTtable1.column,table2.column FROMtable1,table2 WHEREtable1.column=table2.column(+);
--查询部门人数 selectd.dname,d.deptno,count(e.empno) fromempe,deptd wheree.deptno(+)=d.deptno groupbyd.deptno,d.dname;
自连接
--查询员工的上级 selecte.enameas"员工",e2.enameas"上级" fromempe,empe2 wheree.empno=e2.mgr;
使用sql:1999语法连接
SELECTtable1.column,table2.column FROMtable1 [CROSSJOINtable2]| [NATURALJOINtable2]| [JOINtable2USING(column_name)]| [JOINtable2ON(table1.column_name=table2.column_name)]| [LEFT|RIGHT|FULLOUTERJOINtable2ON(table1.column_name=table2.column_name)];
使用crossjoin连接的表产生叉集,叉集和笛卡尔集是相同的。
selecte.ename,d.dnamefromempecrossjoindeptd;
使作naturaljoin自然连接,会以两个表中具有相同名字的列为条件创建等值连接。
selecte.ename,d.dnamefromempenaturaljoindeptd;
使用using创建连接,用naturaljoin创建等值连接时,可以使用using指定等值连接中需要用到的列。
selecte.ename,d.dnamefromempejoindeptdUSING(deptno);
使用on创建连接,可以指定额外的连接条件。
selecte.ename,d.dnamefromempejoindeptdone.deptno=d.deptno;
使用on创建多表连接
selecte.ename,d.dname,e2.ename fromempe joindeptd one.deptno=d.deptno joinempe2 one.empno=e2.mgr;
内连接和外连接
在sql:1999中,内连接只返回满足连接条件的数据。
两个表在连接过程中除了返回满足连接条件的行以外,还返回左(右)表中不满足条件的行,这种称为左(右)外连接。
两个表在连接过程中除了返加满足连接条件的行以外,还返回两个表中不满足条件的行,这种连接称为满外连接。
--左外连接 selecte.ename,d.dname fromempe leftouterjoindeptd one.deptno=d.deptno;
--右外连接,返回右表中不满足条件的行 selecte.ename,d.dname fromempe rightouterjoindeptd one.deptno=d.deptno;
--满外连接 selecte.ename,d.dname fromempe fullouterjoindeptd one.deptno=d.deptno;
更多关于Oracle相关内容感兴趣的读者可查看本站专题:《Oracle常用函数汇总》、《Oracle日期与时间操作技巧总结》及《php+Oracle数据库程序设计技巧总结》
希望本文所述对大家Oracle数据库程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。