Oracle数据库 总结

数据库 waitig 387℃ 百度已收录 0评论

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
    

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


    本文由【waitig】发表在等英博客
    本文固定链接:Oracle数据库 总结
    欢迎关注本站官方公众号,每日都有干货分享!
    等英博客官方公众号
    点赞 (0)分享 (0)