聊技术 | SQL和SQL之间细微的差异

2023-09-06 13:14:31 浏览数 (1)

22

2023-08

聊技术 | SQL和SQL之间细微的差异

SQL和SQL之间大差不差,但是恰好就是差得这么些小玩意,看起来简单,真的搞起来就让人头秃了~简单聊一下MySQL、PostgreSQL和SQL Server之间差得那么一点点东西。

LEARN MORE

图片由海艺AI绘制

SQL是数分狗怎么都绕不过去的一个坎。每次应届生求职面试辅导的时候我都千叮咛万嘱咐,一定要看看SQL,不为啥,问就是面试必问。不管你用得是哪个数据库,SQL的语法都是大差不差的,不像python之类的,不容易出面试题。

虽然在面试中SQL都是大差不差的,但是在实操中,恰好是差得那一点经常让人头秃,比如我用习惯了mysql,切换到pgsql之后经常在一些细节上写错,再到使用sql server也是一样,属于大错不犯小错不断的情况。

这里总结一些差异:

1.创建表时自增主键的语法差异 MySQL:AUTO_INCREMENT

代码语言:javascript复制
CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    age INT
);

PostgreSQL:SERIAL

代码语言:javascript复制
CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50),
    age INT
);

SQL Server:IDENTITY

代码语言:javascript复制
CREATE TABLE students (
    id INT IDENTITY(1,1) PRIMARY KEY,
    name VARCHAR(50),
    age INT
);

2.字符串连接的语法差异

MySQL:使用CONCAT函数来连接字符串。

代码语言:javascript复制
SELECT 
CONCAT(first_name, ' ', last_name) AS full_name 
FROM students;

PostgreSQL:使用||运算符来连接字符串。

代码语言:javascript复制
SELECT 
first_name || ' ' || last_name AS full_name 
FROM students;

SQL Server:使用 来连接字符串。

代码语言:javascript复制
SELECT 
first_name   ' '   last_name AS full_name 
FROM students;

3.字符串截取

MySQL和SQL Server只支持这种写法:

代码语言:javascript复制
SELECT 
SUBSTRING(name, 1, 3) AS initials 
FROM students;

PostgreSQL除了上面这种写法,还支持这种写法:

代码语言:javascript复制
SELECT name[1:3] AS initials FROM students;

4.分页查询语法

MySQL和PostgreSQL都是使用LIMIT和OFFSET关键字实现分页查询。

代码语言:javascript复制
SELECT * FROM students LIMIT 100 OFFSET 20;

SQL Server不按套路出牌,使用TOP关键字和子查询实现分页查询。

代码语言:javascript复制
SELECT 
TOP 100 * FROM 
(SELECT ROW_NUMBER() OVER (ORDER BY id) AS row_num, 
* FROM students) 
AS temp WHERE row_num > 20;

5.日期格式化写法

MySQL:使用DATE_FORMAT函数进行日期格式化。

代码语言:javascript复制
SELECT 
DATE_FORMAT(created_at, '%Y-%m-%d') AS date 
FROM products;

PostgreSQL:使用TO_CHAR函数进行日期格式化。

代码语言:javascript复制
SELECT 
TO_CHAR(created_at, 'YYYY-MM-DD') AS date 
FROM products;

SQL Server:使用CONVERT函数进行日期格式化。

代码语言:javascript复制
SELECT 
CONVERT(VARCHAR(10), created_at, 120) AS date 
FROM products;

6.布尔类型

MySQL: 使用0或1来表示布尔类型。

代码语言:javascript复制
CREATE TABLE my_table (
  is_active TINYINT(1)
);

PostgreSQL: 使用TRUE或FALSE来表示布尔类型。

代码语言:javascript复制
CREATE TABLE my_table (
  is_active BOOLEAN
)
;

SQL Server: 使用bit来表示布尔类型。

代码语言:javascript复制
CREATE TABLE my_table (
  is_active BIT
);

7.数据引用方式

MySQL使用反引号``

代码语言:javascript复制
select `姓名` from student;

PostgreSQL和SQL Server使用双引号""

代码语言:javascript复制
select "姓名" from student;

8.NULL值处理

MySQL可通过IFNULL函数

代码语言:javascript复制
select ifnull(age,0) from student;

PostgreSQL通过COALESCE函数

代码语言:javascript复制
select COALESCE(age,0) from student;

SQL Server通过ISNULL函数

代码语言:javascript复制
select isnull(age,0) from student;

遇到过&被坑过的问题就这么多,真的是不做对比不知道,一做对比就发现差异点还是很多的。尤其是当用惯了某一种之后切换到另一种,一时半会儿反应不过来的时候,着实有点坑爹。

0 人点赞