mysql和Oracle的簡單比較
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的簡單比較