大早起刚坐这连接数据库,发现半天都连不上,没有动静,等了老大一会出来一个弹窗提示“socket read timed out”,气死老夫了,昨天才安装好,今天就不能用了!!
结果,重启了一下oracle的监听程序就好了。。。
正文:
Oracle四大特点:
- 支持大数据库、多用户、高性能,高并发的事务处理
- 数据安全性和完整性方面性能优越
- 网格计算 ————最显著的特点,oracle 11g之后的版本都支持网格计算,12c又增加了一个特点就是云计算
- 具有可移植性、可兼容性——传说中的跨平台
Windows操作系统下的oracle服务以后台服务进程的方式进行管理
- oracleOraDB11g_homeTNSListener服务:oracle服务器的监听程序,时刻判断 有没有连我网络的客户端,就得话就接收过来。粗俗点,类似广播,告诉大家我在哪我在哪这样
- OracleServiceSID:oracle的核心服务,要启动oracle实例,必须启动该服务。
- OracleJobSchedulerSID:任务调度服务,负责对用户创建的作业按预先设计的 时间周期性地调度执行,从而实现oracle服务器的自动管理功能。
- 4.OracleDBConsoleSID:负责在windows平台下启动oracle企业管理器。Oracle 11g 企业管理器是一个功能完善的Oracle数据库管理工具,可以管理本地数据库 环境和网络环境。
在Oracle服务器端, 至少应该启动OracleOraDbllg_homeTNSListener和OracleServiceSID两个服务。
SQL语言分类
- 数据定义语言:(data definition language,DDL):用于创建、修改 和删除数据库对象,如CREATE TABLE、ALTER TABLE、DROP TABLE等。_DDL语句可以自 动提交事务。
- 数据操纵语言:(data manipulation language,DML):用户增删改 查数据的,如insert,update,delete,select。
- 数据控制语言:(data control language,DCL语言):用于授予,修改或 者撤销权限。如grant(授权)、revoke(撤销)。
- 事务控制语言:(Transactional control language,TCL语言):用于维 护数据的一致性。如commit(提交),rollback(回滚),savepoint(设置 保存点)。
数据类型
字符类型:
Char:1.char是固定长度字符串,长度不够空格填充,最多存储2000字节
2.char类型区分中英文,中文2字节,英文1字节
Varchar2:1.可变长度字符串,最多存储4000字节
2.定义该数据类型时,应指定其大小。
3.varchar2相比char可以节省很多空间
数值类型:
Number:1.number类型可以存储正数,负数,零。定点数和精度为38位的浮点数
2.number(m,n)。其中m表示精度,代表总位数;n代表小数点后的位数
日期类型
date:1.存储日期和时间数据,取值范围:4712年1月1日至公元9999年12月31日
2.长度是7,七个字节分别表示世纪、年、月、日、时、分、秒
timestamp:和date的qubie在于,它更精确,秒值精确到小数点后6位,并且它还同时包含时区信息。
插入日期数据的格式:日-月-年
大对象类型
CLOB大字符串对象类型:1.CLOB(Character Large Object),用于存储可变长度的字符数据,最多可存4GB数据
2.用于存储varchar2类型不能存储的长文本信息(论文,小说。。。)
BLOB大二进制类型:1.BLOB (Binary Large Object)数据类型用于存储较大的二进制对象,如图片、视频剪辑和声音剪辑等,最多可存储4GB的数据。
总结:Oracle也支持INTEGER、FLOAT、DOUBLE等数值类型,但建议采用Oracle自身的number数据类型;Oracle也支持VARCHAR字符类型,但建议采用Oracle自身的VARCHAR2数据类型。
创建表
create table 表名
(
列名 类型(大小) 不为空,
......
列名 类型(大小) 不为空
);
例如:
CREATE TABLE PERSONAL_INFO
(OWNER_NAME VARCHAR2(20) NOT NULL,
TEL_CODE VARCHAR2(15) NOT NULL,
CITY VARCHAR2(20) NOT NULL,
NETWORK_DATE DATE NOT NULL,
BRAND_NAME VARCHAR2(20) NOT NULL
);
添加约束
alter table 表名 add constraint
约束名 约束类型 (列名);
例如:
ALTER TABLE PERSONAL_INFO ADD CONSTRAINT
V_TEL_CODE UNIQUE(TEL_CODE);
查看表内的约束
SELECT CONSTRAINT_NAME,COLUMN_NAME FROM USER_CONS_COLUMNS WHERE
TABLE_NAME=’你的表名’;
例如:
SELECT CONSTRAINT_NAME,COLUMN_NAME FROM USER_CONS_COLUMNS WHERE
TABLE_NAME=’PERSONAL_INFO’;
向已创建的表增加新列
alter table tableName add columnName dataType;
例:
alter table PERSONAL_INFO add pTel varchar2(11);
修改表中指定列的数据类型和类型长度
alter table tableName modify columnName dataType;
例:
alter table PERSON modify pTel number(11);
删除表中指定的列
alter table tableName drop column columnName;
例:
alter table PERSON drop column pTel;
序列
Oracle和mysql、sqlserver这些数据库有一个区别就是,后两者有主键自增的设定,而Oracle没有主键自增,那我们该怎么解决呢?
这时候就用到了序列,序列是oracle提供的用于产生一组等间隔整数数值的数据库对象,可以通过在插入语句中实现主键自增。
Oracle中的CREATE SEQUENCE命令用于创建序列。
CREATE SEQUENCE<序列名称>
[START WITH初始值]
[INCREMENT BY步长]
[MINVALUE最小值| NOMINVALUE】
[MAXVALUE最大值| NOMAXVALUE]
[CYCLE | NOCYCLE]
[CACHE预分配序列个数|NOCACHE]
[ORDER | NOORDER]
说明如下:
START WITH:用于指定序列的起始值。
INCREMENT BY:用来指定序列的增量,如果取负值,则为递减序列。
MINVALUE j NOMINVALUE:指定序列是否有最小值。
MAXVALUE I NOMAXVALUE:用来说明序列是否有最大值。
CYCLE l NOCYCLE:用于指定序列值达到最大之后,是否重新从最小值开始产生。
CACHE l NOCACHE:用来指定是否在缓存中保存预先分配的序列值, 如果选择CACHE,可以提高获取序列的速度。
ORDER l NOORDER:是否确保序列值是否唯一和有序。
insert into PERSON
values(MYSEQ.nextval,'猴子');
insert into PERSON
values(MYSEQ.nextval,'侯松辰');
单行子查询
子查询是指嵌套在其他SQL语句中的查询,它可以出现在SELETE、WHERE、FROM等语句中。使用子查询,可以用一系列简单的查询构成复杂的查询,从而增强SQL语句的功能。 单行子查询不向外层查询返回记录或者只返回一条记录。子查询可以放在SELECT语句的WHERE或FROM等子句中。
SELECT EMPNO,ENAME,SAL,HIREDATE FROM EMP
WHERE SAL=(SELECT MAX(SAL) FROM EMP);
可以看得出来,上面的这段SQL语句,其实是由两段SQL语句组成的,把其中SELECT MAX(SAL) FROM EMP这段当作了第一段的where条件,先通过一句找到员工表里工资最高的数额,然后把这个数额当成where条件去查找工资等于这个数额的员工的详细信息
多行子查询
多行子查询可以向父查询返回多行记录。在WHERE语句中使用多行子查询时,必须使用多行运算符(IN、NOT IN、EXISTS、NOT EXISTS、ALL和ANY等)。例如,查询工资高于部门20中所有员工的雇员信息,先利用子查询获得部门20中所有员工的工资,再利用父查询获得其工资大于等于这些员工的雇员信息。
SELECT ENAME,JOB,SAL,DEPTNO,FROM EMP
WHERE SAL>=ALL(SELECT SAL FROM EMP WHERE DEPTNO=20);
个人见解,多行子查询想必看过上面应该就了解了,多行子查询的意思就是返回多个结果,要让父查询相比这些结果都满足才得出数据。
其实在这里,既然要比部门号为20的所有员工的工资都高,那我们只要满足比部门20的人中工资最高的人高不就可以了?所以在这里我们可以把这段多行子查询转变成单行子查询,可以增加查询的效率:
SELECT EMPNO,ENAME,SAL,HIREDATE FROM EMP
WHERE SAL>= (SELECT MAX(SAL) FROM EMP where DEPTNO=20);
相关子查询
相关子查询是指引用了父查询中某些列的子查询。在相关子查询中,父查询所处理的每一行都先被传递给子查询。子查询依次处理这些行,即将其应用到子查询,如果满足子查询中的条件,则父查询中的这一行就是最终结果集中的一行,直到父查询中的每一行都处理完成为止。一般可以在SELECT或WHERE语句中使用相关子查询。例如,查询负责管理其他雇员的管理员信息,父查询提供一个雇员编号(EMPNO)给子查询,子查询利用该雇员编号查询是否存在一个管理者(MGR)与父查询提供的雇员编号(EMPNO)对应。若存在,则说明该EMPNO就是管理者,将其显示出来。
SELECT EMPNO,ENAME,DEPTNO,SAL FROM EMP A
WHERE EXISTS(SELECT * FROM EMP B WHERE B.MGR=A.EMPNO);
相关子查询的意思呢?就是逐行对比的感觉,父查询和子查询互相分工的查询;实际开发中呢,相关子查询很少用到,因为它的查询效率太低。
多列子查询
select * from emp
where (sal,deptno) in(
select min(sal),deptno from emp
group by deptno
)order by deptno;
意思就是,先查询出各部门中薪水最低的员工的薪水和部门编号集合,然后再从整个表里面找看有没有薪水和部门编号是这个集合里的对象。
增删改
这些想必大家都会,就不过多熬述了,复习一下添加多行数据的方法吧
将SELECT语句检索出来的所有数据行都插入到表中.这条语句通常在从一个表向另一个表快速复制数据行.
create table dept1
( deptno number(2) primary key,
dname varchar2(14),
loc varchar2(13)
);
insert into dept1 select * from dept
分页查询
分页查询这个东西,之前在讲mysql和sqlserver的时候都讲过,但在oracle中,我们就需要接触一个新的东西了,叫做Rownum
Rownum
rownum是一个伪列,它会根据我们查询语句生成一个序列化的数字,当成我们的一个列作用,但其实并不存在这个列,通过这个序列化的虚拟的列Rownum,我们就可以实现返回这个查询结果集合中的N条数据
select rownum,deptno,ename,job,mgr,hiredate from emp
where rownum<10
在上面这条查询语句当中,就是加入了rownum这个虚拟列,方便我们返回前10个数据。
那么我们实现分页查询就很简单了,比如我们设置每五行为一页,显示第二页的内容就是:
select e.* from
( select rownum r,deptno,ename,job,mgr,hiredate from emp ) e
Where r>5 and r<11;
我们可以把每页显示条数n,第几页m当做参数,那么
第一页就是:r>=1 and r<=5
第二页就是:r>=6 and r<=10
第三页就是:r>=11 and r<=15
…
第n页就是:r>=(m-1)*n+1 and r<=m*n
分页查询就很简单了!
以下为附加内容:
rowid
rowid就是唯一标志记录物理位置的一个id,内容是当前行位于哪个文件,块,行的详细信息。
select rownum,rowid,deptno,dname,loc from dept;
dual表
dual表是Oracle数据库中的一个虚表,它有一行一列,所有者是SYS用户,但可以被数据库中的所有用户使用。
不能向该表插入数据,但可以使用该表来选择系统变量,或者求一个表达式的值: