• 数据库级别操作(建库、删库、切换、库信息)

  • 数据表 DDL(建表、新增字段、修改字段、删除表)

  • 基础 DML 查询、TOP/LIMIT、条件、排序、模糊匹配

  • INSERT / UPDATE / DELETE 增删改

  • 聚合函数

  • 主键、联合主键、自增列、约束 (CHECK / 外键 / 唯一约束)

  • 多表连接、集合运算(UNION、INTERSECT)

  • 视图

  • 索引

  • 变量、存储过程

  • 触发器

  • 数据库文件定义(仅 SQL Server 支持)

  • 四大数据库核心语法速查表(附录

1. 数据库级别操作

1.1 创建数据库

sql

-- SQL Server
CREATE DATABASE huang;

-- MySQL / PostgreSQL
CREATE DATABASE huang;

-- Oracle 无数据库概念,使用用户替代
CREATE USER huang IDENTIFIED BY '123456';

1.2 删除数据库

sql

-- SQL Server 安全写法
IF EXISTS(SELECT * FROM sys.databases WHERE name='huang')
DROP DATABASE huang;

-- MySQL / PostgreSQL 安全写法
DROP DATABASE IF EXISTS huang;

1.3 切换数据库

sql

-- SQL Server / MySQL
USE huang;

-- Oracle
CONNECT huang/123456;

1.4 修改数据库名称

sql

-- SQL Server 唯一可用
EXEC sp_renamedb 'huang','biao';

-- MySQL、PostgreSQL、Oracle:不支持直接改名
-- 解决方案:新建数据库,迁移所有数据表

1.5 系统内置存储过程 / 查看信息

sql

-- SQL Server
sp_spaceused;        -- 当前数据库空间占用
sp_helpdb;           -- 查看所有数据库

-- MySQL
SHOW DATABASES;
SHOW TABLE STATUS;

-- PostgreSQL
\l 查看库列表
-- Oracle
SELECT username FROM all_users;

❗注意:sp_spaceused、sp_helpdb、sp_renamedb 属于 T-SQL 私有语法,MySQL 无法执行

1.6 指定路径创建数据库(仅 SQL Server)

sql

CREATE database names
on
(name=names_dat,
filename='f:\namesdat.mdf',
size=10,
maxsize=20,
filegrowth=2)
log on
(name=names_log,
filename='f:\nameslog.ldf',
size=5,
filegrowth=2);

-- MySQL/PG/Oracle:无法在SQL中指定文件路径,由配置文件控制

1.7 修改数据库文件大小(仅 SQL Server)

sql

alter database names
modify file
(name=names_dat,
size=14);

2. 数据表 DDL

2.1 创建表

SQL Server 原版

sql

create table huang(
学号 int not null,
姓名 char(10),
性别 char(10)
);

MySQL 兼容版本

sql

create table huang(
学号 int not null,
姓名 char(10),
性别 char(10)
);

2.2 添加字段

sql

-- 所有数据库通用
alter table huang add 年龄 int;
alter table huang add 地址 char(10);

2.3 删除表

sql

-- SQL Server
DROP TABLE huang;
-- MySQL推荐
DROP TABLE IF EXISTS huang;

3. 查询语句(重点差异:TOP / LIMIT)

3.1 查询全部数据

sql

--全部数据库通用
select * from huang;

3.2 查询前 N 行

sql

-- SQL Server
select top 2 * from hai;

-- MySQL / PostgreSQL
select * from hai LIMIT 2;

-- Oracle
select * from hai where ROWNUM <=2;

3.3 字段别名

sql

--全部数据库通用
select top 2 姓名 as name,性别 as sex from huang;

3.4 排序

sql

--全部通用 asc升序、desc降序
select * from hai order by 成绩 asc;
select * from hai order by 成绩 desc;

3.5 区间条件 between and

✅通用规则:between 包含两端 >=下限 AND <=上限

sql

select * from hai where 成绩 between 80 and 89;

-- ❌错误写法(所有数据库都报错)
select * from hai where 成绩 between <=85 and >=95

--✅等价写法(通用)
select * from hai where 成绩 >=85 and 成绩 <=95;

3.6 多条件 AND / OR

sql

select * from hai where 性别='女';
select * from hai where 成绩 >=85 and 成绩 <=90;
select * from hai where 成绩 <85 or 成绩 >90;

3.7 模糊查询 LIKE

通用规则:%任意字符,_单个字符

sql

select * from hai where 姓名 like '小%';
select * from hai where 姓名 like '小_';

4. INSERT / UPDATE / DELETE

4.1 插入数据

sql

--通用,注意:数值数量、顺序必须和表结构匹配
insert into huang values(1,'黄XX','男',20,'河南');

4.2 删除数据

sql

delete from hai where 编号=4;
-- ⚠️禁止不带where:清空整张表!

4.3 更新数据

sql

-- ❌错误 字符串缺少单引号
update hai set 成绩=成绩-4 where 姓名=黄X;

-- ✅所有数据库通用正确写法
update hai set 成绩=成绩-4 where 姓名='黄X';
update hai set 成绩=成绩-5 where 性别='女';

5. 聚合函数(全部数据库通用)

sql

select sum(成绩) as 总分 from hai;
select max(成绩) as 最高分 from hai;
select min(成绩) as 最低分 from hai;
select avg(成绩) as 平均分 from hai;

select count(*) from hai;
select count(distinct 性别) from hai; --去重统计

6. 自增主键、约束

6.1 自增列语法对比

sql

-- SQL Server
id int identity(1,1) primary key

-- MySQL
id INT AUTO_INCREMENT PRIMARY KEY

-- PostgreSQL
id SERIAL PRIMARY KEY

-- Oracle
--无自增关键字,需要序列+触发器
CREATE SEQUENCE seq_hai_id;

6.2 主键约束

sql

--通用
alter table hai add constraint pk_hai primary key(编号);

6.3 联合主键

sql

create table 部门(
id int identity not null,
部门名称 nvarchar(20) not null,
部门经理 nvarchar(10) not null,
constraint pk_部门 primary key (部门名称, 部门经理)
);

MySQL 版本:去掉 identity,替换为 AUTO_INCREMENT,nvarchar → varchar

6.4 CHECK 约束

sql

create table users(
userid int identity primary key,
username nvarchar(20),
userage int check (userage >= 0 and userage <= 120)
);

⚠️注意:MySQL5.7 忽略 CHECK 约束;MySQL8.0 完整支持

6.5 外键约束

sql

--通用写法
create table employee(
employeeid int identity primary key,
employeename nvarchar(20) not null,
departmentid int ,
constraint fk_employee_department 
foreign key(departmentid) references department(departmentid)
);

7. 多表连接 & 集合运算

7.1 连接查询(INNER / LEFT / RIGHT JOIN 通用)

sql

--内连接
select s.sno,s.sname,c.cname
from student s
inner join class c on s.cid=c.cid;

--左连接
select s.sno,s.sname,c.cname
from student s
left join class c on s.cid=c.cid;

❗MySQL 不支持 FULL OUTER JOIN,其余数据库支持

7.2 集合运算

sql

--全部支持
select sno from abc union all select con from cde;

--交集 intersect
select sno from abc intersect select con from cde;
-- ❗MySQL不支持INTERSECT,需要子查询模拟

8. 视图 VIEW(语法基本通用)

sql

create view v_cde
as 
select * from cde where age=2;

select * from v_cde;

9. 索引

sql

--通用普通索引
CREATE INDEX ix_hai_成绩 ON hai(成绩);

--唯一索引
CREATE UNIQUE INDEX ix_name ON hai(姓名);

概念区分:

  1. SQL Server:聚集索引、非聚集索引,一张表仅 1 个聚集索引

  2. MySQL InnoDB:主键自动作为聚集索引

  3. Oracle、PostgreSQL:无聚集索引概念

10. 变量、存储过程

10.1 局部变量

sql

--SQL Server
declare @id int;
set @id=6;

--MySQL(存储过程内部)
DECLARE id INT;
SET id=6;

10.2 存储过程示例

SQL Server

sql

create procedure p_student
as
select sum(grade) from student;
go
exec p_student;

MySQL 改造要点

  1. CREATE PROCEDURE 语法大体一致

  2. GO 分隔符 MySQL 不识别

  3. 输出参数 OUT 写法兼容

  4. RAISERROR,替换为 SIGNAL

11. 触发器(差异极大!重点)

SQL Server

虚拟表:inserted(新增 / 更新新数据)、deleted(原始数据)

sql

create trigger student_upd
on student
for update
as
if update(grade)
begin
raiserror('不能修改学生成绩',16,1);
rollback transaction;
end

MySQL 触发器

无 inserted/deleted,使用 NEWOLD

抛出错误替换:SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '不能修改学生成绩';

12. 四大数据库语法速查附录

表格

功能

SQL Server(T-SQL)

MySQL

Oracle

PostgreSQL

取前 N 行

TOP n

limit n

where rownum<=n

limit n

自增

IDENTITY(1,1)

AUTO_INCREMENT

序列 + 触发器

SERIAL

抛出异常

RAISERROR

SIGNAL

RAISE_APPLICATION_ERROR

RAISE EXCEPTION

触发器新数据

inserted

NEW

:NEW

NEW

触发器旧数据

deleted

OLD

:OLD

OLD

交集运算

INTERSECT

不支持

INTERSECT

INTERSECT

全外连接

FULL OUTER JOIN

不支持

FULL OUTER JOIN

FULL OUTER JOIN

修改库名

exec sp_renamedb

不支持

不支持

不支持