MySql与MongoDB

一、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 } } })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值