欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Oracle数据库 总结

程序员文章站 2022-06-02 15:54:38
...

SELECT * FROM TABLE;

SELECT DISTINCT COLUMN FROM TABLE;

SELECT * FROM emp WHERE empno IN(1, 2, 3);

  1. 在IN之中使用NULL——现在没有任何的影响,
  2. 在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(+);


  1. 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
    

    视图不是真实数据,而是真实数据的映射。 不要做查询以外的操作