一、MySQL
1. 基本语法
数据定义语言(DDL):
CREATE: 创建数据库和表。
CREATE DATABASE mydatabase;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);
ALTER: 修改已有表的结构。
ALTER TABLE users ADD COLUMN age INT;
DROP: 删除数据库或表。
sql
DROP TABLE users;
数据操作语言(DML):
SELECT: 查询数据。
SELECT * FROM users WHERE age > 18;
INSERT: 插入数据。
INSERT INTO users (username, email, age) VALUES ('Alice', 'alice@example.com', 25);
UPDATE: 更新数据。
UPDATE users SET age = 26 WHERE username = 'Alice';
DELETE: 删除数据。
DELETE FROM users WHERE username = 'Alice';
数据控制语言(DCL):
GRANT: 授予权限。
GRANT SELECT, INSERT ON mydatabase.* TO 'username'@'localhost';
REVOKE: 撤销权限。
REVOKE INSERT ON mydatabase.* FROM 'username'@'localhost';
2. 查询优化
使用索引:
创建索引以加快查询速度。
CREATE INDEX idx_username ON users(username);
使用 EXPLAIN 来分析查询性能。
EXPLAIN SELECT * FROM users WHERE username = 'Alice';
3. 事务处理
ACID 属性:
示例:启动一个事务,进行多次操作,然后提交或回滚。
START TRANSACTION;
INSERT INTO users (username, email) VALUES ('Bob', 'bob@example.com');
UPDATE users SET age = 30 WHERE username = 'Bob';
COMMIT; -- 或者 ROLLBACK; 退回
4. 表设计
正规化与反正规范:
正规化示例:将用户信息和订单信息分为两个表,避免冗余。
外键约束示例:
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
5. 存储过程与触发器
创建存储过程:
DELIMITER //
CREATE PROCEDURE GetUserByUsername(IN uname VARCHAR(50))
BEGIN
SELECT * FROM users WHERE username = uname;
END //
DELIMITER ;
创建触发器:
CREATE TRIGGER before_insert_user
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
SET NEW.created_at = NOW();
END;
6. 备份与恢复
数据备份:
mysqldump -u username -p mydatabase > backup.sql
数据恢复:
mysql -u username -p mydatabase < backup.sql
二、MongoDB
1. 插入操作(Create)
插入单个文档:
db.collection.insertOne({ name: "Alice", age: 30 });
插入多个文档:
db.collection.insertMany([
{ name: "Bob", age: 25 },
{ name: "Charlie", age: 28 }
]);
2. 查询操作(Read)
查找所有文档:
db.collection.find();
条件查询:
db.collection.find({ age: { $gt: 25 } }); // 查找年龄大于25的文档
限制返回结果数量:
db.collection.find().limit(5); // 只返回前5个文档
排序:
db.collection.find().sort({ age: 1 }); // 按年龄升序排序
选择字段:
db.collection.find({}, { name: 1, age: 1 }); // 只返回name和age字段
3. 更新操作(Update)
更新单个文档:
db.collection.updateOne(
{ name: "Alice" }, // 查询条件
{ $set: { age: 31 } } // 更新内容
);
更新多个文档:
db.collection.updateMany(
{ age: { $lt: 30 } }, // 查询条件
{ $set: { status: "young" } } // 更新内容
);
使用运算符:
db.collection.updateOne(
{ name: "Bob" },
{ $inc: { age: 1 } } // 将Bob的年龄加1
);
4. 删除操作(Delete)
删除单个文档:
db.collection.deleteOne({ name: "Alice" });
删除多个文档:
db.collection.deleteMany({ age: { $lt: 30 } }); // 删除年龄小于30的所有文档
三、MongoDB表达式
1. 查询表达式
$eq:等于
db.collection.find({ field: { $eq: value } })
$ne:不等于
db.collection.find({ field: { $ne: value } })
$gt, $lt, $gte, $lte:大于、小于、大于等于、小于等于
db.collection.find({ age: { $gt: 25 } })
$in:包含于数组
db.collection.find({ status: { $in: ["active", "pending"] } })
$exists:字段是否存在
db.collection.find({ field: { $exists: true } })
2. 更新表达式
$set:设置字段值
db.collection.updateOne({ _id: id }, { $set: { field: newValue } })
$unset:删除字段
db.collection.updateOne({ _id: id }, { $unset: { field: "" } })
$push:向数组中添加元素
db.collection.updateOne({ _id: id }, { $push: { arrayField: newValue } })
$pull:从数组中移除元素
db.collection.updateOne({ _id: id }, { $pull: { arrayField: valueToRemove } })
3. 聚合表达式
$group:分组
db.collection.aggregate([
{ $group: { _id: "$category", total: { $sum: "$amount" } } }
])
$match:过滤条件
db.collection.aggregate([
{ $match: { status: "active" } }
])
$project:选择字段
db.collection.aggregate([
{ $project: { field1: 1, field2: 1, _id: 0 } }
])
$sort:排序
db.collection.aggregate([
{ $sort: { age: 1 } } // 1为升序,-1为降序
])
4. 逻辑表达式
$and:逻辑与
db.collection.find({ $and: [{ age: { $gt: 25 } }, { status: "active" }] })
$or:逻辑或
db.collection.find({ $or: [{ status: "active" }, { status: "pending" }] })
$not:逻辑非
db.collection.find({ age: { $not: { $lt: 18 } } })