本机安装成功后,访问链接: http://localhost:5560/isqlplus/
前提: 本机win7下安装oracle10g_32, 安装过程见
oracle 10g 安装 和 常遇到的错误 (http://chengjianxiaoxue.iteye.com/blog/2074281)
安装后仅限于学习个人学习oracle之用
0 oracle数据库和oracle实例的区别:
a) oracle服务器 = oracle数据库 + oracle实例
b) oracle数据库: 用于实际存放数据的文件,存储在硬盘中这些文件组织在一起形成的逻辑整体叫做数据库
c) oracle实例: 位于物理内存的数据结构中, = 一个共享内存池 + 多个后台进程组成
d) 用户存取数据库中的数据(硬盘文件),必须通过oracle实例操作。
e) 任何时刻,一个实例只能与一个数据库关联;大多数情况下,一个数据库上只有一个实例对其操作
1 表空间和数据文件:
a) 数据文件: 1) 用于存储物理数据; 2)后缀是 .dbf;
b) 表空间 : 是一个逻辑概念,表名称 eg: table user;
c) 一个user表可以有多个数据文件,eg: USER01.dbf, USER02.dbf; 是一对多的关系
2 本机安装oracle后,将开机自动启动修改成手动启动(如果安装后是为了学习之用,节省本机资源)
3 学习中需要操作的表:
4 基本指令:
1 显示当前用户: show user 结果: USER 为 "SCOTT"
2 显示当前用户的表: select * from tab; (区别于mysql的 show tables;)
TNAME TABTYPE CLUSTERID
DEPT | TABLE | |
EMP | TABLE | |
BONUS | TABLE | |
SALGRADE | TABLE |
3 显示表结构(和mysql写法一样) : desc emp;
名称 是否为空? 类型EMPNO | NOT NULL | NUMBER(4) |
ENAME | VARCHAR2(10) | |
JOB | VARCHAR2(9) | |
MGR | NUMBER(4) | |
HIREDATE | DATE | |
SAL | NUMBER(7,2) | |
COMM | NUMBER(7,2) | |
DEPTNO | NUMBER(2) |
4 查询表数据: select columnname1, columnname2... from tablename (建议查询语句中用字段名称取代*,在oracle9i低版本的oracle查询时,使用*作为查询会耗费oracle判断时间,效率会降低)
5 sql语句中的null:
a) 包含null的表达式都为null
b) null != null
c) 如果集合中含有null,不能使用not in,可以使用 in
eg1: 查询emp表的年薪:
select empno, ename,sal, comm ,sal*12 + comm as 年薪 from emp; 结果会发现,在comm(奖金)为null时,年薪结果为null;
EMPNO ENAME SAL COMM 年薪7369 | SMITH | 800 | ||
7499 | ALLEN | 1600 | 300 | 19500 |
7521 | WARD | 1250 | 500 | 15500 |
7566 | JONES | 2975 | ||
7654 | MARTIN | 1250 | 1400 | 16400 |
改进方式是使用 nal(a,b)函数
(NVL( string1, replace_with)。它的功能是如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ,则返回NULL)
select empno, ename,sal, comm ,sal*12 + nvl(comm,0) as 年薪 from emp;
EMPNO ENAME SAL COMM 年薪7369 | SMITH | 800 | 9600 | |
7499 | ALLEN | 1600 | 300 | 19500 |
7521 | WARD | 1250 | 500 | 15500 |
7566 | JONES | 2975 | 35700 | |
7654 | MARTIN | 1250 | 1400 | 16400 |
eg2: 查询奖金为null的员工:
select empno, ename,sal from emp where comm is null; 不能用 = 和 !=,用 is null / is not null取代
eg3: select * from emp where deptno in (10,20,null);
6 字符串和日期 a) 这两者需要放在单引号内 b) 对于字符串,大小写敏感区分 c) 日期格式敏感,默认格式为 DD-MON-RR(日-月-年);
eg:
select empno, ename,sal from emp where ename = 'KINg'; 查询不到结果
select empno, ename,sal from emp where ename = 'KING'; 查询出结果
select empno, ename,sal from emp where hiredate = '17-11月-81'; 查询的出结果
7 查看系统默认日期类型
select sysdate from dual;
SYSDATE04-6月 -14 |
8 between and : 小值在前,大值在后。
9 in/not in(num1,num2...)
select * from emp where deptno not in (10,20);
10 like %代表多个长度, _代表一个长度
eg1: 查询名字是四个字的员工
select * from emp where ename like '____'; (要用单引号,引号内内容为4个_)
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO7521 | WARD | SALESMAN | 7698 | 22-2月 -81 | 1250 | 500 | 30 |
7839 | KING | PRESIDENT | 17-11月-81 | 5000 | 10 | ||
7902 | FORD | ANALYST | 7566 | 03-12月-81 | 3000 | 20 |
eg2: 查询名称中含有_的员工信息(取_字符本身,而不是取_在模糊查询的含义):
insert into emp(empno,ename,sal,deptno) values(1001,'Tom_ABCD',6000,10);
select * from emp where ename like '%\_%' escape '\';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO1001 | Tom_ABCD | 6000 | 10 |
11 order by 后面+ 列名/表达式/别名
eg1: select ename, sal*12 as 年薪 from emp order by 年薪
eg2: select ename, deptno,sal*12 as 年薪 from emp order by deptno, sal; 先按照第一列排序,如果相同,再按照第二列排序,以此类推
eg: 降序排列时,如果有空值,如何将空值排在后面(按照人们的习惯来显示数据,office好用就在于按照人的使用习惯排列按钮让人去点)
select * from emp order by comm desc nulls last;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO7654 | MARTIN | SALESMAN | 7698 | 28-9月 -81 | 1250 | 1400 | 30 |
7521 | WARD | SALESMAN | 7698 | 22-2月 -81 | 1250 | 500 | 30 |
7499 | ALLEN | SALESMAN | 7698 | 20-2月 -81 | 1600 | 300 | 30 |
7844 | TURNER | SALESMAN | 7698 | 08-9月 -81 | 1500 | 0 | 30 |
7782 | CLARK | MANAGER | 7839 | 09-6月 -81 | 2450 | 10 | |
7788 | SCOTT | ANALYST | 7566 | 19-4月 -87 | 3000 | 20 | |
7839 | KING | PRESIDENT | 17-11月-81 | 5000 | 10 |
12 DISTINCT 排除重复,如果放在多个字段前,那么这多个字段是作为一个比较条件来进行排重
select DISTINCT deptno,job from emp;
DEPTNO JOB20 | CLERK |
30 | SALESMAN |
20 | MANAGER |
30 | CLERK |
10 | PRESIDENT |
30 | MANAGER |
10 | CLERK |
10 | |
10 | MANAGER |
20 | ANALYST |