SQL 知识速查表
本页面汇总了 SQL 数据库查询中最常用的语法和知识点,方便快速查阅。
基础操作
创建数据库和表
CREATE DATABASE dbname;
USE dbname;
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100) UNIQUE,
age INT DEFAULT 18,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
数据类型
| 类型 | 说明 |
|---|---|
| INT/INTEGER | 整数 |
| BIGINT | 大整数 |
| DECIMAL(p,s) | 精确数值 |
| FLOAT/REAL | 浮点数 |
| VARCHAR(n) | 可变长度字符串 |
| CHAR(n) | 固定长度字符串 |
| TEXT | 长文本 |
| DATE | 日期 |
| TIME | 时间 |
| DATETIME/TIMESTAMP | 日期时间 |
| BOOLEAN | 布尔值 |
查询操作
SELECT
SELECT column1, column2 FROM table_name;
SELECT * FROM table_name; -- 查询所有列
SELECT DISTINCT column FROM table; -- 去重
SELECT column AS alias FROM table; -- 别名
WHERE 条件
SELECT * FROM users WHERE age > 18;
SELECT * FROM users WHERE name = 'Tom';
SELECT * FROM users WHERE age >= 18 AND age <= 30;
SELECT * FROM users WHERE name LIKE 'T%'; -- 模糊匹配
SELECT * FROM users WHERE age IN (18, 20, 22); -- 范围
SELECT * FROM users WHERE age BETWEEN 18 AND 30; -- 区间
运算符
= -- 等于
<> -- 不等于
> -- 大于
< -- 小于
>= -- 大于等于
<= -- 小于等于
AND -- 逻辑与
OR -- 逻辑或
NOT -- 逻辑非
IS NULL -- 为空
IS NOT NULL -- 不为空
排序和分页
SELECT * FROM users ORDER BY age ASC; -- 升序
SELECT * FROM users ORDER BY age DESC; -- 降序
SELECT * FROM users ORDER BY age DESC, name ASC; -- 多条件
-- 分页(不同数据库语法可能不同)
SELECT * FROM users LIMIT 10 OFFSET 0; -- MySQL/PostgreSQL
SELECT * FROM users FETCH FIRST 10 ROWS ONLY; -- SQL Server/Oracle
SELECT * FROM users WHERE ROWNUM <= 10; -- Oracle
聚合函数
| 函数 | 说明 |
|---|---|
| COUNT() | 计数 |
| SUM() | 求和 |
| AVG() | 平均值 |
| MAX() | 最大值 |
| MIN() | 最小值 |
SELECT COUNT(*) FROM users;
SELECT SUM(price) FROM orders;
SELECT AVG(age) FROM users;
SELECT MAX(price), MIN(price) FROM products;
-- 分组聚合
SELECT department, COUNT(*) FROM employees GROUP BY department;
SELECT category, SUM(sales) FROM orders GROUP BY category;
SELECT department, AVG(salary) FROM employees GROUP BY department HAVING AVG(salary) > 5000;
连接(JOIN)
-- 内连接
SELECT * FROM a INNER JOIN b ON a.id = b.a_id;
-- 左连接
SELECT * FROM a LEFT JOIN b ON a.id = b.a_id;
-- 右连接
SELECT * FROM a RIGHT JOIN b ON a.id = b.a_id;
-- 全连接(MySQL 不支持,可用 UNION 实现)
SELECT * FROM a FULL OUTER JOIN b ON a.id = b.a_id;
-- 自连接
SELECT a.name, b.name AS manager FROM employees a
JOIN employees b ON a.manager_id = b.id;
子查询
-- 在 WHERE 中使用子查询
SELECT * FROM users WHERE age > (SELECT AVG(age) FROM users);
-- 在 FROM 中使用子查询
SELECT * FROM (SELECT * FROM users WHERE age > 20) AS young_users;
-- 在 SELECT 中使用子查询
SELECT name, (SELECT COUNT(*) FROM orders WHERE orders.user_id = users.id) AS order_count
FROM users;
数据操作
INSERT 插入
INSERT INTO users (name, age) VALUES ('Tom', 20);
INSERT INTO users (name, age) VALUES ('Jerry', 18), ('Bob', 22);
INSERT INTO users SET name='Tom', age=20;
UPDATE 更新
UPDATE users SET age = 21 WHERE id = 1;
UPDATE users SET age = age + 1 WHERE name = 'Tom';
UPDATE users SET name = 'Tom', age = 20 WHERE id = 1;
DELETE 删除
DELETE FROM users WHERE id = 1;
DELETE FROM users WHERE age < 18;
DELETE FROM users; -- 删除所有(谨慎!)
约束
-- 主键
PRIMARY KEY
PRIMARY KEY (id)
-- 唯一约束
UNIQUE (email)
-- 非空约束
NOT NULL
-- 默认值
DEFAULT 18
-- 外键
FOREIGN KEY (user_id) REFERENCES users(id)
-- 检查约束
CHECK (age >= 0 AND age <= 150)
常用函数
字符串函数
SELECT LENGTH('hello'); -- 长度
SELECT UPPER('hello'); -- 转大写
SELECT LOWER('HELLO'); -- 转小写
SELECT SUBSTRING('hello', 1, 3); -- 截取
SELECT TRIM(' hello '); -- 去除空白
SELECT CONCAT('hello', 'world'); -- 拼接
SELECT REPLACE('hello', 'l', 'r');-- 替换
日期函数
SELECT NOW(); -- 当前时间
SELECT CURDATE(); -- 当前日期
SELECT DATE('2024-01-01'); -- 提取日期
SELECT YEAR('2024-01-01'); -- 提取年
SELECT MONTH('2024-01-01'); -- 提取月
SELECT DAY('2024-01-01'); -- 提取日
SELECT DATEDIFF('2024-01-01', '2023-01-01'); -- 日期差
条件函数
-- IF 函数
SELECT IF(age > 18, '成年', '未成年') FROM users;
-- CASE 语句
SELECT CASE
WHEN age < 18 THEN '未成年'
WHEN age < 30 THEN '青年'
ELSE '中年'
END FROM users;
-- COALESCE 返回第一个非空值
SELECT COALESCE(email, '未设置') FROM users;
索引
-- 创建索引
CREATE INDEX idx_name ON users(name);
CREATE INDEX idx_age ON users(age);
-- 复合索引
CREATE INDEX idx_name_age ON users(name, age);
-- 唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);
-- 删除索引
DROP INDEX idx_name ON users;
视图
-- 创建视图
CREATE VIEW user_orders AS
SELECT u.name, o.order_date, o.total
FROM users u
JOIN orders o ON u.id = o.user_id;
-- 使用视图
SELECT * FROM user_orders;
-- 删除视图
DROP VIEW user_orders;
事务
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 提交
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
ROLLBACK; -- 回滚
常见数据库
| 数据库 | 特点 |
|---|---|
| MySQL | 最流行的开源数据库 |
| PostgreSQL | 功能最强大的开源数据库 |
| SQL Server | Microsoft 企业级数据库 |
| Oracle | Oracle 公司企业级数据库 |
| SQLite | 轻量级嵌入式数据库 |