日期:2014-05-16  浏览次数:20557 次

oracle易错总结

以scott的几张表举例

1.?查询在1981年雇佣的雇员信息
实际上就是查询1981年1月1日—1981年12月31日
的员工
易犯错是select * from emp where hiredate between 01-1月 -81 and 31-12月 -81;
注意:表示日期的时候用单引号把日期引起来,顺序是(日-月-年)
应当写成select * from emp where hiredate between '01-1月 -81' and '31-12月 -81';
------------------------------------------------------------
二:现在要求查询出雇员的编号,姓名,工作,但是显示的格式:
编号是:7369的雇员,姓名是:SMITH,工作是:CLERK。
要实现上述功能,可以使用Oracle中提供的字符串连接操作,使用"||"表示。如果要加入显示信息的话要用单引号('')引起来。如:
按部门分组,并显示部门的名称,以及每个部门的员工数
select d.dname,count(e.empno)部门人数 from dept d,emp e
where d.deptno=e.deptno group by d.dname;是在结构里显示部门人数
select d.dname,count(e.empno) || '部门人数' from dept d,emp e
where d.deptno=e.deptno group by d.dname;是在字段里面显示。

——————————————————————————————————————————————————————————————
查询select ‘编号’ from emp;就会显示14行编号,又知道字符串在oracle连接时通过||连接的以此类推

查询语句是:select '编号是:' ||? empno ||'的员工,姓名:'||ename || '职位是:' ||job from emp;
三select * from emp where comm is? null;与select * from emp where comm =0;是不同的结果前者可以查到10条记录,而后者只有一条记录,说明空与0是不同的.
select * from emp where comm=null是错误的写法
------------------------------------------------------------
四:Not 与not in 是不同的
select * from emp where not(sal>1500);是正确的
? NOT表示取反的意思
select * from emp where not in(sal>1500);是错误的。
语法格式:字段 not in (值1,值2,值3,值4,....)
------------------------------------------------------------
⑤:不等于符号:在SQL中如果要使用不等于符号,可以有两种形式:"<>"、"!="。
------------------------------------------------------------
六:在列的类型中,主要有以下常用的数据类型:
Number(4):表示是数字,长度为4。
Varchar2(10):表示的是字符串,长度为10
Date:表示日期
Number(7,2):表示的是数字,其中小数占两位,整数占5位,共七位。
Char(size):表示存储固定大小的字符
------------------------------------------------------------
七 desc 表名 –查询表的结构。不要单纯认为desc只是排序
八:Select sal*12+nvl(comm,0)*12 “年工资”,ename comm. From emp;
------------------------------------------------------------?
九::1 分组函数(count(sal),max(sal),distinct(sal)等)只能出现在选择列表(select 后),having ,order by字句中 group by 后面的字段一定也要在select 后面也有除非是函数的形式如count(sal)就可以不在group by 后面有这个字段
select distinct(deptno) from emp order by sal;这是错误的
select distinct(deptno),sal from emp order by sal;这是对的? distinct(deptno)只能放在这个地方。
2如果在select语句中包含group by having order by 那么他们的顺序一定是group by having order by,因为只有先分组在筛选having,在排序
3在选择列如果有列,表达式,和分组函数那么这些列和表达式必须出现在group by 字句中否则会出错
4.假如还有having的话分组字段必须与having后面的字段一致dept d.deptno 不能写成了 emp e.deptno;
5.常见的错误:select empno,ename,sum(sal) from emp? group by empno
将返回错误:
这是由于在ename表列中没有使用group by子句,因此必须加上分组函数。换句话说,必须使用max()、min()、sum()、count()或avg()函数。如果对于指定的表列找不到想使用的合适的分组函数,那么就将该表列移到group by子句中去。
6.having 与where的区别如:
?显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。 SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000
在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。

总结:1.做数据库复杂的题目一般要将其分为几步方可,不要总想着一步到位。
????? 2.如果牵涉到两张表的话先将它查出来形成一张没有重复的表然后再分组,否则会出错如:
按部门分组,并显示部门的名称,以及每个部门的员工数
Select d.dname,count(e.ename) from emp e,dept d where e.deptno=d.deptno group by d.dname;
不能直接有重复
Select d.dname,count(e.ename) from emp e,dept d group by d.dname;

------------------------------------------------------------

十:对于多表查询的时候,要找到他们的共同点,即相同的字段,给他们起个别名,a1,字段=a2.字段 ,但是表的数量-1个条件才可以查到

查询两张表:Select ?,?,? from dept a1,emp a2 where a1.deptno=a2.deptno;
------------------------------------------------------------
十一:a:单行子查询 :子查询只返回一行数据
b:多行子查询:返回多行的数据或记录 此时不能再用等于号了,要用in? all any some
------------------------------------------------------------
十二:clear scr;清屏
------------------------------------------------------------
十三:所有的函数应用都涉及了吧select upper('aaa') from dual;将aaa变成AAA
select lower('AAA') from dual;将AAA变成aaa
select empno,initcap(ename) from emp; 首字母大写
select * from emp where length(ename) = 5;查询长度等于5的员工
select replace(ename,'A','a') 姓名 from emp;
select concat('aa','bb') from dual; 字符串相连接
select substr('hello',3) f