mysql、sql server、oracle大比较

MYSQL

  • 多个数据库多个用户形式(最好每个数据库对应一个用户),占用内存小,适用于所有平台,开源免费
  • 客户端和命令窗口,都是由数据库决定内容-> use datebase;
  • 组函数在select语句中可以随意使用
  • 支持自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值
  • 可以用双引号包起字符串
  • 分页语句比较简单,用LIMIT开始位置,记录个数
  • 日期字段分DATE和TIME两种, 找到离当前时间7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)
  • 插入当前时间的几个函数是:NOW()函数以`'YYYY-MM-DD HH:MM:SS'返回当前的日期时间,可以直接存到DATETIME字段中。CURDATE()以'YYYY-MM-DD'的格式返回今天的日期,可以直接存到DATE字段中。CURTIME()以'HH:MM:SS'的格式返回当前的时间,可以直接存到TIME字段中
  • 非空字段允许有空的内容
  • 模糊比较like%'字符串%'
  • 不支持事务操作、子查询 、外键、存储过程和视图等功能

1、生成uuid

SELECT UUID();  //c2cb8f66-351f-11e7-b3ed-00163e0429b6
SELECT REPLACE(UUID(), '-', '');  //将'-'替换掉

在 MySQL 的 UUID() 函数中,前三组数字从时间戳中生成,第四组数字暂时保持时间戳的唯一性, 第五组数字是一个 IEEE 802 节点标点值,保证空间唯一。

使用 UUID() 函数,可以生成时间、空间上都独一无二的值。

据说只要是使用了 UUID,都不可能看到两个重复的 UUID 值。

2、日期格式

DATE - 格式:YYYY-MM-DD

DATETIME - 格式:YYYY-MM-DD HH:MM:SS

TIMESTAMP - 格式:YYYY-MM-DD HH:MM:SS

YEAR - 格式:YYYY 或 YY

3、插入时间

NOW()    以 'YYYY-MM-DD HH:MM:SS' 返回当前的日期时间,可以直接存到DATETIME字段中

CURDATE()  以 'YYYY-MM-DD' 格式返回日期,可以直接存到DATE字段中

CURTIME()   以 'HH:MM:SS' 格式返回当前的时间,可以直接存到TIME字段中

insert into table(time) values(NOW());

4、设置默认时间

//添加UpdateTime 设置 默认时间 CURRENT_TIMESTAMP   设置更新时间为 ON UPDATE CURRENT_TIMESTAM
ALTER TABLE `table_name`
ADD COLUMN `UpdateTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间' ;

5、insert into select

语句1:Insert into Table2(field1,field2,…) select value1,value2,… from Table1 where condition;

语句2:Insert into Table2 select * from Table1;

  • 目标表Table2必须存在,MySQL不会自动创建;
  • 语句1一般用于两个表结构一致的情况,而语句2用于表结构不一致的情况;
  • 语句1中涉及的field1,field2也必须存在;
  • 若Table2有主键且不具备自动增长,则 field1, field2…中必须包括主键。

如何在mysql从多个表中组合字段然后插入到一个新表中,通过一条sql语句实现。具体情形是:有三张表a、b、c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段。

对于这种情况,我们可以使用如下的语句来实现:

INSERT INTO db1_name(field1,field2) SELECT field1,field2 FROM db2_name   

对于多个表,我们可以先将需要查询的字段join起来,然后组成一个视图后再select from就可以了:

INSERT INTO a(field1,field2) SELECT * FROM(SELECT f1,f2 FROM b JOIN c) AS tb

其中f1是表b的字段,f2是表c的字段,通过join查询就将分别来自表b和表c的字段进行了组合,然后再通过select嵌套查询插入到表a中,这样就满足了我们这个场景了,如果需要不止2个表,那么可以多个join的形式来组合字段。需要注意的是嵌套查询部分最后一定要有设置表别名,如下:

SELECT * FROM(SELECT f1,f2 FROM b JOIN c) AS tb

即最后的as tb是必须的(当然tb这个名称可以随意取),即指定一个别名,否则在mysql中会报如下错误:

ERROR 1248 (42000): Every derived TABLE must have its own alias      //即每个派生出来的新表都必须指定别名才可以的。

SQL SERVER

只能在windows上运行

1、主键自增

 create table [表名] 
 ( 
   [自动编号字段] int IDENTITY (1,1) PRIMARY KEY , 
   [字段1] nVarChar(50) default \'默认值\' null , 
   [字段2] ntext null , 
   [字段3] datetime, 
   [字段4] money null , 
   [字段5] int default 0, 
   [字段6] Decimal (12,4) default 0, 
   [字段7] image null 
 )

