MySQL与SQLServer的不同之处

目录

一、环境
二、存储引擎
三、语法

和SQL server语法主要不同的地方
  1.1 大小写敏感性
  1.2 注释符
  1.3 自增列
  1.4 查看表的属性
  1.5 修改表名
  1.6 删除表
  1.7 修改字段属性
  1.8 添加、删除字段和约束
  1.9 创建表模板
数据类型
数据类型属性
  3.1 unsigned
  3.2 zerofill
操作符
  4.1 安全等于运算符(<=>)
  4.2 正则表达式运算符(regexp或者rlike)
  4.3 连接操作符
  4.4 异或运算符XOR
  4.5 MySQL中的转义

一、环境

SQL Server最适合.net,而MySQL可以与几乎所有其他语言相匹配,尤其是PHP。还应该提到,SQL Server过去只在Windows上运行,但自从微软宣布Linux支持SQL Server以来,情况发生了变化。不过,Linux版本还不够成熟,这意味着如果使用SQL Server,我们建议您继续在Windows上工作,如果使用MySQL,则切换到Linux。
二、存储引擎

MySQL和SQL Server之间另一个经常被忽略的大区别是它们存储数据的方式,SQL Server使用微软开发的单一存储引擎,而MySQL提供的是多个引擎。这为MySQL开发人员提供了更大的灵活性,因为他们可以根据速度、可靠性或其他维度为不同的表使用不同的引擎。一个流行的MySQL存储引擎是InnoDB,它属于比较慢的一种,但是保持了可靠性,另一个是MyISAM。


二、语法

虽然MySQL和SQL Server都基于SQL,但语法上的差异仍然很突出,值得注意。

1. 和SQL Server语法主要不同的地方

1.1 大小写敏感性

MySQL和SQL Server一样,对大小写不敏感。但不同的是,在MySQL中对部分对象的引用是大小写敏感的,如数据库名、表名,但对字段、索引、函数、存储过程等的引用不敏感。

扫描二维码关注公众号,回复: 9781958 查看本文章

1.2 注释符

在MySQL中支持三种注释方法:以下都可以是行内注释。

使用#作为开头,后面的全是注释。

使用–作为注释开头,但要注意,MySQL中这种注释方法和SQLServer等其他标准数据库注释语法稍有不同,MySQL要求第二个短线后面必须跟一个空白字符,如空格、制表符等。

使用/**/注释符。

1.3 自增列

MySQL中设置自增列(auto_increment)的列必须是有索引的列,且创建表时要显式指定的种子值需要在建表语句之后。另外MySQL一张表只能有一个自增列。而SQL Server中可以有多个自增列。且MySQL中向自增列插入数据时必须使用null来表示插入的是自增列,除非显式指定插入列表中不包含自增列,而SQL Server向自增列插入数据时可以且必须无视该列,除非设置显示插入模式。

-- SQL Server直接使用identity,但必须有非自增列之外的列才能插入,除非显式开启手动插入自增列
create table emp1(id int not null identity(1,2),name CHAR(20));
insert into emp1 VALUES('malongshuai');
insert into emp1 values('gaoxiaofang');
select * from emp1;

-- MySQL中自增列必须为索引列,并且只能设置种子值而不能直接设置步长
create table emp1(id int not null primary key AUTO_INCREMENT);
create table emp2(id int not null primary key AUTO_INCREMENT) auto_increment=100;
insert into emp1 values(null);
insert into emp2 values(null);

1.4 查看表的属性

-- SQL Server使用存储过程sp_help
exec sp_help emp;

-- MySQL使用desc描述或者使用show
mysql> desc emp1;

1.5 修改表名

-- SQL Server使用存储过程sp_rename
EXEC sp_rename emp,emp2 [object]

-- mysql使用alter语句中的rename功能
alter table emp rename [to] emp3;

1.6 删除表

-- SQL Server删除表,每次只能删除一张表
if object_id('table_name') is not null drop table table_name;
if exists(select object_id('table_name')) drop table table_name;

-- MySQL可以直接判断,且一次可以删除多表
drop table if exists table_name1,table_name2...

1.7 修改字段属性

-- SQL Server只能修改字段属性(数据类型、空性),不能修改约束类属性,
-- 约束类属性需要使用"alter table … add constraint"

alter table emp2 alter column id int not null;
alter table emp2 add gender char(2);
alter table emp2 add CONSTRAINT def_key DEFAULT('') FOR gender;
alter table emp2 add constraint pk_key primary key clustered(id);

-- mysql修改字段属性有几种方法
alter table table_name 
| ALTER [COLUMN] col_name {SET DEFAULT string | DROP DEFAULT}
| CHANGE [COLUMN] old_col_name new_col_name column_definition
[FIRST|AFTER col_name]
| MODIFY [COLUMN] col_name column_definition
[FIRST | AFTER col_name]

 也就是说,change和modify都可以修改列的定义,包括约束类的属性、字段的位置,且change比modify更多一个重命名列的功能。而alter column则只能设置默认值和删除默认值。注意,重命名和修改字段时,需要重新定义字段属性。

1.8 添加、删除字段和约束

-- MySQL中添加、删除字段和约束的语法

-- 添加字段
| ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name ]
| ADD [COLUMN] (col_name column_definition,...) -- 可以一次性添加多个字段

-- 删除字段
| DROP [COLUMN] col_name

-- 添加约束
| ADD [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (index_col_name,...) [index_option] ...
| ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...)
reference_definition
| ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name]
[index_type] (index_col_name,...) [index_option] ...

-- 删除约束
| DROP PRIMARY KEY
| DROP FOREIGN KEY fk_symbol
| DROP {INDEX|KEY} index_name
| DISABLE KEYS
| ENABLE KEYS

