Java 面试知识整理(二):数据库
内连接 vs 外连接
假设有两张表:
users 表:
| id | name |
|---|---|
| 1 | 田中 |
| 2 | 佐藤 |
| 3 | 鈴木 |
orders 表:
| id | user_id | product |
|---|---|---|
| 1 | 1 | りんご |
| 2 | 1 | みかん |
| 3 | 3 | ぶどう |
INNER JOIN(内连接)
只返回匹配的数据
SELECT * FROM users u
INNER JOIN orders o ON u.id = o.user_id;
结果:只显示有订单的用户(田中×2、鈴木×1),佐藤没有订单所以不显示
LEFT JOIN(左外连接)
返回左表所有数据,右表没有匹配的显示 NULL
SELECT * FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
结果:佐藤也会出现,但订单列为 NULL
RIGHT JOIN(右外连接)
返回右表所有数据,左表没有匹配的显示 NULL
SELECT * FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
对比总结
| 连接类型 | 返回结果 |
|---|---|
| INNER JOIN | 两表都匹配的数据 |
| LEFT JOIN | 左表全部 + 右表匹配的 |
| RIGHT JOIN | 右表全部 + 左表匹配的 |
| FULL OUTER JOIN | 两表全部(MySQL 用 UNION 模拟) |
面试回答(日文):
内部結合(INNER JOIN)は、両方のテーブルに一致するデータのみを返します。 外部結合(OUTER JOIN)は、一致しないデータも含めて返します。 LEFT JOINは左側のテーブルの全データを、RIGHT JOINは右側のテーブルの全データを返します。
索引(Index) vs 主键(Primary Key)
| 对比项 | 索引(インデックス) | 主键(プライマリーキー) |
|---|---|---|
| 目的 | 查询加速 | 唯一标识一条记录 |
| 唯一性 | 可以不唯一 | 必须唯一 |
| NULL | 允许 | 不允许 |
| 数量 | 一个表可以有多个 | 一个表只能有一个 |
| 自动创建 | 需要手动创建 | 创建表时自动创建索引 |
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT, -- 主键
email VARCHAR(100),
INDEX idx_email (email) -- 普通索引
);
主键(Primary Key) vs 外键(Foreign Key)
| 对比项 | 主键 | 外键 |
|---|---|---|
| 作用 | 唯一标识本表记录 | 关联其他表 |
| 所在表 | 本表 | 子表(从表) |
| 值来源 | 自增或业务生成 | 必须来自主表的主键 |
| 重复 | 不允许 | 允许重复 |
| NULL | 不允许 | 允许 |
CREATE TABLE orders (
id BIGINT PRIMARY KEY,
user_id BIGINT,
FOREIGN KEY (user_id) REFERENCES users(id) -- 外键
);
MySQL 增删改查语法
-- 查询(SELECT)
SELECT * FROM users;
SELECT id, name FROM users WHERE age > 20 ORDER BY id DESC;
SELECT COUNT(*) FROM users GROUP BY status;
-- 新增(INSERT)
INSERT INTO users (name, email) VALUES ('田中', 'tanaka@test.com');
INSERT INTO users (name, email) VALUES
('佐藤', 'sato@test.com'),
('鈴木', 'suzuki@test.com');
-- 修改(UPDATE)
UPDATE users SET email = 'new@test.com' WHERE id = 1;
-- 删除(DELETE)
DELETE FROM users WHERE id = 1;