数据库级别操作(建库、删库、切换、库信息)
数据表 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(姓名);
概念区分:
SQL Server:聚集索引、非聚集索引,一张表仅 1 个聚集索引
MySQL InnoDB:主键自动作为聚集索引
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 改造要点
CREATE PROCEDURE语法大体一致GO分隔符 MySQL 不识别输出参数
OUT写法兼容无
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,使用 NEW 和 OLD
抛出错误替换:SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '不能修改学生成绩';
12. 四大数据库语法速查附录
表格
SQL Server 练习案例 + 主流数据库语法对照(SQL Server / MySQL / Oracle / PostgreSQL)
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法