本系列文章:
?? MySQL(一)SQL語(yǔ)法、數(shù)據(jù)類型、常用函數(shù)、事務(wù)
?? MySQL(二)MySQL SQL練習(xí)題
?? MySQL(三)視圖、存儲(chǔ)過(guò)程、索引
?? MySQL(四)存儲(chǔ)引擎、鎖
?? MySQL(五)MySQL架構(gòu)、數(shù)據(jù)庫(kù)優(yōu)化、主從復(fù)制
?? MySQL(六)SQL語(yǔ)句優(yōu)化
?? MySQL(七)MySQL和Oracle、PostgreSQL的區(qū)別
一、MySQL和Oracle
1.1 基本差別*
-
數(shù)據(jù)庫(kù)類型
??Oracle數(shù)據(jù)庫(kù)是一個(gè)對(duì)象關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(ORDBMS),MySQL是一個(gè)開(kāi)源的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)。
??對(duì)象關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng):基于對(duì)象模型,存儲(chǔ)數(shù)據(jù)及其方法,數(shù)據(jù)存儲(chǔ)在對(duì)象中。擁有對(duì)象類、對(duì)象標(biāo)識(shí)、多態(tài)、封裝和繼承等特性。用于存儲(chǔ)復(fù)雜的數(shù)據(jù)。
??關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng):基于關(guān)系模型, 只存儲(chǔ)數(shù)據(jù),數(shù)據(jù)存儲(chǔ)在實(shí)體里面,以包含特定信息的表格的形式存在。用于處理比較簡(jiǎn)單的數(shù)據(jù)。
-
客戶規(guī)模
??Oracle主要面向大企業(yè)級(jí)別的用戶,而MySQL則更適合中小型企業(yè)和個(gè)人。 -
成本
??Oracle付費(fèi),MySQL免費(fèi)。 -
可移植性和兼容性
??MySQL可以很容易地在各種平臺(tái)上運(yùn)行,并與其他許多開(kāi)源軟件集成。Oracle雖然也有跨平臺(tái)支持,但更偏向于使用自己的技術(shù)堆棧和產(chǎn)品集成。 -
安全性
??Oracle使用了許多安全功能,如用戶名,密碼,配置文件,本地身份驗(yàn)證,外部身份驗(yàn)證,高級(jí)安全增強(qiáng)功能等。MySQL只使用三個(gè)參數(shù)來(lái)驗(yàn)證用戶,即用戶名,密碼和位置。 -
內(nèi)存
??Oracle占有內(nèi)存空間大(因?yàn)槊鎸?duì)對(duì)象,并且還存儲(chǔ)數(shù)據(jù)的方法);MySQL占有內(nèi)存空間比較小。 -
性能和擴(kuò)展性
??由于MySQL的精簡(jiǎn)設(shè)計(jì)和管理方式,所以其性能通常比Oracle更高,尤其在讀取和寫入方面。MySQL的擴(kuò)展性也相對(duì)較好,因?yàn)槠渖鐓^(qū)活躍,有許多插件和工具可供選擇和使用。 -
支持并發(fā)量
??Oracle使用行級(jí)別的鎖,不依賴索引來(lái)鎖定某一行,鎖資源的粒度小,所以并發(fā)性高,支持大并發(fā)訪問(wèn)量;
??MySQL只有InnoDb支持行鎖,而且必須依賴索引才能用到行鎖,否則會(huì)使用表鎖,所以并發(fā)性較低,面對(duì)大訪問(wèn)量可以做分表分庫(kù)優(yōu)化。 -
數(shù)據(jù)量
??Oracle單表數(shù)據(jù)量,可以千萬(wàn),甚至上億的規(guī)模;Mysql單表數(shù)據(jù)量,最好控制在百萬(wàn)級(jí)別。 -
事務(wù)隔離級(jí)別
??Oracle默認(rèn)的是 read commited(讀已提交)的隔離級(jí)別,會(huì)有不可重復(fù)讀+幻讀的問(wèn)題。
??MySQL默認(rèn)是 repeatable read(可重復(fù)度)的隔離級(jí)別,只會(huì)有幻讀的問(wèn)題。 -
臨時(shí)表
??在MySQL中,臨時(shí)表是僅對(duì)當(dāng)前用戶會(huì)話可見(jiàn)的數(shù)據(jù)庫(kù)對(duì)象,并且一旦會(huì)話結(jié)束,這些表將自動(dòng)刪除。
??Oracle中臨時(shí)表的定義與MySQL略有不同,因?yàn)榕R時(shí)表一旦創(chuàng)建就會(huì)存在,直到它們被顯式刪除,并且對(duì)具有適當(dāng)權(quán)限的所有會(huì)話都可見(jiàn)。但是,臨時(shí)表中的數(shù)據(jù)僅對(duì)將數(shù)據(jù)插入表中的用戶會(huì)話可見(jiàn),并且數(shù)據(jù)可能在事務(wù)或用戶會(huì)話期間持續(xù)存在。 -
sql語(yǔ)句的靈活性
??MySQL對(duì)sql語(yǔ)句有很多非常實(shí)用而方便的擴(kuò)展,比如limit功能(分頁(yè))、insert可以一次插入多行數(shù)據(jù);Oracle在這方面感覺(jué)更加穩(wěn)重傳統(tǒng)一些,Oracle的分頁(yè)是通過(guò)偽列和子查詢完成的,插入數(shù)據(jù)只能一行行的插入數(shù)據(jù)。 -
對(duì)于事務(wù)的支持
??Mysql對(duì)于事務(wù)默認(rèn)是不支持的,只是有某些存儲(chǔ)引擎中如:innodb可以支持;而Oracle對(duì)于事物是完全支持的。
??適合Oracle的場(chǎng)景:
??對(duì)數(shù)據(jù)庫(kù)有高級(jí)需求:如果企業(yè)對(duì)數(shù)據(jù)庫(kù)的高級(jí)需求較高,如存儲(chǔ)復(fù)雜數(shù)據(jù)及其方法,要求高可用性、災(zāi)備恢復(fù)、安全性等,可以考慮用Oracle。
??大型企業(yè)應(yīng)用:Oracle在處理大規(guī)模、復(fù)雜的企業(yè)級(jí)應(yīng)用方面表現(xiàn)出色。它能夠處理海量的數(shù)據(jù)和高并發(fā)的訪問(wèn)請(qǐng)求,同時(shí)支持復(fù)雜的數(shù)據(jù)模型和關(guān)系。
??項(xiàng)目并發(fā)量高:使用Oracle,它是是OLTP(聯(lián)機(jī)事務(wù)處理)最好的工具。
??安全性要求高:Oracle使用了許多安全功能,如用戶名,密碼,配置文件,本地身份驗(yàn)證,外部身份驗(yàn)證,高級(jí)安全增強(qiáng)功能等。像金融、銀行等對(duì)安全性要求高的項(xiàng)目一般都選用Oracle作為數(shù)據(jù)庫(kù)。
??高可用性和容災(zāi)需求:Oracle提供了強(qiáng)大的高可用性和容災(zāi)解決方案,例如集群配置、數(shù)據(jù)復(fù)制和自動(dòng)故障轉(zhuǎn)移等,能夠確保系統(tǒng)的連續(xù)性和數(shù)據(jù)的可靠性。MySQL付費(fèi)版也支持,但可靠性不如Oracle。
1.2 使用區(qū)別
-
1、大小寫是否敏感
??Oracle:雙引號(hào)下大小寫敏感,大小寫不敏感的前提條件是在沒(méi)有使用雙引號(hào) “” 的前提下(表名、字段名)。
??Oracle創(chuàng)建表默認(rèn)大寫,可以設(shè)置為小寫。
// 如果創(chuàng)建表的時(shí)候是這樣寫的,那么就必須嚴(yán)格區(qū)分大小寫
CREATE TABLE "TableName"("id" number);
// 不僅要區(qū)分大小寫而且要加雙引號(hào),以便和上面的第三種查詢方式區(qū)分開(kāi)
SELECT * FROM "TableName";
?? MySQL創(chuàng)建的表名默認(rèn)小寫。
-
2、常用字段類型
??Oracle常用字段類型:
??數(shù)值:number。
??字符串:CHAR,NCHAR,VARCHAR2和NVARCHAR2。
???char:使用數(shù)據(jù)庫(kù)字符集來(lái)存儲(chǔ)數(shù)據(jù),長(zhǎng)度固定,如果存儲(chǔ)的數(shù)據(jù)沒(méi)有達(dá)到指定長(zhǎng)度,自動(dòng)補(bǔ)足空格。
???nchar:使用國(guó)家字符集來(lái)存儲(chǔ)數(shù)據(jù),長(zhǎng)度固定,如果存儲(chǔ)的數(shù)據(jù)沒(méi)有達(dá)到指定長(zhǎng)度,數(shù)據(jù)庫(kù)自動(dòng)補(bǔ)足空格。
???varchar2: 使用數(shù)據(jù)庫(kù)字符集存儲(chǔ)數(shù)據(jù),長(zhǎng)度可變,如果存儲(chǔ)數(shù)據(jù)沒(méi)有達(dá)到指定長(zhǎng)度,不自動(dòng)補(bǔ)足空格。
???nvarchar2:使用國(guó)家字符集來(lái)存儲(chǔ)數(shù)據(jù),長(zhǎng)度可變,如果存儲(chǔ)的數(shù)據(jù)沒(méi)有達(dá)到指定長(zhǎng)度,不自動(dòng)補(bǔ)足空格。
??日期:date、timestamp。
??oracle的varchar,一般不使用,那個(gè)是sql標(biāo)準(zhǔn)的類型,允許空串,oracle自己開(kāi)發(fā)了個(gè)類型叫varchar2,不允許存空串,而且可以兼容以后的oracle版本。
??MySQL常用字段類型:
??數(shù)值:tinyint、smallint、mediumint、int、bigint、decimal。
??字符串:char、varchar。
??日期:date、time、datetime、timestamp。
-
3、時(shí)間日期
??Oracle對(duì)于計(jì)算前7天,時(shí)間減7就行了;計(jì)算前1個(gè)小時(shí),時(shí)間減1/24就行了,加法同理:
select TO_DATE('2021-05-30 15:51:20', 'yyyy-mm-dd hh24:mi:ss') -7 from dual;
-- 計(jì)算前7天,結(jié)果:2021-05-23 15:51:20
select TO_DATE('2021-05-30 15:51:20', 'yyyy-mm-dd hh24:mi:ss') - 1/24 from dual;
-- 計(jì)算前1個(gè)小時(shí),結(jié)果:2021-05-30 14:51:20
??MySQL計(jì)算前7天,或者前1個(gè)小時(shí),需要用不同的關(guān)鍵字:
select date_sub('2021-05-30 21:00:40' ,interval 7 day)
-- 計(jì)算前7天,結(jié)果:2021-05-23 21:00:40
select date_sub('2021-05-30 21:00:40' ,interval 1 hour)
-- 計(jì)算前1個(gè)小時(shí),結(jié)果:2021-05-30 20:00:40
??Oracle中timestamp類型的字段,相減,結(jié)果是多少天、多少小時(shí),多少分鐘,多少秒:
SELECT MIN_T, MAX_T, MAX_T - MIN_T
FROM "T_TIMESTAMP"
-- 結(jié)果:2021-07-06 20:29:20.000000 2021-07-07 20:29:22.000000 +000000001 00:00:02.000000
??MySQL中,2個(gè)timestamp類型的值相減,如果想要知道相差多少天、多少秒,需要借助函數(shù):
SELECT min_t, max_t, TIMESTAMPDIFF(second,min_t,max_t) FROM `t_timestamp`
-- 結(jié)果:
2021-07-03 21:01:22 2021-07-04 21:01:22 86400
2021-07-04 21:02:01 2021-07-04 21:02:06 5
2021-07-04 21:03:58 2021-07-04 21:04:01 3
??Oracle使用to_date()函數(shù),將字符串轉(zhuǎn)時(shí)間:
select TO_DATE('2021-05-30 15:51:20', 'yyyy-mm-dd hh24:mi:ss') from dual;
-- 24小時(shí)制的轉(zhuǎn)換,結(jié)果:2021-05-30 15:51:20
select TO_DATE('2021-05-30 下午 11:51:20', 'yyyy-mm-dd am hh12:mi:ss') from dual;
-- 12小時(shí)制的轉(zhuǎn)換,結(jié)果:2021-05-30 23:51:20
??MySQL的字符串轉(zhuǎn)時(shí)間,使用str_to_date()函數(shù):
select STR_TO_DATE('2021-05-30 15:51:20','%Y-%m-%d %H:%i:%s');
-- 結(jié)果:2021-05-30 15:51:20
-- tip: myql的這個(gè)格式,也不難記,Y、m、d、H、i、s
??Oracle使用to_char()函數(shù),將時(shí)間轉(zhuǎn)字符串:
select to_char(current_date, 'yyyy-mm-dd hh24:mi:ss') from dual;
-- 24小時(shí)制的轉(zhuǎn)換,結(jié)果:2021-05-30 16:06:52
select to_char( TO_DATE('2021-05-30 15:51:20', 'yyyy-mm-dd hh24:mi:ss'), 'yyyy-mm-dd am hh12:mi:ss') from dual;
-- 12小時(shí)制的轉(zhuǎn)換,結(jié)果:2021-05-30 下午 03:51:20
??MySQL使用date_format()函數(shù):
select DATE_FORMAT(current_timestamp,'%Y-%m-%d %H:%i:%s');
-- 結(jié)果:2021-05-30 16:10:14
??Oracle查詢當(dāng)前的日期+時(shí)間示例:
select CURRENT_TIMESTAMP from dual;
-- 結(jié)果:2021-05-30 16:19:10.640466 +08:00
select current_date from dual;
-- 結(jié)果:2021-05-30 16:16:54
select SYSDATE from dual;
-- 結(jié)果:2021-06-07 20:54:57
??MySQL查詢當(dāng)前的日期+時(shí)間示例:
select CURRENT_TIMESTAMP;
-- 結(jié)果:2021-05-30 16:21:16
select now();
-- 結(jié)果:2021-05-30 16:17:41
-- 我一般用這個(gè),比較簡(jiǎn)單,好記憶
select sysdate()
-- 結(jié)果:2021-06-07 20:55:38
- 4、建表和插入數(shù)據(jù)
-- Oracle
create table t_student(
sid int primary key ,
sname varchar2(10) not null ,
enterdate date,
gender char(2),
mail unique,
age number check (age>19 and age<30)
)
insert into t_student values(stuseq.nextval,'Test',to_date('1990-3-4','YYYY-MM-DD'),'男','1@outlook.com',20);
commit;
--MySQL
create table t_student(
sid int primary key auto_increment,
sname varchar(1) not null ,
enterdate date,
gender char(1),
age int,
mail varchar(10) UNIQUE
)
insert into t_student values(null,'Test','1990-3-4','男',30,'2@outlook.com')
-
5、事務(wù)
??Oracle:完全支持事務(wù),默認(rèn)不自動(dòng)提交,需要用戶手動(dòng)提交,提交可以通過(guò)以下幾個(gè)命令實(shí)現(xiàn):
??BEGIN:事務(wù)塊開(kāi)始的標(biāo)志。事務(wù)塊里的SQL語(yǔ)句要么全部執(zhí)行成功,要么全部失敗回滾。
??COMMIT:提交事務(wù)。執(zhí)行成功時(shí),事務(wù)將被提交,并且對(duì)數(shù)據(jù)庫(kù)的修改是可見(jiàn)的。
??ROLLBACK:用于取消尚未提交的事務(wù),并將數(shù)據(jù)庫(kù)恢復(fù)到事務(wù)開(kāi)始之前的狀態(tài)。當(dāng)ROLLBACK語(yǔ)句執(zhí)行成功時(shí),事務(wù)中的所有修改都將被撤銷。
??SAVEPOINT:用于在事務(wù)中創(chuàng)建一個(gè)保存點(diǎn),以便在事務(wù)執(zhí)行過(guò)程中可以回滾到該保存點(diǎn)。它可以在事務(wù)中設(shè)置一個(gè)中間點(diǎn),以便在需要時(shí)回滾到該點(diǎn)。
??SET TRANSACTION:SET TRANSACTION用于設(shè)置事務(wù)的屬性。通過(guò)該命令,可以設(shè)置事務(wù)的隔離級(jí)別、讀寫權(quán)限等屬性。
??示例:
BEGIN
SAVEPOINT sp;
-- 向?qū)W生表插入數(shù)據(jù)
INSERT INTO student_table (student_name, student_age) VALUES ('John', 18);
INSERT INTO student_table (student_name, student_age) VALUES ('Emma', 19);
-- 向班級(jí)表插入數(shù)據(jù)
INSERT INTO class_table (class_name, class_size) VALUES ('Class A', 30);
INSERT INTO class_table (class_name, class_size) VALUES ('Class B', 28);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO sp;
RAISE;
END;
??MySQL:僅innoDB支持事務(wù),默認(rèn)自動(dòng)提交。
-- 關(guān)閉事務(wù)提交
set AutoCommit = 0;
-- 手動(dòng)提交事務(wù)
START TRANSACTION; -- 開(kāi)始事務(wù)
INSERT INTO student (name,age) VALUES ('Tom',18); -- 執(zhí)行一些數(shù)據(jù)操作
INSERT INTO score (student_id,score) VALUES (1,90);
COMMIT; -- 手動(dòng)提交事務(wù)
-
6、分頁(yè)
??Oracle:需要用rownum和子查詢來(lái)做。示例:
-- 查第10-20條記錄。10、20個(gè)數(shù)字表示記錄的行號(hào)
select * from (
SELECT emp.*, rownum as rowno from emp
)t_target
where rowno >= 10 and rowno < 20
??MySQL:通過(guò)limit關(guān)鍵字分頁(yè)。示例:
-- 查第10-20條記錄。第一個(gè)10表示起始下標(biāo),第二個(gè)10表示取多少條記錄
SELECT * FROM `tb_user`
limit 10, 10
-
7、id遞增的處理
??Oracle需要通過(guò)手動(dòng)新建1個(gè)序列+觸發(fā)器來(lái)實(shí)現(xiàn):
-- 第一步:創(chuàng)建序列(ps: 也可以通過(guò)navicat創(chuàng)建)
create sequence SEQ_T_LOCALOBTMIND
-- 驗(yàn)證序列是否能成功取到值
select SEQ_T_LOCALOBTMIND.nextval from dual
-- 第二步:設(shè)置觸發(fā)器(ps: 請(qǐng)確保表名、字段都是大寫的,否則觸發(fā)器執(zhí)行會(huì)失?。?/span>
create or replace trigger T_LOCALOBTMIND_INSERT_ID
before insert on "T_LOCALOBTMIND" for each row
begin
select SEQ_T_LOCALOBTMIND.nextval into:NEW.ID from dual;
end;
-- 第三步:測(cè)試
INSERT INTO "T_LOCALOBTMIND"("DDATETIME", "OBTID", "WDIDF") VALUES (TO_DATE('2021-06-03 08:22:04', 'SYYYY-MM-DD HH24:MI:SS'), 'G1121', '11.34');
??MySQL則自帶自動(dòng)自增的功能。
-
7、字符處理
??Oracle的字符串只能用單引號(hào)包裹。
select concat('%', 'G1120') from dual
-- 結(jié)果:%G1120
??MySQL的字符串可以用單引號(hào),也可以用雙引號(hào)包裹。
select concat("%", 'G1120')
-- 結(jié)果:%G1120
??oracle中不允許有空字符串的存在,如果update某個(gè)字段為’',則會(huì)發(fā)現(xiàn)這個(gè)字段值變成null了。mysql中允許空字符串。
-
8、多條件判斷
??Oracle慣用decode()函數(shù),另外支持case when的用法:
-- decode()函數(shù)
select DECODE(2,
1, '風(fēng)速',
2, '雨量',
3, '浪高',
null)
from dual;
-- 結(jié)果:
-- 雨量
-- case when的寫法1:公式匹配
select sal, CASE
when sal >= 5000 then '高薪'
when sal >= 2000 then '中薪'
WHEN sal > 800 THEN '低薪'
ELSE '其它'
END as cn
from emp;
-- 結(jié)果:800 其它
-- 1600 低薪
-- 1250 低薪
-- 2975 中薪
-- case when的寫法2:值匹配
select sal, CASE sal
when 5000 then '高薪'
when 1600 then '中薪'
WHEN 800 THEN '低薪'
ELSE '其它'
END as cn
from emp;
-- 結(jié)果:
-- 800 低薪
-- 1600 中薪
-- 1250 其它
-- 2975 其它
??MySQL,一般也用case when。
-
9、小數(shù)格式化
??Oracle使用to_char()函數(shù):
select to_char(211.125456,'99999999999990.99') from dual;
-- 需要四舍五入的情況,結(jié)果:211.13
select to_char(211.1,'99999999999990.99') from dual;
-- 小數(shù)位不夠2位的情況,結(jié)果:211.10
select to_char(0,'99999999999990.99') from dual;
-- 特殊值0的情況,結(jié)果:0.00
??MySQL使用format()函數(shù):
select FORMAT(211.125,2);
-- 需要四舍五入的情況,結(jié)果:211.13
select FORMAT(211.1,2);
-- 小數(shù)位不夠2位的情況,結(jié)果:211.10
select FORMAT(0,2);
-- 特殊值0的情況,結(jié)果:0.00
-
10、查詢語(yǔ)句
??Oracle的查詢必須帶from:
select current_date from dual;
-- 結(jié)果:2021-05-30 16:16:54
??MySQL的查詢,就沒(méi)強(qiáng)制要求帶from關(guān)鍵字,但是查詢dual表也支持:
select now();
-- 結(jié)果:2021-05-30 16:17:41
二、MySQL和PostgreSQL
??PostgreSQL是一個(gè)企業(yè)級(jí)的關(guān)系數(shù)據(jù)庫(kù),允許關(guān)系和非關(guān)系查詢,支持:Java、.net、Go、C、C++等。PostgreSQL通常用作網(wǎng)站、地理空間和分析應(yīng)用程序的主要數(shù)據(jù)存儲(chǔ)或倉(cāng)庫(kù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-824074.html
2.1 基本差別*
-
PostgreSQL的優(yōu)勢(shì)
??1、功能強(qiáng)大。PostgreSQL對(duì)正則表達(dá)式的支持強(qiáng),內(nèi)置函數(shù)也豐富。
??2、性能優(yōu)化工具與度量信息豐富。PostgreSQL數(shù)據(jù)庫(kù)中有大量的性能視圖,可以方便地定位問(wèn)題。此外,PostgreSQL還設(shè)計(jì)了專門架構(gòu)和進(jìn)程用于收集性能數(shù)據(jù)視圖,比如可以看打卡正在執(zhí)行的SQL、哪條記錄被鎖定等。
??3、在線操作功能好。PostgreSQL增加空值列時(shí),本質(zhì)上只是在系統(tǒng)表上把列定義上,無(wú)須對(duì)物理結(jié)構(gòu)做更新。PostgreSQL還支持在線建索引的功能,在創(chuàng)建索引的過(guò)程中,可以不鎖更新操作。
??4、支持?jǐn)?shù)據(jù)倉(cāng)庫(kù)。MySQL對(duì)SQL語(yǔ)法支持的功能較弱,基本上不適合做數(shù)據(jù)倉(cāng)庫(kù)。PostgreSQL不僅支持復(fù)雜的SQL,還有大量的分析函數(shù),非常適合做數(shù)據(jù)倉(cāng)庫(kù)。
??5、移動(dòng)互聯(lián)網(wǎng)特征。PostgreSQL中還有一些支持移動(dòng)互聯(lián)網(wǎng)的新功能,比如:空間索引。
??綜上,PostgreSQL是一個(gè)功能強(qiáng)大、又帶有移動(dòng)互聯(lián)網(wǎng)的開(kāi)源數(shù)據(jù)庫(kù)。 -
MySQL的優(yōu)勢(shì)
??1、MySQL的事務(wù)回滾機(jī)制較好。InnoDB的基于回滾實(shí)現(xiàn)的MVCC機(jī)制,相對(duì)于PG新老數(shù)據(jù)一起存放的基于XID的MVCC機(jī)制,是占優(yōu)的。
??2、MySQL采用索引組織表。這種存儲(chǔ)方式非常適用于主鍵匹配的查詢、刪改操作,但是對(duì)表結(jié)構(gòu)設(shè)計(jì)存在約束。
??3、MySQL的優(yōu)化器比較簡(jiǎn)單。系統(tǒng)表、運(yùn)算符、數(shù)據(jù)類型的實(shí)現(xiàn)都很精簡(jiǎn),非常適合簡(jiǎn)單的查詢操作。
??4、MySQL分區(qū)表的實(shí)現(xiàn)要優(yōu)于PG。
??5、MySQL的存儲(chǔ)引擎插件化機(jī)制。使得它的應(yīng)用場(chǎng)景更加廣泛,比如除了InnoDB適合事務(wù)處理場(chǎng)景外,MyIsam適合靜態(tài)數(shù)據(jù)的查詢場(chǎng)景。 -
兩者的選擇
??如果僅僅是想把數(shù)據(jù)庫(kù)作為一個(gè)簡(jiǎn)單的存儲(chǔ)軟件,比如一些大型互聯(lián)網(wǎng)公司就是這樣,一些比較復(fù)雜的功能都放在應(yīng)用中,那么MySQL是合適的。
??如果應(yīng)用的數(shù)據(jù)訪問(wèn)很簡(jiǎn)單,比如大多數(shù)的博客系統(tǒng),那么后端使用MySQL也是合適的。
??如果應(yīng)用不像博客系統(tǒng)那么簡(jiǎn)單,又不像耗費(fèi)太多的開(kāi)發(fā)資源,那么使用PostgreSQL是合適的。
2.2 使用差別
-
1、格式區(qū)別
??和Oracle一樣,PostgreSQL也是嚴(yán)格區(qū)分大小寫。 -
2、自增區(qū)別
??MySQL中使用auto_increment ,在需要的列指定自增;而PostgreSQL中需要設(shè)置自增序列。
??PostgreSQL的自增序列設(shè)置:
-- 創(chuàng)建表時(shí)
CREATE table infisa_template_config(id serial );
-- 表已存在
<--設(shè)置序列從1開(kāi)始,自增1-->
CREATE SEQUENCE user_id_seq START WITH 1
INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
<--設(shè)置序列-->
ALTER table user ALTER column id SET DEFAULT nextval('user_id_seq');
-
3、時(shí)間轉(zhuǎn)化
??時(shí)間轉(zhuǎn)字符串:
-- MySQL
date_format(a.tag_create_date,'%Y-%m-%d %H:%i:%s')
-- PostgreSQL
to_char(a.tag_create_date,'yyyy-mm-dd HH:MM:SS')
??字符串轉(zhuǎn)時(shí)間:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-824074.html
-- MySQL
STR_TO_DATE('2021-05-30 15:51:20','%Y-%m-%d %H:%i:%s')
-- PostgreSQL
to_date(a.tag_create_date,'yyyy-mm-dd HH:MM:SS')
- 4、字段為null時(shí)返回指定值
-- MySQL
IFNULL(a.idm,'')
-- PostgreSQL
COALESCE(a.id,'')
- 5、獲取當(dāng)前日期
-- MySQL
SELECT sysdate()
-- PostgreSQL
SELECT now()
- 6、limit
-- MySQL
select id,name from hospital.ods_user_basic limit 10,2;
-- PostgreSQL
select id,name from hospital.ods_user_basic limit 10 offset 2;
到了這里,關(guān)于MySQL(七)MySQL和Oracle、PostgreSQL的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!