安装一个oracle,只有一个数据库。mysql
ORACLE数据库的逻辑单元。 数据库---表空间 一个表空间能够与多个数据文件(物理结构)关联面试
一个数据库下能够创建多个表空间,一个表空间能够创建多个用户、一个用户下能够创建多个表。sql
create tablespace itcastspace datafile 'c:\itcast.dbf' size 100m autoextend on next 10m
itcastspace 为表空间名称数据库
datafile 指定表空间对应的数据文件 编程
size 后定义的是表空间的初始大小oracle
autoextend on 自动增加 ,当表空间存储都占满时,自动增加编程语言
next 后指定的是一次自动增加的大小。ide
create user itcastuser identified by itcast default tablespace itcastspace
identified by 后边是用户的密码 函数
default tablespace 后边是表空间名称工具
oracle数据库与其它数据库产品的区别在于,表和其它的数据库对象都是存储在用户下的。
Oracle中已存在三个重要的角色:connect角色,resource角色,dba角色。
CONNECT角色: --是授予最终用户的典型权利,最基本的
ALTER SESSION --修改会话
CREATE CLUSTER --创建聚簇
CREATE DATABASE LINK --创建数据库连接
CREATE SEQUENCE --创建序列
CREATE SESSION --创建会话
CREATE SYNONYM --创建同义词
CREATE VIEW --创建视图
RESOURCE角色: --是授予开发人员的
CREATE CLUSTER --创建聚簇
CREATE PROCEDURE --创建过程
CREATE SEQUENCE --创建序列
CREATE TABLE --建表
CREATE TRIGGER --创建触发器
CREATE TYPE --创建类型
DBA角色:拥有所有特权,是系统最高权限,只有DBA才能够建立数据库结构,而且系统权限也须要DBA授出,且DBA用户能够操做全体用户的任意基表,包括删除
grant dba to itcastuser
进入system用户下给用户赋予dba权限,不然没法正常登录
oracle不可以自动提交事务。
1. delete删除的数据能够rollback
2. delete删除可能产生碎片,而且不释放空间
3. truncate是先摧毁表结构,再重构表结构
(磁盘碎片,
删除一条数据,空间不会有人来占,空间碎片
truncate,整个空间被摧毁,不会出现碎片问题)
Oracle的自动增加只可以依靠序列来完成。
范例:建立一个seqpersonid的序列,验证自动增加的操做
CREATE SEQUENCE seqpersonid;
序列建立完成以后,全部的自动增加应该由用户本身处理,因此在序列中提供了如下的两种操做:
nextval :取得序列的下一个内容
currval :取得序列的当前内容
select seqpersonid.nextval from dual;
select seqpersonid.currval from dual;
在插入数据时须要自增的主键中能够这样使用
在实际项目中每一张表会配一个序列,可是表和序列是没有必然的联系的,一个序列被哪一张表使用均可以,可是咱们通常都是一张表用一个序列。
序列的管理通常使用工具来管理。
完整语法:
CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCACHE}];
mysql中没有检查约束。
使用检查约束能够来约束字段值的合法范围。
范例:建立一张表性别只能是1或2
create table person( pid number(10) , name varchar2(10), gender number(1) check(gender in (1, 2)), birthday date );
检查约束也能够自定义
create table person( pid number(10) , name varchar2(10), gender number(1), birthday date, constraint person_gender_ck check(gender in (1,2)) );
在LIKE中主要使用如下两种通配符
“%”:能够匹配任意长度的内容
“_”:能够匹配一个长度的内容
排序 order by 经验:当排序时存在null时就会产生问题 nulls first , nulls last
--查询雇员的工资从低到高
select * from emp order by sal nulls first;
select * from emp order by sal desc nulls last ;
select ename,nvl(comm,0), sal*12+nvl(comm,0) from emp;
该函数相似if....else if...esle
select ename, decode(job, 'clerk','业务员', 'salesman','销售', 'predident','总裁' '无业' ) from emp;
select t.empno, t.ename, case when t.job = 'CLERK' then '业务员' when t.job = 'MANAGER' then '经理' when t.job = 'ANALYST' then '分析员' when t.job = 'PRESIDENT' then '总裁' when t.job = 'SALESMAN' then '销售' else '无业' end from emp t
select * from emp where sal>1500 UNION select * from emp where deptno=20
select * from emp where sal>1500 intersect select * from emp where deptno=20
select * from emp where to_char(hiredate ,'yyyy')='1981' minus select * from emp where ='MANAGER' or job='PRESIDENT';
exists (sql 返回结果集为真)
not exists (sql 不返回结果集为真)
--分页思想 子查询
select * from
(select e.*,rownum r from emp e) t
where t.r<11 and t.r>5
视图就是封装了一条复杂查询的语句。
视图是供查询用的,因此是read-only。
[declare] begin [exception] end;
变量的赋值: :=
判断: =
v_name char(15); v_sal number(9,2);
married constant boolean:=true
%type;
引用型变量,即v_name的类型与emp表中ename列的类型同样
在sql中使用into来赋值
declare v_name emp.ename%type; begin select t.ename into v_name from emp t where t.empno = 7369; dbms_output.put_line(v_name); end;
%rowtype
记录变量份量的引用
v_row.ename:='ADAMS';
declare v_row emp%rowtype; begin select * into v_row from emp t where t.empno = 7369; dbms_output.put_line(v_row.ename || ' ' || v_row.sal); end;
存储过程写过吗?
存储过程写过几十行的,多的没写了
存储过程的优势,为何要使用?
效率高,预编译
存储函数是给存储过程来调用的
存储函数能够在sql中来利用的
存储过程没有return
触发器比约束强大
触发器里面不能够有事务
sql优化
尽可能使用子查询,不要使用多表链接。
尽可能不要用select * ,要把字段写出来,提升效率。
创建索引会影响数据的存储
PLSql是过程化编程语言,是为告终合sql
不用左右链接,会出现若是有一个是空值的状况,会显示不出来该条数据。
A left join B on ....
where ...=...(+) '+'号写在相对的那一方
select ....group by ...
(select 后面有的字段 group by 都要有,除了使用函数的)
别名中间不能够加空格
oracle区分大小写
_(下划线) 是占位符
!= 不等号
<> 不等号
函数:
initcap 第一个大写
substr 截取,起始位置,0,1是一回事
replace 替换
length 长度
concat 链接
数值函数:
round 四舍五入
trunc 截取
mod 取余
mysql 取时间:select now();
oracle :select sysdate+10 from dual;
months_between (23 日期函数)
nvl(comm,0) 为空,看成0 看待
order by 始终放最后
where 后面跟的是存在的物理列
insert into emp1
select * from myemp; 用别名或者保证数据类型是同样的
create view view_minsal as select * from .....