-- 添加和删除默认值约束
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}

1.9 创建表模板

-- SQL Server
select * into table_name1 from table_name2; /*复制表结构和数据*/
select * into table_name1 from table_name2 where 1=0; /*只复制表结构*/
-- MySQL
create table table_name1 like table_name2; /*只复制表结构*/
create tbale table_name1 as select * from table_name2; /*复制表结构和数据*/

 MySQL中复制表结构时不会复制主键、索引、自增列等任何属性,仅仅只是简单的建立一张表然后插入数据。但SQL Server复制表结构时会复制自增列属性。

2. 数据类型

3. 数据类型属性

3.1 unsigned
unsigned属性就是让数值类型的数据变得无符号化。使用unsigned属性将会改变数值数据类型的范围,例如tinyint类型带符号的范围是-128到127,而使用unsigned时范围将变成0到255。同时unsigned也会限制该列不能插入负数值。

create table t(a int unsigned,b int unsigned);
insert into t select 1,2;
insert into t select -1,-2;

--上面的语句中,在执行第二条语句准备插入负数时将会报错,提示超出范围。

3.2 zerofill
zerofill修饰字段后,不足字段显示部分将使用0来代替空格填充,启用zerofill后将自动设置unsigned。

mysql> create table t1(id int(4) zerofill);
mysql> select * from t1;
+-------+
| id |
+-------+
| 0001 |
| 0002 |
| 0011 |
| 83838 |
+-------+
4 rows in set (0.00 sec)

 zerofill只是修饰显示结果,不会改变存储的数据值。

4. 操作符

4.1 安全等于运算符(<=>)
这个符号和"=“进行相同的运算,但是它多出的一个功能是可以和NULL进行比较。
当比较的两边都是NULL时返回1而不是NULL,只有一边是null时返回0而不是null,其余的时候和”="的结果一样。

mysql> SELECT 1<=>NULL UNION ALL SELECT NULL<=>NULL UNION ALL SELECT 1=0 UNION ALL SELECT 1<=>0;
+----------+
| 1<=>NULL |
+----------+
| 0 |
| 1 |
| 0 |
| 0 |
+----------+
4 rows in set

4.2 正则表达式运算符(regexp或者rlike)

在SQL Server中没有正则表达式运算符,而MySQL中有。格式:expression regexp reg_pattern
若expression满足reg_pattern,则返回1,无法匹配成功则返回0。若expression或reg_pattern任意一方为null,则返回null。
MySQL实现的是扩展正则表达式。

mysql> SELECT 'basskd' REGEXP '^b','basskd' REGEXP 's.k','basskd' REGEXP NULL,NULL REGEXP '^b';
+----------------------+-----------------------+----------------------+------------------+
| 'basskd' REGEXP '^b' | 'basskd' REGEXP 's.k' | 'basskd' REGEXP NULL | NULL REGEXP '^b' |
+----------------------+-----------------------+----------------------+------------------+
| 1 | 1 | NULL | NULL |
+----------------------+-----------------------+----------------------+------------------+
1 row in set

4.3 连接操作符
在MySQL中,"+"不算是一种连接操作符。但是它的表达式是另有意义的:它会将两边的表达式尝试转换为数值型进行数值相加运算,如果转换失败的则表示为0。

mysql> select '12'+'34',12+'34','abc'+12,'a'+'abc';
+-----------+---------+----------+-----------+
| '12'+'34' | 12+'34' | 'abc'+12 | 'a'+'abc' |
+-----------+---------+----------+-----------+
| 46 | 46 | 12 | 0 |
+-----------+---------+----------+-----------+
1 row in set

 要真正实现字符串连接,需要使用函数concat。

4.4 异或运算符XOR
异或运算符是用于比较两边值是否相同的。相同则返回0,不同则返回1,如果存在null,则直接返回null。

mysql> select 1 xor 1,0 xor 0,1 xor 0,1 xor null,null xor null;
+---------+---------+---------+------------+---------------+
| 1 xor 1 | 0 xor 0 | 1 xor 0 | 1 xor null | null xor null |
+---------+---------+---------+------------+---------------+
| 0 | 0 | 1 | NULL | NULL |
+---------+---------+---------+------------+---------------+
1 row in set

XOR运算符可以连接多次,顺序是从前向后依次进行运算。

mysql> select 1 xor 1 xor 0,1 xor 1 xor 1;
+---------------+---------------+
| 1 xor 1 xor 0 | 1 xor 1 xor 1 |
+---------------+---------------+
| 0 | 1 |
+---------------+---------------+
1 row in set

4.5 MySQL中的转义
在MySQL中某些符号需要使用反斜杠"“来转义。包括单引号(’)、双引号(”)、反斜线()。
另外,如果对象名使用了关键字或特殊符号,也需要进行转义,如列名使用了int关键字,表名使用了char关键字等。但是此时的转义符号不是反斜线,而是反引号``或引号。

而在SQL Server中则不需要转义,有歧义的时候只需使用引号即可。

mysql> INSERT INTO test7 VALUES('\\'),('\\\\'),('\'');
mysql> select * from test7;
+-----+
| col |
+-----+
| \ |
| \\ |
| ' |
+-----+
3 rows in set

对于对象名的转义,参考show create table table_name的结果即可看到,处处使用了反引号防止歧义。例如:

mysql> show create table test7;
+-------+----------------------------------------------------------------------------+
| Table | Create Table |
+-------+----------------------------------------------------------------------------+
| test7 | CREATE TABLE `test7` (
`col` char(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+----------------------------------------------------------------------------+
1 row in set

猜你喜欢

转载自www.cnblogs.com/lushichao/p/12467537.html
今日推荐