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
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
age INT
);
PostgreSQL:SERIAL
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
age INT
);
SQL Server:IDENTITY
CREATE TABLE students (
id INT IDENTITY(1,1) PRIMARY KEY,
name VARCHAR(50),
age INT
);
2.字符串连接的语法差异
MySQL:使用CONCAT函数来连接字符串。
SELECT
CONCAT(first_name, ' ', last_name) AS full_name
FROM students;
PostgreSQL:使用||运算符来连接字符串。
SELECT
first_name || ' ' || last_name AS full_name
FROM students;
SQL Server:使用+来连接字符串。
SELECT
first_name + ' ' + last_name AS full_name
FROM students;
3.字符串截取
MySQL和SQL Server只支持这种写法:
SELECT
SUBSTRING(name, 1, 3) AS initials
FROM students;
PostgreSQL除了上面这种写法,还支持这种写法:
SELECT name[1:3] AS initials FROM students;
4.分页查询语法
MySQL和PostgreSQL都是使用LIMIT和OFFSET关键字实现分页查询。
SELECT * FROM students LIMIT 100 OFFSET 20;
SQL Server不按套路出牌,使用TOP关键字和子查询实现分页查询。
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函数进行日期格式化。
SELECT
DATE_FORMAT(created_at, '%Y-%m-%d') AS date
FROM products;
PostgreSQL:使用TO_CHAR函数进行日期格式化。
SELECT
TO_CHAR(created_at, 'YYYY-MM-DD') AS date
FROM products;
SQL Server:使用CONVERT函数进行日期格式化。
SELECT
CONVERT(VARCHAR(10), created_at, 120) AS date
FROM products;
6.布尔类型
MySQL: 使用0或1来表示布尔类型。
CREATE TABLE my_table (
is_active TINYINT(1)
);
PostgreSQL: 使用TRUE或FALSE来表示布尔类型。
CREATE TABLE my_table (
is_active BOOLEAN
)
;
SQL Server: 使用bit来表示布尔类型。
CREATE TABLE my_table (
is_active BIT
);
7.数据引用方式
MySQL使用反引号``
select `姓名` from student;
PostgreSQL和SQL Server使用双引号""
select "姓名" from student;
8.NULL值处理
MySQL可通过IFNULL函数
select ifnull(age,0) from student;
PostgreSQL通过COALESCE函数
select COALESCE(age,0) from student;
SQL Server通过ISNULL函数
select isnull(age,0) from student;
遇到过&被坑过的问题就这么多,真的是不做对比不知道,一做对比就发现差异点还是很多的。尤其是当用惯了某一种之后切换到另一种,一时半会儿反应不过来的时候,着实有点坑爹。