Oracle数据库 总结
SELECT * FROM TABLE;
SELECT DISTINCT COLUMN FROM TABLE;
SELECT * FROM emp WHERE empno IN(1, 2, 3);
- 在IN之中使用NULL——现在没有任何的影响,
- 在NOT NULL之中使用NULL——不满足的原因是数据库自身的保护机制,避免大数据所带来的问题。
SELECT * FROM emp WHRER ename LIKE “A%”;
“_”:匹配任意一个字符, “%”:匹配0个、1个或多个任意字符。
SELECT * FROM emp ORDER BY sal ASC(默认); \ DEAS;
在数据量大的时候绝对不要采用多表查询,而且就算是数据量小,也别用多表查询。
COUNT(*):会实际的统计出表的数据量;
COUNT(字段):如果统计的字段上不包含有null,那么与COUNT(*)结果相同;如果统计的字段上包含有null,null不参与统计;
COUNT(DISTINCT 字段):消除掉重复数据后的统计
执行顺序:
SELECT [DISTINCT] *| 列名称 [别名 ] , 列名称 [别名 ] ,.... | 统计函数 ? 5、确定查询列
FROM FROM 数据表 [别名 ] ,数据表 [别名 ]... ? 1、数据来源
[WHERE 条件 (s)]? 2、过滤数据行
[GROUP BY 分组字段,分组字段 ,...] ? 3、执行分组操作
[HAVING 分组后过滤] 4、针对分组后的数据过滤
[ORDER BY 字段[ASC | DESC], 字段[ASC | DESC],...] 6、数据排序
SELECT job, AVG(sal), MAX(sal), MIN(sal), COUNT(*)
FROM emp
GROUP BY job;
提示:关于统计查询的几个重要说明,
以上的代码只是根据基础语法实现了统计的操作,但是在整个操作之中还会存在有三个显示:
1. 限制一:统计函数单独使用时(没有GROUP By字句)只能够出现统计函数,不能够出现吉他字段
2. 限制二:使用统计查询时(存在GROUP BY 字句),SELECT子句之中之允许出现统计函数与字段,
3. 限制三:统计函数在分组之中可以嵌套使用,但是嵌套之后的统计查询之中,SELECT子句中不循序再出现任何的字段,包括分组字段。
WHERE子句:是在分组前使用,而且不能够使用统计函数进行验证,经过WHERE筛选后的数据才可以分组;
HAVING子句:必须结合GROUP BY 子句一起出现,是在分组后的过滤,可以使用统计函数。
关于子查询的时候,给出一些参考方式,供选择(95%的问题都可以解决):
子查询返回单行单列:HAVING、WHERE
子查询返回多行单列:WHERE
子查询返回多行多列:FROM
子查询返回单行列
要求统计出所有高于公司平均工资的全部雇员信息
SELECT AVG(sal)FROM emp WHERE sal>(
SELECT AVG(sal) FROM emp);
子查询返回单行多列(了解)
SELECT * FROM emp WHERE (hiredate, sal)=(
SELECT MIN(hiredate), MIN(sal) FROM emp);
SELECT * FROM emp WHERE (sal,job)=(
SELECT sal, job FROM emp WHERE name='SCOTT')
AND ename <> 'SCOTT';
子查询返回多行单列 IN
SELECT * FROM emp WHERE sal IN(
SELECT sal FROM emp WHERE job='MANAGER');
SELECT * FROM emp WHERE sal NOT IN (
SELECT sal FROM emp WHERE job='MANAGER');
此时 有一个需要注意的小问题了:在使用 NOT IN的时候子查询之中必须不能包含 null ,否则不会有任何数据返回。
- =ANY: 此功能与IN操作完全一样
- >ANY: 比子查询的最小值要大
实现方法一:利用多表查询
SELECT d.deptno, d.dname, d.loc, COUNT(e.empno), AVG(e.sal)
FROM emp e, dept d
WHERE e.deptno(+)= d.deptno
GROUP BY d.deptno, d.dname, d.loc;
实现方法二:采用子查询完成
SELECT d.deptno, d.dname, d.loc, temp.cout, temp,avg
FROM dept d,(
SELECT deptno, COUNT(empno), AVG(sal)
FROM emp
GROUP BY deptno)temp
WHERE d.deptno=temp.deptno(+);
- LEFT JOIN或LEFT OUTER JOIN
左向外联接的结果集包括 LEFT OUTER子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
RIGHT JOIN 或 RIGHT OUTER JOIN
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
Oracle 伪列ROWNUM ROWID
约束
CONSTRAINT uk_email UNIQUE(email)
CONSTRAINT pk_mid PRIMARY KEY(mid)
CONSTRAINT ck_age CHECK(age BETTWEEN 0 AND 250)
一般不这么用,在程序里检查
CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid)
序列:Oracle实现序列
CREATE SEQUENCE 序列名称
* 取得序列下一个增长数据(每次调用序列值都增长制定的步长):序列.nextval
* 取得序列当前数据(每次调用序列值都不会增长):序列.currval
在使用currval之前一定要首先使用nextval 不然会报错 CURRVAL尚未在此会话中定义
实际上当用户每次进行数据增长控制的时候,LAST_NUMBER 都表示已经处理完的一批序列内容,
当当前序列的数值等于了LAST_NUMBER数据时,那么会自动再增加指定个”CACHE” 大小的序列
但是有序数据有存在缓存的问题,所以当数据库重新启动之后,那么所操作的序列就可能出现调好的情况。
如果想要避免调好的问题出现,那么最简单的做法是取消缓存,使用NOCACHE表示
* INSERT INTO matab(mid, title) VALUES(myseq.nextval, ‘JAVA’);
了解就行
增加表约束
ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(约束名称)[选项]
ALTER TABLE member ADD CONSTRAINT pk_mid PRIMARY KEY(mid)
删除约束
ALTER TABLE 表名称 DROP CONSTRAINT 约束名称
ALTER TABLE member DROP CONSTRAINT pk_mid
视图不是真实数据,而是真实数据的映射。 不要做查询以外的操作
上一篇: XP系统如何更新硬件驱动?XP系统更新硬件驱动的两种方法详细图文教程
下一篇: EAS主键生成机制