对象关系数据库管理系统:基于对象模型,存储数据及其方法,数据存储在对象中。拥有对象类、对象标识、多态、封装和继承等特性。用于存储复杂的数据。
关系数据库管理系统:基于关系模型, 只存储数据,数据存储在实体里面,以包含特定信息的表格的形式存在。用于处理比较简单的数据。
适合Oracle的场景:
对数据库有高级需求:如果企业对数据库的高级需求较高,如存储复杂数据及其方法,要求高可用性、灾备恢复、安全性等,可以考虑用Oracle。
大型企业应用:Oracle在处理大规模、复杂的企业级应用方面表现出色。它能够处理海量的数据和高并发的访问请求,同时支持复杂的数据模型和关系。
项目并发量高:使用Oracle,它是是OLTP(联机事务处理)最好的工具。
安全性要求高:Oracle使用了许多安全功能,如用户名,密码,配置文件,本地身份验证,外部身份验证,高级安全增强功能等。像金融、银行等对安全性要求高的项目一般都选用Oracle作为数据库。
高可用性和容灾需求:Oracle提供了强大的高可用性和容灾解决方案,例如集群配置、数据复制和自动故障转移等,能够确保系统的连续性和数据的可靠性。MySQL付费版也支持,但可靠性不如Oracle。
// 如果创建表的时候是这样写的,那么就必须严格区分大小写
CREATE TABLE "TableName"("id" number);
// 不仅要区分大小写而且要加双引号,以便和上面的第三种查询方式区分开
SELECT * FROM "TableName";
MySQL:大小写不敏感,创建的表名默认小写。
数值:number。
字符串:CHAR,NCHAR,VARCHAR2和NVARCHAR2。
char:使用数据库字符集来存储数据,长度固定,如果存储的数据没有达到指定长度,自动补足空格。
nchar:使用国家字符集来存储数据,长度固定,如果存储的数据没有达到指定长度,数据库自动补足空格。
varchar2: 使用数据库字符集存储数据,长度可变,如果存储数据没有达到指定长度,不自动补足空格。
nvarchar2:使用国家字符集来存储数据,长度可变,如果存储的数据没有达到指定长度,不自动补足空格。
日期:date、timestamp。
oracle的varchar,一般不使用,那个是sql标准的类型,允许空串,oracle自己开发了个类型叫varchar2,不允许存空串,而且可以兼容以后的oracle版本。
MySQL常用字段类型:
数值:tinyint、smallint、mediumint、int、bigint、decimal。
字符串:char、varchar。
日期:date、time、datetime、timestamp。
select TO_DATE('2021-05-30 15:51:20', 'yyyy-mm-dd hh24:mi:ss') -7 from dual;
-- 计算前7天,结果: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;
-- 计算前1个小时,结果:2021-05-30 14:51:20
MySQL计算前7天,或者前1个小时,需要用不同的关键字:
select date_sub('2021-05-30 21:00:40' ,interval 7 day)
-- 计算前7天,结果:2021-05-23 21:00:40
select date_sub('2021-05-30 21:00:40' ,interval 1 hour)
-- 计算前1个小时,结果:2021-05-30 20:00:40
Oracle中timestamp类型的字段,相减,结果是多少天、多少小时,多少分钟,多少秒:
SELECT MIN_T, MAX_T, MAX_T - MIN_T
FROM "T_TIMESTAMP"
-- 结果:2021-07-06 20:29:20.000000 2021-07-07 20:29:22.000000 +000000001 00:00:02.000000
MySQL中,2个timestamp类型的值相减,如果想要知道相差多少天、多少秒,需要借助函数:
SELECT min_t, max_t, TIMESTAMPDIFF(second,min_t,max_t) FROM `t_timestamp`
-- 结果:
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()函数,将字符串转时间:
select TO_DATE('2021-05-30 15:51:20', 'yyyy-mm-dd hh24:mi:ss') from dual;
-- 24小时制的转换,结果: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小时制的转换,结果:2021-05-30 23:51:20
MySQL的字符串转时间,使用str_to_date()函数:
select STR_TO_DATE('2021-05-30 15:51:20','%Y-%m-%d %H:%i:%s');
-- 结果:2021-05-30 15:51:20
-- tip: myql的这个格式,也不难记,Y、m、d、H、i、s
Oracle使用to_char()函数,将时间转字符串:
select to_char(current_date, 'yyyy-mm-dd hh24:mi:ss') from dual;
-- 24小时制的转换,结果: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小时制的转换,结果:2021-05-30 下午 03:51:20
MySQL使用date_format()函数:
select DATE_FORMAT(current_timestamp,'%Y-%m-%d %H:%i:%s');
-- 结果:2021-05-30 16:10:14
Oracle查询当前的日期+时间示例:
select CURRENT_TIMESTAMP from dual;
-- 结果:2021-05-30 16:19:10.640466 +08:00
select current_date from dual;
-- 结果:2021-05-30 16:16:54
select SYSDATE from dual;
-- 结果:2021-06-07 20:54:57
MySQL查询当前的日期+时间示例:
select CURRENT_TIMESTAMP;
-- 结果:2021-05-30 16:21:16
select now();
-- 结果:2021-05-30 16:17:41
-- 我一般用这个,比较简单,好记忆
select sysdate()
-- 结果:2021-06-07 20:55:38
-- 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'),'男','[email protected]',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,'[email protected]')
BEGIN:事务块开始的标志。事务块里的SQL语句要么全部执行成功,要么全部失败回滚。
COMMIT:提交事务。执行成功时,事务将被提交,并且对数据库的修改是可见的。
ROLLBACK:用于取消尚未提交的事务,并将数据库恢复到事务开始之前的状态。当ROLLBACK语句执行成功时,事务中的所有修改都将被撤销。
SAVEPOINT:用于在事务中创建一个保存点,以便在事务执行过程中可以回滚到该保存点。它可以在事务中设置一个中间点,以便在需要时回滚到该点。
SET TRANSACTION:SET TRANSACTION用于设置事务的属性。通过该命令,可以设置事务的隔离级别、读写权限等属性。
示例:
BEGIN
SAVEPOINT sp;
-- 向学生表插入数据
INSERT INTO student_table (student_name, student_age) VALUES ('John', 18);
INSERT INTO student_table (student_name, student_age) VALUES ('Emma', 19);
-- 向班级表插入数据
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支持事务,默认自动提交。
-- 关闭事务提交
set AutoCommit = 0;
-- 手动提交事务
START TRANSACTION; -- 开始事务
INSERT INTO student (name,age) VALUES ('Tom',18); -- 执行一些数据操作
INSERT INTO score (student_id,score) VALUES (1,90);
COMMIT; -- 手动提交事务
-- 查第10-20条记录。10、20个数字表示记录的行号
select * from (
SELECT emp.*, rownum as rowno from emp
)t_target
where rowno >= 10 and rowno < 20
MySQL:通过limit关键字分页。示例:
-- 查第10-20条记录。第一个10表示起始下标,第二个10表示取多少条记录
SELECT * FROM `tb_user`
limit 10, 10
-- 第一步:创建序列(ps: 也可以通过navicat创建)
create sequence SEQ_T_LOCALOBTMIND
-- 验证序列是否能成功取到值
select SEQ_T_LOCALOBTMIND.nextval from dual
-- 第二步:设置触发器(ps: 请确保表名、字段都是大写的,否则触发器执行会失败)
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;
-- 第三步:测试
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则自带自动自增的功能。
select concat('%', 'G1120') from dual
-- 结果:%G1120
MySQL的字符串可以用单引号,也可以用双引号包裹。
select concat("%", 'G1120')
-- 结果:%G1120
oracle中不允许有空字符串的存在,如果update某个字段为’',则会发现这个字段值变成null了。mysql中允许空字符串。
-- decode()函数
select DECODE(2,
1, '风速',
2, '雨量',
3, '浪高',
null)
from dual;
-- 结果:
-- 雨量
-- case when的写法1:公式匹配
select sal, CASE
when sal >= 5000 then '高薪'
when sal >= 2000 then '中薪'
WHEN sal > 800 THEN '低薪'
ELSE '其它'
END as cn
from emp;
-- 结果: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;
-- 结果:
-- 800 低薪
-- 1600 中薪
-- 1250 其它
-- 2975 其它
MySQL,一般也用case when。
select to_char(211.125456,'99999999999990.99') from dual;
-- 需要四舍五入的情况,结果:211.13
select to_char(211.1,'99999999999990.99') from dual;
-- 小数位不够2位的情况,结果:211.10
select to_char(0,'99999999999990.99') from dual;
-- 特殊值0的情况,结果:0.00
MySQL使用format()函数:
select FORMAT(211.125,2);
-- 需要四舍五入的情况,结果:211.13
select FORMAT(211.1,2);
-- 小数位不够2位的情况,结果:211.10
select FORMAT(0,2);
-- 特殊值0的情况,结果:0.00
select current_date from dual;
-- 结果:2021-05-30 16:16:54
MySQL的查询,就没强制要求带from关键字,但是查询dual表也支持:
select now();
-- 结果:2021-05-30 16:17:41
PostgreSQL是一个企业级的关系数据库,允许关系和非关系查询,支持:Java、.net、Go、C、C++等。PostgreSQL通常用作网站、地理空间和分析应用程序的主要数据存储或仓库。
-- 创建表时
CREATE table infisa_template_config(id serial );
-- 表已存在
<--设置序列从1开始,自增1-->
CREATE SEQUENCE user_id_seq START WITH 1
INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
<--设置序列-->
ALTER table user ALTER column id SET DEFAULT nextval('user_id_seq');
-- 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')
字符串转时间:
-- 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')
-- MySQL
IFNULL(a.idm,'')
-- PostgreSQL
COALESCE(a.id,'')
-- MySQL
SELECT sysdate()
-- PostgreSQL
SELECT now()
-- 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;