MySQL與Oracle對比及區(qū)別說明
一、比較
1、MySQL的特點
- 性能卓越,服務(wù)穩(wěn)定,很少出現(xiàn)異常宕機;
- 開放源代碼無版本制約,自主性及使用成本低;
- 歷史悠久,社區(qū)和用戶非?;钴S,遇到問題及時尋求幫助;
- 軟件體積小,安裝使用簡單且易于維護,維護成本低;品牌口碑效應(yīng);
- 支持多種OS,提供多種API接口,支持多種開發(fā)語言,對流行的PHP,Java很好的支持
2、Oracle的特點
- 兼容性:Oracle產(chǎn)品采用標(biāo)準(zhǔn)SQL,并經(jīng)過美國u構(gòu)架標(biāo)準(zhǔn)技術(shù)所(NIST)測試,與IBM SQL/DS、DB2、INGRES、IDMS/R等兼容。
- 可移植性:Oracle的產(chǎn)品可運行于很寬范圍的硬件與操作系統(tǒng)平臺上??梢园惭b在多種 大、中、小型機上,可在多種操作系統(tǒng)下工作。
- 可聯(lián)結(jié)性:Oracle能與多種通訊網(wǎng)絡(luò)相連,支持各種協(xié)議。
- 高生產(chǎn)率:Oracle產(chǎn)品提供了多種開發(fā)工具,能極大地方使用戶進行進一步的開發(fā)。
- 開放性:Oracle良好的兼容性、可移植性、可連接性和高生產(chǎn)率使Oracle RDBMS具有良好的開放性。
3、MySQL的缺點
- MySQL最大的缺點是其安全系統(tǒng),主要是復(fù)雜而非標(biāo)準(zhǔn),另外只有到調(diào)用mysqladmin來重讀用戶權(quán)限才會發(fā)生改變;
- MySQL的另一個主要的缺點是缺乏標(biāo)準(zhǔn)的RI(Referential Integrity-RI)機制,RI限制的缺乏(在給定字段域上的一種固定的范圍限制)可以通過大量的數(shù)據(jù)類型來補償;
- MySQL不支持熱備份;
4、Oracle的缺點
- 對硬件要求很高;
- 價格比較昂貴;
- 管理維護麻煩一些;
- 操作比較復(fù)雜,需要技術(shù)含量高;
5、技術(shù)選型
Oracle適用場景
- 對數(shù)據(jù)庫有高級需求:如果企業(yè)對數(shù)據(jù)庫的高級需求較高,如存儲復(fù)雜數(shù)據(jù)及其方法,要求高可用性、災(zāi)備恢復(fù)、安全性等,可以考慮用Oracle。
- 大型企業(yè)應(yīng)用:Oracle在處理大規(guī)模、復(fù)雜的企業(yè)級應(yīng)用方面表現(xiàn)出色。它能夠處理海量的數(shù)據(jù)和高并發(fā)的訪問請求,同時支持復(fù)雜的數(shù)據(jù)模型和關(guān)系。
- 項目并發(fā)量高:使用Oracle,它是是OLTP(聯(lián)機事務(wù)處理)最好的工具。
- 安全性要求高:Oracle使用了許多安全功能,如用戶名,密碼,配置文件,本地身份驗證,外部身份驗證,高級安全增強功能等。像金融、銀行等對安全性要求高的項目一般都選用Oracle作為數(shù)據(jù)庫。
- 高可用性和容災(zāi)需求:Oracle提供了強大的高可用性和容災(zāi)解決方案,例如集群配置、數(shù)據(jù)復(fù)制和自動故障轉(zhuǎn)移等,能夠確保系統(tǒng)的連續(xù)性和數(shù)據(jù)的可靠性。MySQL付費版也支持,但可靠性不如Oracle。
MySQL適用場景
- 中小型企業(yè)和個人使用:由于其開源和低成本特性,MySQL廣泛應(yīng)用于中小型企業(yè)的業(yè)務(wù)系統(tǒng)。
- Web應(yīng)用:因其輕量級和高性能,MySQL是大多數(shù)Web應(yīng)用的理想選擇,如內(nèi)容管理系統(tǒng)(CMS)、電子商務(wù)平臺等。
- 移動應(yīng)用和桌面應(yīng)用:適用于各類移動應(yīng)用和桌面應(yīng)用的數(shù)據(jù)庫支持。
二、區(qū)別對比
1、本質(zhì)的區(qū)別
Oracle數(shù)據(jù)庫是一個對象關(guān)系數(shù)據(jù)庫管理系統(tǒng)(ORDBMS)。它通常被稱為Oracle RDBMS或簡稱為Oracle,是一個收費的數(shù)據(jù)庫。
MySQL是一個開源的關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。它是世界上使用最多的RDBMS,作為服務(wù)器運行,提供對多個數(shù)據(jù)庫的多用戶訪問。它是一個開源、免費的數(shù)據(jù)庫。
RDBMS和ORDBMS的區(qū)別
標(biāo)準(zhǔn)
- RDBMS
- ORDBMS
縮寫含義
- 關(guān)系數(shù)據(jù)庫管理系統(tǒng)
- 面型對象數(shù)據(jù)庫管理系統(tǒng)
數(shù)據(jù)存儲方式
- 數(shù)據(jù)存儲在實體里面,以包含特定信息的表格的形式存在
- 數(shù)據(jù)存儲在對象中
數(shù)據(jù)復(fù)雜性
- 處理比較簡單的數(shù)據(jù)
- 比 RDBMS 處理更大且更復(fù)雜的數(shù)據(jù)
分組
- 擁有公共定義的實體集合的不同實體類型
- 用類描述擁有公共的關(guān)系、行為和相似的屬性的一組對象
數(shù)據(jù)處理
- RDBMS 只存儲數(shù)據(jù)
- 存儲數(shù)據(jù)以及方法
主要目標(biāo)
- 數(shù)據(jù)獨立于應(yīng)用程序
- 數(shù)據(jù)封裝
主鍵
- 主鍵可以明顯的標(biāo)識表中的對象
- 對象標(biāo)識符 (object identifier, OID) 對于任何一個對象和實體都是明確且持久的
2、基本操作區(qū)別
(1)、用戶名、端口號
- Oracle默認(rèn)端口:1521 默認(rèn)用戶:system
- MySQL默認(rèn)端口:3306 默認(rèn)用戶:root
(2)、登錄方式
- 連接MySQL:
mysql -u root -p
-- 輸入密碼
-- 查詢所有數(shù)據(jù)庫
show databases;
-- 切換到 "test" 這個數(shù)據(jù)庫
use test;
-- 查詢該數(shù)據(jù)庫所有表
show tables;
--修改戶密碼
set password for 用戶名@localhost = password('新密碼')- 連接Oracle:
sqlplus -- 輸入用戶名 -- 輸入密碼 -- 查詢該用戶的表 select TABLE_NAME from user_tables; --修改密碼 ALTER USER 用戶名 IDENTIFIED BY 新密碼;
(3)、數(shù)據(jù)庫安全性
- MySQL使用三個參數(shù)來驗證用戶,即用戶名,密碼和位置;
- Oracle使用了許多安全功能,如用戶名,密碼,配置文件,本地身份驗證,外部身份驗證,高級安全增強功能等。
3、語法區(qū)別
(1)、大小寫是否敏感
- MySQL:在 Windows 操作系統(tǒng)下,MySQL 默認(rèn)表名、列名等是不區(qū)分大小寫的;在 Linux 等類 UNIX 系統(tǒng)下,默認(rèn)情況下數(shù)據(jù)庫名、表名是區(qū)分大小寫的,列名和索引名是不區(qū)分大小寫的。不過這些行為可以通過配置文件(my.cnf)中的參數(shù)來修改。
- Oracle:表名、列名等通常是不區(qū)分大小寫的。但是 Oracle 會按照創(chuàng)建對象時定義的大小寫形式來存儲對象名稱,并且在引用對象時如果使用了錯誤的大小寫形式,Oracle 會自動將其轉(zhuǎn)換為正確的形式。
(2)、常用字段類型
- MySQL:有多種常用字段類型。例如,整數(shù)類型包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT;浮點數(shù)類型有 FLOAT 和 DOUBLE;字符串類型有 CHAR、VARCHAR、TEXT 等;日期時間類型有 DATE、TIME、DATETIME、TIMESTAMP。其中,TIMESTAMP 類型會自動更新時間戳,在數(shù)據(jù)更新操作時非常有用。
- Oracle:整數(shù)類型如 NUMBER(p),p 表示精度,可以用來表示不同范圍的整數(shù);浮點數(shù)也可以用 NUMBER 類型,通過指定精度和小數(shù)位數(shù)來實現(xiàn);字符串類型主要有 CHAR、VARCHAR2、CLOB 等;日期時間類型包括 DATE(存儲日期和時間)、TIMESTAMP(比 DATE 更精確的時間戳)。Oracle 的 DATE 類型存儲了世紀(jì)、年、月、日、時、分、秒信息。
(3)、時間日期
- MySQL:可以方便地使用函數(shù)來操作日期時間。例如,NOW () 函數(shù)獲取當(dāng)前日期和時間,CURDATE () 獲取當(dāng)前日期,CURTIME () 獲取當(dāng)前時間。在日期時間的計算方面,可以通過 DATE_ADD () 和 DATE_SUB () 函數(shù)來進行日期時間的加減操作。
- Oracle:通過 SYSDATE 函數(shù)獲取當(dāng)前日期和時間,TRUNC (SYSDATE) 獲取當(dāng)前日期部分。日期時間的計算可以使用 INTERVAL 關(guān)鍵字,例如 SYSDATE + INTERVAL ‘1’ DAY 表示在當(dāng)前日期基礎(chǔ)上加一天。
(4)、創(chuàng)建表空間 / 數(shù)據(jù)庫
MySQL:創(chuàng)建數(shù)據(jù)庫相對簡單,使用 CREATE DATABASE 語句。
CREATE DATABASE my_database;
對于表空間管理,在 MySQL 中可以通過 InnoDB 存儲引擎的文件系統(tǒng)來管理表空間,通過設(shè)置參數(shù) innodb_data_file_path 等來配置表空間文件。
Oracle:創(chuàng)建表空間使用 CREATE TABLESPACE 語句,并且可以指定數(shù)據(jù)文件的位置、大小等多種屬性。
CREATE TABLESPACE my_tablespace DATAFILE 'my_tablespace.dbf' SIZE 100M;
創(chuàng)建數(shù)據(jù)庫則需要先創(chuàng)建表空間,然后通過數(shù)據(jù)庫配置助手(DBCA)或一系列復(fù)雜的 SQL 語句來創(chuàng)建數(shù)據(jù)庫,包括定義控制文件、日志文件等。
(5)、創(chuàng)建臨時表
MySQL:可以使用 CREATE TEMPORARY TABLE 語句創(chuàng)建臨時表。
CREATE TEMPORARY TABLE temp_table (id INT, name VARCHAR (20));
臨時表只在當(dāng)前會話中可見,當(dāng)會話結(jié)束時,臨時表會自動被刪除。
Oracle:同樣可以創(chuàng)建臨時表,分為會話級臨時表和事務(wù)級臨時表。會話級臨時表在整個會話期間存在,使用 CREATE GLOBAL TEMPORARY TABLE 語句創(chuàng)建;
CREATE GLOBAL TEMPORARY TABLE temp_table (id NUMBER, name VARCHAR2 (20)) ON COMMIT PRESERVE ROWS;(ON COMMIT PRESERVE ROWS 表示會話級)
事務(wù)級臨時表在事務(wù)結(jié)束時自動刪除,創(chuàng)建時使用 ON COMMIT DELETE ROWS。
(6)、創(chuàng)建表和插入記錄
MySQL:創(chuàng)建表的基本語法是 CREATE TABLE table_name (column1 datatype, column2 datatype, …)
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR (50), age INT);
插入記錄使用 INSERT INTO 語句,如
INSERT INTO users (name, age) VALUES ('John', 30)Oracle:創(chuàng)建表的語法類似,如
CREATE TABLE employees (employee_id NUMBER PRIMARY KEY, employee_name VARCHAR2 (100), department_id NUMBER);
插入記錄時
INSERT INTO employees (employee_name, department_id) VALUES ('Alice', 101);Oracle 還支持通過子查詢來插入數(shù)據(jù),這在復(fù)雜的數(shù)據(jù)加載場景中很有用。
(7)、事務(wù)隔離級別
MySQL:支持四種事務(wù)隔離級別,分別是 :
- READ UNCOMMITTED(讀未提交)、READ COMMITTED(讀已提交)、REPEATABLE READ(可重復(fù)讀)SERIALIZABLE(可串行化)。
- 默認(rèn)的隔離級別是 REPEATABLE READ,在這種隔離級別下可以保證在同一個事務(wù)中多次讀取同一數(shù)據(jù)的結(jié)果是一致的。
Oracle:默認(rèn)的事務(wù)隔離級別是 READ COMMITTED。
- 這意味著一個事務(wù)只能看到其他事務(wù)已經(jīng)提交的數(shù)據(jù)。
- 和 MySQL 一樣,Oracle 也支持其他隔離級別,通過設(shè)置參數(shù)或者在事務(wù)中使用 SET TRANSACTION ISOLATION LEVEL 語句來改變隔離級別。
(8)、事務(wù)提交方式
- MySQL:使用 COMMIT 語句來提交事務(wù),例如 BEGIN; – 開始事務(wù),執(zhí)行一系列 SQL 操作,如 INSERT、UPDATE 等,COMMIT; – 提交事務(wù)。也可以使用 ROLLBACK 語句來回滾事務(wù),即撤銷已經(jīng)執(zhí)行的操作。
- Oracle:事務(wù)提交也是使用 COMMIT 語句,并且事務(wù)控制機制類似??梢栽?SQL*Plus 或者其他客戶端工具中通過 SET AUTOCOMMIT ON/OFF 來設(shè)置自動提交模式。當(dāng) AUTOCOMMIT 為 ON 時,每條 SQL 語句執(zhí)行后會自動提交;當(dāng)為 OFF 時,需要手動使用 COMMIT 或 ROLLBACK 來控制事務(wù)。
(9)、分頁
MySQL:在 MySQL 中,分頁通常使用 LIMIT 子句。例如,SELECT * FROM table_name LIMIT start, count;,其中 start 是起始行索引(從 0 開始),count 是要返回的行數(shù)。這種方式簡單直接,適用于簡單的分頁需求。
Oracle:分頁相對復(fù)雜一些。可以使用 ROWNUM 偽列來實現(xiàn)分頁。例如,
SELECT * FROM (SELECT a.*, ROWNUM rnum FROM (SELECT * FROM table_name) a WHERE ROWNUM <= end_row) WHERE rnum >= start_row;
其中 start_row 和 end_row 分別是起始行和結(jié)束行的編號。
從Oracle 12C開始,提供了一種行限制(row limit)的寫法,這種寫法也可以用于分頁查詢。
select * from emp order by sal fetch first 5 rows only;
EMPNO ENAME MGR HIREDATE SAL COM DEPTNO
---------- -------------------------------------------------- ---------- --------- ---------- ---------- ----------
92 Bryana Worswick 80 03-JUL-18 2504 1 10
99 Rufus McDermott-Row 63 01-MAR-02 2512 61 10
36 Jacenta Joust 71 31-JAN-05 2515 9 30
2 Blisse Adamoli 65 12-APR-14 2517 67 20
98 Simona Shropshire 52 16-AUG-08 2518 24 88(10)、查詢語句
MySQL:基本的查詢語法是
SELECT column1, column2, … FROM table_name WHERE condition;
支持多種連接查詢,如內(nèi)連接(INNER JOIN)、左連接(LEFT JOIN)、右連接(RIGHT JOIN)等。例如
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
Oracle:查詢語法相似,如
SELECT column1, column2, … FROM table_name WHERE condition;
在連接查詢方面,Oracle 也支持標(biāo)準(zhǔn)的 SQL 連接語法,同時還有自己獨特的語法,如使用 “(+)” 來表示外連接,不過這種語法現(xiàn)在已經(jīng)不推薦使用,推薦使用標(biāo)準(zhǔn)的 JOIN 語法。
(11)、id 遞增的處理
MySQL:可以在創(chuàng)建表時使用 AUTO_INCREMENT 關(guān)鍵字來定義一個自動遞增的主鍵列。例如
CREATE TABLE products (id INT AUTO_INCREMENT PRIMARY KEY, product_name VARCHAR (100));
每次插入新記錄時,不需要指定 id 的值,MySQL 會自動為其分配一個唯一遞增的值。
Oracle:沒有像 MySQL 那樣的 AUTO_INCREMENT 關(guān)鍵字。通常使用序列(SEQUENCE)來實現(xiàn)類似的功能。首先創(chuàng)建一個序列,如
CREATE SEQUENCE product_seq START WITH 1 INCREMENT BY 1;
然后在插入記錄時,通過調(diào)用序列的 NEXTVAL 屬性來獲取下一個遞增的值插入到 id 列中,例如
INSERT INTO products (id, product_name) VALUES (product_seq.NEXTVAL, 'Product A');
(12)、null 值處理
MySQL:在查詢中,可以使用 IS NULL 或者 IS NOT NULL 來判斷列值是否為 null。例如,
SELECT * FROM table_name WHERE column_name IS NULL;
在函數(shù)使用中,一些函數(shù)在遇到 null 值時會返回特定的結(jié)果,如 SUM 函數(shù)在計算包含 null 值的列時會忽略 null 值。
Oracle:同樣使用 IS NULL 和 IS NOT NULL 來判斷 null 值。在函數(shù)處理方面,Oracle 的函數(shù)對 null 值的處理方式也有自己的規(guī)則,例如 NVL 函數(shù)可以將 null 值轉(zhuǎn)換為指定的值,NVL (column_name, 0) 會將 column_name 中的 null 值轉(zhuǎn)換為 0。
(13)、小數(shù)格式化
- MySQL:可以使用 ROUND 函數(shù)來對小數(shù)進行四舍五入,例如 ROUND (number, decimal_places),其中 number 是要格式化的數(shù)字,decimal_places 是要保留的小數(shù)位數(shù)。另外,也可以通過 CONVERT 函數(shù)來轉(zhuǎn)換數(shù)據(jù)類型,從而實現(xiàn)一定程度的小數(shù)格式化。
- Oracle:也有 ROUND 函數(shù),使用方式類似。同時,Oracle 還可以使用 TO_CHAR 函數(shù)將數(shù)字轉(zhuǎn)換為字符格式來進行更靈活的格式化,例如 TO_CHAR (number, ‘FM9999.99’) 可以將數(shù)字格式化為指定的小數(shù)格式,其中 ‘FM’ 表示去除前面多余的空格。
(14)、多條件判斷
MySQL:在 WHERE 子句中可以使用 AND、OR 邏輯運算符來組合多個條件。例如,
SELECT * FROM table_name WHERE condition1 AND condition2;
也可以使用 CASE 語句在查詢結(jié)果中進行多條件判斷,例如
SELECT column_name, CASE WHEN condition1 THEN value1 WHEN condition2 THEN value2 ELSE value3 END AS new_column FROM table_name;
Oracle:邏輯運算符 AND 和 OR 的使用方式與 MySQL 相同。Oracle 也支持 CASE 語句,并且還支持 DECODE 函數(shù)進行簡單的多條件判斷,例如
SELECT column_name, DECODE (condition, value1, result1, value2, result2, default_result) AS new_column FROM table_name;
(15)、單引號的處理
MySQL:在 SQL 語句中,字符串常量通常需要用單引號括起來。如果字符串本身包含單引號,需要使用反斜杠()進行轉(zhuǎn)義,例如
INSERT INTO table_name (column_name) VALUES ('It's a sample');Oracle:同樣,字符串常量用單引號括起來。如果有單引號,需要使用兩個單引號來表示一個單引號,例如
INSERT INTO table_name (column_name) VALUES ('It''s a sample');(16)、模糊查詢
MySQL:使用 LIKE 關(guān)鍵字進行模糊查詢,支持通配符 “%”(表示任意字符序列)和 “_”(表示任意單個字符)。例如,
SELECT * FROM table_name WHERE column_name LIKE '% keyword%';
Oracle:也使用 LIKE 關(guān)鍵字進行模糊查詢,通配符的使用方法與 MySQL 相同。此外,Oracle 還提供了一些高級的文本搜索功能,如使用 CONTAINS 函數(shù)(需要安裝并配置 Oracle Text 組件)來進行更復(fù)雜的文本搜索。
(17)、時間相減
oracle對于計算前7天,時間減7就行了,計算前1個小時,時間減1/24就行了,加法同理:
select TO_DATE('2023-03-28 15:51:20', 'yyyy-mm-dd hh24:mi:ss') -7 from dual;
-- 計算前7天,結(jié)果:2023-03-21 15:51:20
select TO_DATE('2023-03-28 15:51:20', 'yyyy-mm-dd hh24:mi:ss') -1/24 from dual;
-- 計算前1個小時,結(jié)果:2023-03-28 14:51:20mysql計算前7天,或者前1個小時,需要用不同的關(guān)鍵字:
select date_sub('2023-03-28 15:51:20' ,interval 7 day);
-- 計算前7天,結(jié)果:2023-03-21 15:51:20
select date_sub('2023-03-28 15:51:20' ,interval 1 hour);
-- 計算前1個小時,結(jié)果:2023-03-28 14:51:20總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
innodb如何巧妙的實現(xiàn)事務(wù)隔離級別詳解
隔離是ACID(Atomicity,Consistency,Isolation,Durability)的重要部分,下面這篇文章主要給大家介紹了關(guān)于innodb如何巧妙的實現(xiàn)事務(wù)隔離級別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2018-11-11
MySQL?中MATCH?全文搜索關(guān)鍵字示例詳解
這篇文章主要介紹了MySQL?中MATCH?全文搜索關(guān)鍵字詳解,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-09-09
MySQL 5.6.51 解壓版(zip版)安裝配置圖文方法
這兩天剛試用了一下MySQL5.6.51,感覺還不錯,有兄弟戲稱是一個高富帥版本?,F(xiàn)將MySQL5.6.51 zip解壓版本的安裝配置過程記錄如下,希望能給需要安裝該版本的朋友一點參考作用2015-08-08

