1. 程式人生 > >mysql和Oracle的簡單比較

mysql和Oracle的簡單比較

空值 localhost pda varchar2 自連接 smi ins 修改字段 條件

ORA-27101: shared memory realm does not exist解決方法:

1、用CMD進入命令行
2、sqlplus /nolog
3、conn / as sysdba
4、startup

首先介紹一下SQL92/99標準的四大分類

  DML(數據操縱語言):

select,insert,update,delete


  DDL(數據定義語言):

create table,alert table,drop table,truncate table


  DCL(數據控制語言):

grant 權限 to scott,revoke 權限 from scott


  TCL(事務控制語言):

commit,rollback,

下面會分別用類似的需求體現mysql和Oracle的區別

  mysql創建數據庫:

create database xxx;

  在Oracle中是創建表空間

create tablespace xxx;

--指定存放空間
datafile ‘C:xxx.dbf‘
--指定大小
size 100m
--大小滿了自動增長
autoextend on
--每次自動增長的大小
next 10m

  創建表mysql和oracle是一樣的

create table 表名{
  字段名 類型(長度) [約束],
  .....
  .....
}

但是他們的類型各不相同:

 

mysql:
  varchar(n) 字符串
  int 整型
  double 浮點
  date 時間

oracle:

  char:固定長度的字符類型,最多存儲2000個字節
  varchar2:可變長度的字符類型,最多存儲4000字節
  LONG:大文本類型,最大可以存儲2個G
  number:數值類型
  number(5) 最大可以存99999
  number(5,2) 最大可以存999.99
  date:日期時間,精確到秒

mysql修改表結構

 

alter table category add desc varchar(20);

代表給category這個表添加一個字符串長度為20的名為desc的字段

Oracle修改表結構

  

alter table category add (desc varchar2(20));

同上

mysql修改字段

  

alter table category change desc description varchar(30);

將desc這一列的字段的字符長度改為30

Oracle修改字段

  

alter table category modify(desc varchar2(30));

同上

mysql刪除字段

  

alter table category drop desc;

刪除category表中desc這列

Oracle刪除字段

  

alter table category drop column desc;

同上

 mysql和Oracle的增刪改SQL語句都一樣 

插入記錄(insert)
  

insert into category(cid,cname) values(1,xxx);

代表向category表中的cname列插入xxx數據


修改數據(update)
  

update category set cname = yyy where id =1;

代表將category表中id為1的cname字段改為yyy


刪除數據(delete)
  

delete from category where id = 1;

代表刪除category表中的id為一的字段數據

mysql和Oracle的jdbc連接

首先是Oracle
  Oracle導入一個ojdbc14.jar的包
  反射加載驅動為:oracle.jdbc.driver.OracleDriver
  獲取連接:jdbc:oracle:thin:@192.168.80.10:1521:orcl

下面是mysql

  反射加載驅動為:com.mysql.jdbc.Driver
  獲取連接:jdbc:mysql://localhost:3306/test

下面是mysql和Oracle共有的屬性,主要是查詢語句

  這裏使用的是Scott用戶在Oracle中示範

基本查詢:(單表查詢)

  查詢emp表的所有內容
  

select * from emp;


  查詢emp表的不重復的工作
 

 select distinct job from emp;


  查詢員工的編號,姓名,月薪,年薪
 

 select empno,ename,sal,sal*12 from emp;

使用where語句查詢:

  查詢emp表中20號部門的員工信息
  

select * from emp where deptno = 20;


  查詢姓名是SMITH的員工,字符串使用‘‘,內容大小寫敏感
  

select * from emp where ename = SMITH;

範圍查詢:

  查詢工資大於1500的員工
  

select * from emp where sal > 1500;


  查詢薪水在1300到1600之間的員工,包括1300和1600
  

select * from emp where sal between 1300 and 1600;


  查詢不是20號或30號部門的員工
 

 select * from emp where deptno not in (30,20);

like關鍵字:

  查詢姓名以大寫字母N結束的員工
  

select * from emp where ename like %N;

空值查詢:

  查詢傭金為null的員工
  

select * from emp where comm is null;

and和or使用:

  查詢無傭金且工資大於1500的員工
  

select * from emp where(comm is null) and (sal > 1500);


  查詢職位是"MANAGER"或職位不是"ANALYST"的員工
 

 select * from emp where (job=MANAGER) or (job<>ANALYST);

排序查詢和order by使用

  查詢員工信息(編號,姓名,月薪,年薪),按月薪升序排序,默認升序,如果月薪相同,按oracle內置的校驗規則排序
  

select empno,ename,sal,sal*12 from emp order by sal asc;


  查詢員工信息(編號,姓名,月薪,年薪),按月薪降序排序
  

select empno,ename,sal,sal*12 from emp order by sal desc;

聚合統計

  統計工資最高的人
  

select max(sal) from emp;


  統計工資最低的人
  

select min(sal) from emp;


  根據工號統計所有人數
  

select count(deptno) from emp;


  分組後的條件查詢
  查詢部門平均工資大於2000元的部門
  

select deptno "部門編號",trunc(avg(sal),0) "部門平均工資" from emp group by deptno having trunc(avg(sal),0) > 2000 order by 2 desc;


  這裏的2代表的是第二個條件,也就是部門平均工資

需要註意的是:
  where是行過濾器,針對原始記錄,跟在from後面,先執行
  having是組過濾器,針對分組後的記錄,跟在group by後面,後執行

下面是多表查詢:

  連接查詢:
  內連接查詢:只能查詢出符合條件的記錄
  外連接查詢:既能查詢出符合條件的記錄,也能根據一方強行將另一方查詢出來

多表外連接查詢:(左外連接)
  按部門10,20,30,40號,統計各部門員工人數,要求顯示部門號,部門名,人數
  首先是sql99:
  

select dept.deptno "部門號",dept.dname "部門名",count(emp.empno) "人數" from dept left join emp on    dept.deptno = emp.deptno group by dept.deptno,dept.dname;


  下面是Oracle專用語句:
  

select dept.deptno "部門號",dept.dname "部門名",count(emp.empno) "人數" from dept,emp where dept.deptno = emp.deptno(+) group by dept.deptno,dept.dname;


  右外連接
  首先是sql99:
  

select dept.deptno "部門號",dept.dname "部門名",count(emp.empno) "人數" from emp left join dept on emp.deptno = dept.deptno group by dept.deptno,dept.dname;

  下面是Oracle專用語句:
 

 select dept.deptno "部門號",dept.dname "部門名",count(emp.empno) "人數" from dept,emp where emp.deptno(+) = dept.deptno group by dept.deptno,dept.dname;

  自連接查詢:

顯示"SMITH的上級是FORD"
 

 select users.ename || 的上級是 ||boss.ename from emp users,emp boss where users.mgr = boss.empno;

子查詢:
  查詢條件未知的事務
  查詢工資比WARD高的員工信息
  

select * from emp where sal > (select sal from emp where ename = WARD);

mysql和Oracle的簡單比較