Oracle=神谕=他的第一个客户CIA
版本:11g
服务=services.msc 注册表=regedit
sqlplus=与Oracle数据库相互通讯的工具
两个用户:system(系统管理员)/scott[被锁定的普通用户]
启动的服务:Oracleservice,TNS
匿名登录:
常见用法
切换用户:conn scott/etoak
用户解锁:alter user scott account unlock;
用户加锁:alter user scott account lock;
授权:grant dba to scott;
创建新用户:create user 用户名 identified by 密码;[前提:创建新用户的用户必须授权或者有权力]
撤销授权:revoke dba form scott;
查看当前用户:show user;
更改密码:alter user scott identified by et;
卸载步骤:
定义:SQL: Structured Query Language =结构化查询语言
DDL:Data Defination Language = 数据定义语言
create 创建 alter 修改 drop 删除 truncate 截断
DML:Data Manipulation Language =数据操纵语言
insert 增加 delete 删除 update 修改
DQL: Data Query Language =数据查询语言
select 查询
DCL: Data Control Language =数据控制语言
grant 授权 revoke 取消授权
TCL:事务控制语言
commit 提交 rollback 回滚 savepoint 保存还原点
小练习
请输入用户名: scott
输入口令:
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> grant dba to scott;
授权成功。
SQL> create user et identified by et;
用户已创建。
SQL> grant dba to et;
授权成功。
SQL> conn et/et
已连接。
SQL> create user et2106 identified by et2106;
用户已创建。
SQL> drop user et2106;
用户已删除。
SQL>
字符型:
varchar2(20) 可变字节0-4000字节
char(6) 固定字节 0-2000字节
数值型:
number()
number(5) :五位整数
number(5,1) :一共五位数1234.5 0.1000 1234.0
number(5,-1) :将数值最后一位变为0 存进去12345会变成12340
日期型:
date 年月日 时分秒
timestamp 包含毫秒数
创建表:
create table student(
name varchar2(20),
birthday date,
salary number(5)
);
改表名:
alter table student rename to stu;//把student改为stu
查看当前用户下有哪些表:
select table_name form user_tables;
添加字段:
alter table student add email varchar2(20);
更改列名:
alter table student rename column email to youxiang;
删除列名:
alter table student drop column youxiang;
修改数据类型:
alter table student modify name varchar2(50);
删除表结构:[删除表结构和表数据]
drop table student;
drop table student purge;//将垃圾站的student表删除(永久删除)
查看表:
desc student;
截断表:[删除表数据和表空间]
truncate table student;
新增数据:
insert into student(name,birthday,salary) values('zs',sysdate,5000);
删除数据:
delete from student;
delete from student where name = 'ls';
修改数据:
update student set salary=salary+200 where name='zs';
update student set salary=salary+200,name='ZS' where name='zs';//更改两个值
update student set salary=salary+200,name='ZS' where name='zs' and name='ls';
查询数据:
select * from student;
select name,salary from student;
select name,salary from student where name=‘zs’ and salary=5000;
select s.name,s.salary*3 as sal from student s;//查询student(重新命名为s)表里的姓名和薪资(薪资显示为原来的三倍并把列名改为sal【as通常省略】)查询只是显示数据,怎么显示数据可以自定义,但不会对真实的数据表修改。
模糊查询:like
%:代表任意位的任何字符
_:代表一位上的任意字符
select name from student where name like 'ET%';//ET开头的
select name from student where name like 'ET_';//ET开头后面只有一个字符的
select name from student where name like 'ET_%';//查询ET开头并且后面至少有一个字符的
escape:逃离符
通过指定一个字符进行逃离,来保证like后面的字符是普通字符
select name from student where name like 'ET,_,%' escape ',';//查出来的结果是ET_%
select name from student where name like 'ET._.%' escape '.';//查出来的结果是ET_%
判断空:is (not)null 是(非)空
select * from student where birtdhay is not null;
相关知识:
运算符:±*/
比较:> < >= <= != Oracle中的不等于为<>
条件:and or between and闭合区间
select name,salary from student where salary between 5000 and 6000;
优化写法:
select name,salary from student where salary >=5000 and salary<=6000;
TCL:事务控制语句
*:事务只会影响DML操作
事务:在一些列操作中有多个步骤,只有所有的步骤成功执行那么整个操作才算完成,如果有其中一个环节失败,那么整个操作都算失败。
Oracle中在sqlplus中开启事务:
set autocommit off; – 关闭自动提交
set autocommit on; – 开启自动提交
提交操作:将受影响的数据持久化到数据库中
原子性:事务不可再分
一致性:数据类型保持一致
持久性:事务能够将数据持久化到数据库中
隔离性:多个事务之间可能会产生一些隔离性问题
脏读:事务B读取到事务A中未提交的数据,然后事务A对刚才的操作进行了回滚操作,那么事务B读取到的数据就无效了,也就是脏数据
– 读到了其他事务未提交的数据
不可重复读:事务A对表内数据修改提交后,事务B再次读取数据,发现和之前读取到的数据不一样
– 一次读取到的数据其他事务对数据进行了修改,再次读取数据不一致
幻读:事务A对表新增数据并提交以后,事务B再次读取这张表,就会发现数据多了,就像发生了幻觉一样
– 相同的查询条件,在别的事务添加或者删除数据后,再次查询不一致
数据库事务的隔离级别一共有4个,由低到高依次为Read uncommitted
,Read committed,Repeatable read,Serializable,这四个隔离级别可以逐个解决脏读,不可查重复读,幻读这几个问题。
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
未提交读 Read uncommitted | 会 | 会 | 会 |
提交读 Read committed | 不会 | 会 | 会 |
可重复读 Repeatable read | 不会 | 不会 | 会 |
序列化 Serializable | 不会 | 不会 | 不会 |
Oracle中的提交读级别:(默认)
set transaction isolation level read committed;
*:更改数据库的隔离级别必须在开启事务的第一句话来更改
commit:提交 将数据持久化到数据库中
rollback:回滚 将事务中的操作回滚到第一步操作之前,就当什么都没发生
savepoint:还原点 可以回退到指定的位置
显示提交:在事务中手动commit
隐式提交:在事务中,如果正在执行DML操作,突然做了一个DDL操作,数据库会自动在DDL操作之前隐式的做一个commit操作当发生以下操作时,事务将结束
1.利用commit/rollback进行事务提交和回滚
2.执行DDL语句时,事务将自动提交
3.如果使用sqlplus时,正常退出事务会自动提交,非正常退出事务回滚
锁可以防止事务之间的破坏性交互,约束了最大程度的并发性,数据的完整性
排他锁(X锁)防止资源共享,也就是当一个事务正在操作数据时,其他事务不可以操作这个事务的数据。
共享锁(S锁)被锁住的数据只能被读取,但是不能修改。
DML锁:也就数据锁,用于保护数据,事务在最开始时添加,通过commit或者rollback释放。
DDL锁:可以保护数据对象的结构。Oracle自动的施加的释放。
内部闩锁:保护数据库的内部结构,完全自动调用。
行级锁:也叫事务锁,防止数据被同时多个事务进行修改,直到commit或者rollback。
表级锁:防止在修改数据的时候,表结构发生变化。
select name,salary from student for update;
会对student表进行加锁,此时只允许当前session对已经存在的数据进行更新,其他session仍可以进行insert操作。
锁等待也叫锁冲突,锁等待会严重影响数据库的性能和日常工作。
死锁,也就锁等待的一种,但是死锁会让事务一直处于锁等待的状态。
select sid,serial#,username from v s e s s i o n w h e r e s i d i n ( s e l e c t b l o c k i n g s e s s i o n f r o m v session where sid in (select blocking_session from v sessionwheresidin(selectblockingsessionfromvsession);
select sql_text from v s q l w h e r e h a s h v a l u e i n ( s e l e c t s q l h a s h v a l u e f r o m v sql where hash_value in (select sql_hash_value from v sqlwherehashvaluein(selectsqlhashvaluefromvsession where sid in(select session_id from v$locked_object));
https://localhost:1158/em
性能–>其他监视链接–>实例锁
聚组函数(组函数、聚簇函数):(group by分组)
max() 最大值 min() 最小值 avg() 平均值 sum() 求和 count() 求记录数
单行函数
ceil() 向上取整 floor() 向下取整 abs() 求绝对值 sign() 求符号位(正数返回1,负数返回-1、0返回0)power(a,b) 求a的b次方 sqrt() 求正平方根
round() 求四舍五入
select round(3.141592654) from dual;--保留整数3
select round(3.141592654,3) from dual;--保留三个小数3.142
trunc() 求直接截断
select trunc(3.141592654) from dual;--3
select trunc(3.141592654,3) from dual;--3.141
日期函数
两个日期可以相减,单位是天
sqlplus中
alter session set nls_data_format ='yyyy-mm-dd hh24:mi:ss';
永久修改方式:配置环境变量
yyyy 年 year
mm 月 month 带’月’的月份
ddd 日 年中的日
dd 日 月中的日
d 日 周中的日
hh24 24小时制
hh12 12小时制
mi 分
ss 秒
xff 毫秒
ff3 毫秒保留三位
add_months() 在某个日期上添加月份
select add_months(sysdate,3) from dual;
months_between() 两个日期之间存在多少个月
select months_between(sysdate,to_date('20210609','yyyy-mm-dd')) from dual;
next_day() 下个周几的具体日期
select next_day(sysdate,'星期一') from dual;
last_day() 给定日期所在月份的最后一天
select last_day(sysdate) from dual;
转换函数
to_number() 将一个字符类型的数转换成数值类型的
select name,email from student where to_number(email) = 1;
to_char()
a.将数值类型的转换成字符类型的
select name,sal from student where to_char(sal) = '6000';
b.格式化字符串,常用在货币单位
select to_char('10000000','999,999,999,999.99') from dual;
c.将日期类型转换成字符类型
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss:ff3') from dual;
to_date() 将字符类型的日期转换成日期类型的日期
select to_date('20210809115050','yyyy-mm-dd hh24:mi:ss') from dual;
字符函数
lower() 转换成小写 upper() 转换成大写 initcap() 首字母大写
length() 求长度
substr(原字符串,截取位置[最小位为1],截取长度) 截取参数
repalce(原字符串,要替换的字符串,替换成新的字符串) 完全替换
instr(原字符串,想要找到的字符,查找位置,第几次出现) 索引字符串
concat(字符串1,字符串2) 拼接字符串
lpad(原字符串,以什么补,补到多少位) 左侧补全
rpad(原字符串,以什么补,补到多少位) 右侧补全
trim() 默认去除两侧的空格
trim(字符串1 from 原字符串) 将原字符串两侧的字符串1去掉
select trim('a' from 'aaababaaa') from dual;
ltrim():左侧去除
rtrim():右侧去除
select ltrim(’ abc’) from dual;
select ltrim(’ abc’,‘a’) from dual;
通用函数
nvl(原字符串,是空展示什么) 空值处理
nvl2(原字符串,不是空展示什么,是空展示什么) 空值处理二代
decode(c1,c2,c3,c4,c5…cx,cx+1)
c1是原字符串,从第二个参数开始,每两个参数看作是一组,拿每组的第一个参数和c1进行比较,如果相同则返回该组的第二个参数
相当于:
第一次比较:c2 == c1 ? c3 :
第二次比较:c4 == c1 ? c5 :
如果参数个数是奇数个,并且最终判断没有相同的值,则返回空
如果参数个数是偶数个,并且最终判断没有相同的值,则返回最后一个参数的值
条件取值语句:
(case – 拿来做比较的值
when – 如果…
then – 则…
else – 否则…
end) – 结束
select ename,job,sal,(case job when 'CLERK' then sal+500 when 'SALESMAN'then sal-500 else sal-300 end) total from emp;
分组:group by
将一张表中某个列上或者多个列上相同的值划分为一个组,那么这个表就被分为多个组
*:如果根据字段A分组那么只能查询字段A,如果想展示其他字段需要以组函数的形式出现
having :条件
distinct :去重
order by:排序【asc升序[默认]、desc降序】
查询关键字的优先级:
select 列名 --优先级高于order by
from 表名 --优先级最高
where 条件 --优先级次高
group by 分组 --优先级次于where
having 条件 --优先级在group by 之后
order by 排序 --优先级最低
主键约束:primary key
主键:在一张表中唯一能定位一条数据的列,称为主键
特点:非空且唯一
*:建表时添加主键
create table test(id number(5) primary key,name varchar2(20));
*:建表时未添加主键,后期添加主键
create table test2(id number(5),name varchar2(20));
alter table test2 add constraint zj primary key(id);
外键约束:foreign key *:references
外键:在子表中有一个列引用了母表中的主键列,那么这个列在子表中称为外键
特点:一张表里面可以有多个外键
唯一约束:unique
检查约束:check
非空约束:not null
查看当前用户下有哪些约束:
select constraint_name,constraint_type,table_name from user_constraints;
如何删除约束:
alter table test2 drop constraint zj;
注意:
常用约束:主键约束,外键约束
约束越多,表越健壮,效率越低
子查询=嵌套查询= 某些条件是通过查询得出来的
select子查询 from 子查询 where 子查询
自查询:
select student.name,school.name from student,school
where student.sid = school.id;
连表查询
内连接:inner join on=join on
*:两张表有关联关系的数据
*:from 表 join 表 on 关联关系
select student.name,school.name from student
join school on student.sid = school.id;
外连接:不仅包含有关联关系的数据,还包含没有关联关系的数据
左外连接:left join on
*:以左表为主,左表的所有数据都展示,右表对应不上的以空展示
*:左表关联上右表的数据 + 关联不上的左表的数据
*:from 左表 left join 右表 on 关联关系
select school.name,student.name from school
left join student on student.sid = school.id;
右外连接:right join on
*:以右表为主,右表的所有数据都展示,左表对应不上的以空展示
*:左表关联上右表的数据 + 关联不上的右表的数据
*:from 左表 right join 右表 on 关联关系
select student.name,school.name from student
right join school on student.sid = school.id;
全外连接:full join on
*:两张表的数据都展示
*:左表关联上右表的数据 + 关联不上的左表的数据 + 关联不上的右表的数据
select student.name,school.name from student
full join school on student.sid = school.id;
交叉连接:cross join
*:两张表的数据一一对应,交叉形成最后结果
select student.name,book.bname from student
cross join book;
伪列:
rownum
*:oracle分页的依据,每多一条数据自动加一
*:不能使用表名.rownum的写法
*:如果rownum用在where之后,rownum>=1 rownum<=任意值
select content from lyric where rownum between 1 and 10;
SELECT content FROM (select rownum rn ,content from lyric where rownum <=20) a
where a.rn>=11;
SELECT content FROM (select rownum rn ,content from lyric where rownum <=30) a
where a.rn>=21;
SELECT content FROM (select rownum rn ,content from (select * from lyric order by content desc) where rownum <=30) a
where a.rn>=21;
当前页:curpage 每页条数:pagesize
当前页的开始数:curpage-1)*pagesize+1 当前页截止数:curpage 乘 pagesize
rowid
数据库会在添加数据的时候给每一条数据增加的物理地址唯一标识
*:适用于删除完全重复的数据
delete from lyric where rowid not in
(select min(rowid) from lyric group by content);
in:表示是查询结果中的任意一个值
字段 in (值1,值2,值3)
字段<>值1 or 字段<> 值2 or 字段<> 值3
select id,name from school where id in (select sid from student);
not in:表示不能是查询结果中任意一个值
字段 not in (值1,值2,值3)
字段<>值1 and 字段<> 值2 and 字段<> 值3
select id,name from school where id not in (select sid from student);
some/any:用法与in相同,in用在无符号的情况,some/any用在有符号的情况
大于any = 大于min
小于any = 小于max
select id,name from school where id = some (select sid from student);
select id,name from school where id > any (select sid from student);
all:比所有的值都大,比所有的值都小
大于all = 大于 max
小于all =小于min
select ename,sal from emp where sal >any (select sal from emp where deptno=20);
select ename,sal from emp where sal >all(select sal from emp where deptno=30);
exists:存在
not exists:不存在
select id ,name from school where exists (select sid from student where student.sid=school.id);
union:结果唯一【效率低】
结果进行合并,去重,排序【默认升序】
select id,name from school where name like '山东%'
union
select id,name from school where name like '%大学';
union all:结果不唯一【效率高】
拼合两个结果
select id,name from school where name like '山东%'
union all
select id,name from school where name like '%大学';
intersect:求交集
select id,name from school where name like '山东%'
intersect
select id,name from school where name like '%大学';
minus:第一个结果集中减去第二个结果集重复的数据
select id,name from school where name like '山东%'
minus
select id,name from school where name like '%大学';
视图:view
将查询结果保存在数据库中,下次查询不需要编译直接从数据库中获取
经过函数修饰过的列名,需要重命名,不能重名
创建视图:
create view 视图名 as 查询语句
视图可以提高查询效率,避免没有权限的用户查看隐私字段
简单视图数据可以来源于原表,复杂视图需要手动编译(alter view 视图名 compile )
create view v_emp as select empno,ename,to_char(hiredate,'yyyy') year,sal from emp where sal>2000 order by sal desc;//创建视图
select * from v_emp;//查看视图
drop view v_emp ;//删除视图
序列:sequence
*:一个有序的整数列值,Oracle通过调用序列来实现主键自增
*:在一个新的会话中必须调用序列的下一个值,才能查看序列当前值
*:调用序列的下一个值会作为下一次调用序列的初始值
创建序列:
create sequence seq_test
increment by 1 -- 一次增长1
start with 1 -- 从1开始
minvalue 1 -- 最小值
maxvalue 100 -- 最大值
cycle -- 循环 默认不循环
nocache; -- 不缓存 默认缓存20
alter system set deferred_segment_creation = false;
create table test2(id number(5),name varchar2(20));
create sequence seq_test2;
insert into test2 values(seq_test2.nextval,'橘子');
insert into test2 values(seq_test2.nextval,'西瓜');
select * from test2;
查看当前用户下有哪些序列:
select * from user_sequences;
查看序列的当前值:
select seq_test.currval from dual;
查看序列的下一个值:
select seq_test.nextval from dual;
删除序列:
drop sequence seq_test;
表空间tablespace
在一段内存中多数存储的是表,所以称为表空间
用户的表空间
普通用户的表空间
管理用户的表空间
为什么要给普通用户分配属于自己的表空间?
在项目中会出现多个项目访问同一个数据库的情况,会产生资源争用问题,给用户分配属于自己的表空间,就能解决资源争用问题。
创建表空间:
create tablespace table_user -- 表空间的名字
datafile 'D:/table_user.dbf' -- 表空间的位置
size 5M -- 初始大小
autoextend on next 5M -- 下一次自动拓展多少
maxsize 100M; -- 最大值
创建用户并给分配默认的表空间:
create user ET identified by etoak default tablespace table_user;
创建用户未指定表空间:
create user ET2 identified by etoak;
给用户修改表空间:
alter user ET2 default tablespace table_user;
删除表空间:
如果删除用户指定的表空间,该用户仍指向原表空间位置,需要手动指定一个有效的表空间位置
drop tablespace table_user including contents and datafiles;
索引:index[最有效的优化代码方式]
*:数据库会给唯一约束的列添加唯一索引
适用场景:数据量大 ,频繁查找的字段,外键
特点:提高查询效率,数据量大,查询多的列适合添加索引
增删改数据的时候数据库会耗费资源去维护索引
创建索引:
create index 索引名 on 表名(列名)
create index ind_name on student(name);
删除索引:
drop index 索引名
drop index ind_name ;
索引类型:
create index 索引名 on 表名(列名);
create index ind_name on student(name);
create unique index 索引名 on 表名(列名);
create unique index ind_sid on student(sid);
分类索引
数量比较大,基数比较小
create bitmap index 索引名 on 表名(列名);
create bitmap index ind_cid on student(cid);
create index 索引名 on 表名(函数(列名));
create index ind_lengthname on school(length(name));
删除索引:
drop index ind_sid;
什么情况会使索引失效?
sql语句优化:
MySQL是一个关系型数据库管理系统,是由瑞典的MySQLAB公司研发,之后被Oracle 公司收购,
目前是甲骨文旗下的产品。
MySQL是目前最流行的关系型数据库管理系统之一在小型的web应用中,
MySQL是最好的RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。
MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个
大仓库内,这样就增加了速度并提高了灵活性。
但是注意,MYSQL中存在大量的database,用户首先选择database,之后在database中
建立表,这一点与Oracle不同。
MySQL同样使用SQL语言,此语言是用于访问数据库的最常用标准化语言。
MySQL软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,
尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
由于其社区版的性能卓越,安装简便,搭配Apache旗下的Tomcat等工具可以组成良好的开发环境。
1:使用CMD连接mysql mysql -u root -p etoak
*:在cmd中使用mysql命令时,我们可以直接指定要连接的数据源
mysql -u root -p etoak test
2:在开始菜单中连接mysql
开始->mysql->Line Client->enter password
查看当前有哪些可用的数据源:
show databases;
创建数据源:
create database etoak;
使用某个数据源:
use etoak;
查看当前数据源下有哪些表:
show tables;
查看表结构:
desc 表名;
explain test;
show colums from test;
mysql中的自动增长:
create table test(
tid int primary key auto_increment,
tname varchar(10),
birth date
);
增加:
insert into test(tid,tname,birth) values(null,'葫芦娃','2018-04-16');
insert into test values(null,'金刚','2018-04-16');
insert into test(tid,tname,birth) values(null,'喜洋洋','2018-04-16');
insert into test(tid,tname,birth) values(null,'美羊羊','2018-04-16');
insert into test(tid,tname,birth) values(null,'懒洋洋','2018-04-16');
insert into test(tid,tname,birth) values(null,'沸羊羊','2018-04-16');
insert into test(tid,tname,birth) values(null,'灰太狼','2018-04-16');
insert into test(tid,tname,birth) values(null,'暖洋洋','2018-04-16');
insert into test(tid,tname,birth) values(null,'慢羊羊','2018-04-16');
insert into test(tid,tname,birth) values(null,'潇洒哥','2018-04-16');
insert into test(tid,tname,birth) values(null,'黑大帅','2018-04-16');
删除:
delete from test where tid=3;
修改:
update test set tname = '金刚' where tid = 2;
删除表:
drop table if exists test;
删除数据保留表结构:
truncate test;
分页:
如果limit之后只有一个值,从第一条开始数五条数据
select * from test limit 5;
如果有两个参数:第一个数为>5开始,第二个数多少个条数
select * from test limit 5,5;
拿取表中记录数:
select count(*) from test;
-- 复制表结构和表数据
create table emp2 as select * from emp;
-- 复制表结构
create table emp3 as select * from emp where 1 = 2;
-- 复制指定列的表结构和表数据
create table emp4 as select empno,ename from emp;
-- 在新表中给列以新的列名出现
create table emp5(id,name) as select empno,ename from emp;
-- 一次性添加多条数据
insert into emp3 select * from emp;
1.Oracle基于用户的,表是属于某个用户的。所以,查看表首先需要登录到某个用户下;MySQL基于
Database的,表是存在于某个Database中的,所以要想查看表,首先打开某个database;
2.Oracle是不支持auto_increment自动增长列,【oracle数字主键可以使用序列生成主键】MySQL支持
auto_increment自动增长的。
3.Oracle不支持if [not] exists 子句,mysql支持的
4.Oracle分页使用关键字 rownum,MySQL分页 关键字 limit
5.oracle中sqlplus这个客户端是需要手动提交的,当执行完insert /update /delete语句时需要手动
commit;mysql的客户端自动提交的。
主键
mysql:一般使用自动增长类型,在创建表的时候只要指定表的主键为auto_increment,
插入记录时,不需要再指定该记录的主键值;
oracle:没有自动增长类型,主键一般使用序列,插入记录时将序列号的下一个值赋给
该字段即可。
分页
mysql:limit开始位置,记录个数;
oracle:通过rownum字段标明位置进行分页。
引号
mysql:单引号,双引号都可以;
oracle:一般不准使用双引,用了会报error。
分组
mysql:group by 语句可以select 没有被分组的字段;
group_concat()
select tname,group_concat(tid)
from test group by tname;
oracle:select语句后必须有group by后分组的字段。
wm_concat()
转换数据
mysql:case when;
oracle:decode();
空值处理
mysql:非空字段也有空的内容;
oracle:定义了非空字段就不容许有空的内容。
按照mysql的not null来定义oracle的表结构,导数据时候会产生错误;
因此导数据时要对空字符进行判断,如果为null或空字符,需要把它改成一个空格的字符串。
提交问题
oracle中sqlplus这个客户端是需要手动提交的,当执行完insert /update/delete语句时需要手动commit;
mysql的客户端自动提交的
exists
Oracle不支持if [not] exists 子句,mysql支持的
表的所属者
Oracle基于用户的,表是属于某个用户的。所以,查看表首先需要登录到某个用户下;MySQL基于
Database的,表是存在于某个Database中的,所以要想查看表,首先打开某个database;