复习Oracle数据库知识一——基本概念和sql简单语句

1.oracle的安装和卸载
  • 百度上有很多资料

2.基本概念(以下都只是简单提纲,并不是具体内容)

Oracle服务器(Oracle Database)的基本概念:
  • 定义:是一个数据管理系统(RDBMS),它提供开放的,全面的,近乎完整的信息管理
  • 由Oracle实例数据库组成
  • 数据库是一个物理概念,当我们安装好oracle后,在我们的安装目录下会有oracle下会有
oradata,里面就存在着我们的创建的数据库文件
  • 实例是逻辑概念,是把我们的数据库文件中的文件读到内存中
  • 引出 集群 的概念,先了解概念
  • oracle体系结构,引出二次提交
    • 从大到小:实例》表空间》段》区》数据块
集群:
  • 定义:
  • 优点:
    • 失败迁移
    • 负载均衡

3.sql语句
sql语句的注意点:
  • sql语言大小写不敏感
  • 关键字不能缩写也不能分行
  • 各个子句一般要分开写
  • 要使用缩进,分行 提高语句的可读性(一般的sql都非常非常长)
sqlplus语句:sqlplus是用来执行sql语句的地方(比如dos命令窗口下的sqlplus)

基本查询语句:
  • 当前用户下的表 select * from tab;
  • tab数据字典(管理员提供的表) desc emp
  • 查询系统参数 select * from v$nls_parameters;
  • 查询所有员工的所有信息 select * from emp;
  • DISTINCT 去掉重复的记录 select deptno from emp;
  • concat 连接字符串 select concat('Hello',' World') from dual;
  • 连接符 select 'Hello'||' World' from dual;
  • 注意点
    • dual是伪表,由管理员创建,用来操作一些没有和表没有关系的操作
    • 查询的时候尽量使用列名代替* (Oracle 9i之后,可以认为是一样

过滤和筛选:
  • 查询10号部门员工 select * from emp where deptno=10;
  • between ..and 在。。。之间
    • 语句: select * from emp where sal between 1000 and 2000;
    • 包含边界,小值在前,大值在后
  • in: 在集合中
    • 语句: select * from emp where deptno in (10,20);
    • 包含的集合中不能有null值
  • like 模糊查询 % select * from emp where ename like '%_%';
  • 逻辑运算符 and 和 or
    • 解析顺序从左到右
where condition1 and condition2
where condition1 and condition2 是不一样的,有利于sql优化

where condition1 or condition2 也是同理,尽量把为真的放左边
  • 排序 select * from emp order by sal;
    • 默认为升序,desc为降序
    • order by后面可以跟多列:作用于后面所有的列
  • 查询中的条件是字符串,为大小写敏感
  • 日期格式敏感
    • Oracle 9i之前,日期格式为 DD-MON-YY
    • Oracle 9i之前,日期格式为 DD-MON-RR
    • 可以用select * from v$nls_parameters 查看日期格式
    • 因为v$nls_parameters是一张数据字典表,所以可以修改日期的格式
    • alter session set NLS_DATE_FORMAT='yyyy-mm-dd';

单行函数:(列举了一些我认为比较常用或者重要或者不熟悉的)
  • lower()字符串转为小写,upper()字符串转为大些,initcap()字符串首字母大写
  • ROUND(a,b) ,使a保留小数,如果a为负数,保留到使a四舍五入到倒数-b位
  • 例子:select ROUND(45.926,2) 一,ROUND(45.926,1) 二,0) 三,-1) 四,-2) 五 from dual;
一 二 三 四 五
---------- ---------- ---------- ---------- ----------
45.93 45.9 46 50 0
  • TRUNC(a,b) 与ROUND类似,但是TRUNC不是四舍五入,是直接取
一 二 三 四 五
---------- ---------- ---------- ---------- ----------
45.92 45.9 45 40 0
  • to_char() 转换成字符串,to_number() 转换成数字,to_date() 转换成日期
  • nvl(a,b) 获取某个值,若nvl为null,返回b
  • nvl2(a,b,c) 获取某个值,若nvl为null,返回c,否者返回b
  • decode(a,c
d,e,
......
f)
  • 和java中的if-else相似,如果a的值为b,返回c,为d,返回e,否者返回f

组函数:作用于一组数据,并对一组数据返回一个值
  • avg():求平均值
  • count():求数量
  • max():求最大值
  • min():求最小值
  • sum():求和
  • 熟练使用group by函数
    • group by多列:先按照第一列分;如果第一列相同,再按照第二列分
  • having 过滤分组 与where有点相似
    • 先执行where在实行分组,所以尽量使用where 例外:如果条件中含义组函数,只能使用having

null的注意点:
  1. 查询的时候判断null,要用is或者is not: where id is null
  2. 表达式中包含null值的返回值都为null select sal*12+nvl(comm,0) 年收入 from emp;
  3. 如果集合中含义null值,不能使用not in操作符;但可以使用in
  4. 组函数会自动过滤为空,可以在组函数中嵌套滤空函数,来屏蔽组函数的滤空功能
    1. select count(*),count(comm) from emp; 的结果不同
    2. select count(*),count(nvl(comm,0)) from emp; 的结果相同


多表查询
  • 笛卡儿积为基础,尽量避免出现笛卡尔全集(即没有连接条件)
  • 以连接条件的不同,可以分为 等值连接,不等值连接,外连接,自连接
  • 外连接解决的问题:当条件不成立时,任然希望在结果中包含不成立记录
    • 左外连接 where d.deptno=e.deptno(+)
    • 右外连接 where d.deptno(+)=e.deptno
  • 自连接:利用表的别名,将同一张表视为多张表
    • 自连接不太适合操作大表
  • 层次查询: 对同一张表的前后两次操作,进行连接 connect by prior empno=mgr start with



基础部分已经大致结束,当然上述的所有内容都是伪逻辑,有些代码还需要大家修改一下才能使用,当然新手可以把上面的知识看作条目,逐一了解。若是有数据库经验的可以看看那些知识自己还没有掌握,弥补一下漏洞。

下一节,主要复习sql的简单查询的 触发器和视图方面的知识

相关文章

文章浏览阅读773次,点赞6次,收藏9次。【代码】c# json字符...
文章浏览阅读8.7k次,点赞2次,收藏17次。此现象一般定位到远...
文章浏览阅读2.8k次。mysql脚本转化为oracle脚本_mysql建表语...
文章浏览阅读2.2k次。cx_Oracle报错:cx_Oracle DatabaseErr...
文章浏览阅读1.1k次,点赞38次,收藏35次。本文深入探讨了Or...
文章浏览阅读1.5k次。默认自动收集统计信息的时间为晚上10点...