2、日期格式

DATE - 格式:YYYY-MM-DD

DATETIME - 格式:YYYY-MM-DD HH:MM:SS

SMALLDATETIME - 格式:YYYY-MM-DD HH:MM:SS

TIMESTAMP - 格式:唯一的数字

3、插入时间

getdate():获取系统当前时间,返回值为datetime类型

dateadd(datepart,number,date):计算在一个时间的基础上增加一个时间后的新时间值,number要增加的值,整型,正值返回date之后的时间值,负值返回date之前的时间值

datediff(datepart,startdate,enddate):返回两个时间以指定时间部分来计算的差值。返回整数值

dataname(datepart,date):获取时间不同部分的值,返回值为字符串

datepart(datepart,date):和datename相似,只是返回值为整型,datepart是要返回的时间的部分,常用取值year、month、day、hour、minute。

day(date):获取指定时间的天数

month(date):获取指定时间的月份

year(date):获取指定时间的年份

select getdate() as dte,dateadd(day,-1,getdate()) as nowdat
SELECT DATEPART(month, GETDATE()) AS 'Month Number'
select dateadd(day,-1,getdate())
select datediff(month,'1991-6-12','1992-6-21') as a

3、设置默认时间

CREATE TABLE test(
id NVARCHAR(50),   name nvarchar(50),   CREATETIME DATETIME DEFAULT(GETDATE()),   PRIMARY KEY(id) )

4、系统其他转换函数

isnull(逻辑表达式,代替值):判断逻辑表达式是否为null,是的话就用指定的值代替。

convert()和cast:

CAST 函数和 CONVERT 函数还可用于获取各种特殊数据格式,并可用于选择列表、WHERE

子句以及允许使用表达式的任何位置中。如果希望 Transact-SQL 程序代码符合 SQL-92,

请使用 CAST 而不要使用 CONVERT。如果要利用 CONVERT 中的功能,请使用 CONVERT

而不要使用 CAST。

使用 CAST 或 CONVERT 时,需要提供以下信息:

要转换的表达式;例如,销售报表要求销售数据从货币数据转换为字符数据。

要将指定的表达式转换为的数据类型,例如 varchar 或其他 SQL Server 系统数据类型。

除非将被转换的值存储起来,否则转换仅在 CAST 函数或 CONVERT 函数的作用时间范围内有效。

如果转换时没有指定数据类型的长度,则 SQL Server 自动将 30 作为长度值。

5、INSERT INTO SELECT语句

语句形式为:Insert into Table2(field1,field2,...) select value1,value2,... from Table1 或者:Insert into Table2 select * from Table1

注意:(1)要求目标表Table2必须存在,并且字段field,field2...也必须存在

   (2)注意Table2的主键约束,如果Table2有主键而且不为空,则 field1, field2...中必须包括主键

   (3)注意语法,不要加values,和插入一条数据的sql混了,不要写成:

SELECT INTO FROM语句

语句形式为:SELECT vale1, value2 into Table2 from Table1

要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。

ORACLE

  • 一个数据库中多个用户的形式,占用内存大,价格高,能在所有主流平台上运行(包括 windows)
  • 客户端和命令窗口,都是由用户决定内容-> conn user_name/password
  • 支持大并发,大访问量,是OLTP(On-Line Transaction Processing联机事务处理系统)最好工具
  • 如果查询语句中有组函数,那其他列名必须是组函数处理过的,或者是group by子句中的列否则报错
  • select name,count(money) from user; 不符合要求
  • 不支持自增,需要建立一个自动增长的序列号
  • 只可以用单引号包起字符串
  • 分页时,每个结果集只有一个ROWNUM字段标明它的位置,只能用ROWNUM<**,不能用ROWNUM>**
  • INSERT和UPDATE时最大可操作的字符串长度小于等于4000个单字节,如果要插入更长的字符串,请考虑字段用CLOB类型,方法借用Oracle里自带的DBMS_LOB程序包。插入修改记录前一定要做进行非空和长度判断,不能为空的字段值和超出长度字段值都应该提出警告,返回上次操作。
  • 日期字段只有DATE, 找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7;
  • 当前时间是sysdate
  • 非空字段不容许有空的内容
  • 字段名like%'字符串%'但这种方法不能使用索引,速度不快,用字符串比较函数instr(字段名,'字符串')>0会得到更精确的查找结果
  • 实现了ANSIISQL中大部分功能,如,事务的隔离级别、传播特性等

1、生成uuid

返回类型为RAW、没有- (dash)分隔符、返回的字母大写,可以使用 lower(sys_guid()) 转为小写

select sys_guid() from dual;