Java 语言特性(面试系列2)
一、SQL 基础
1. 复杂查询
(1)连接查询(JOIN)
- 内连接(INNER JOIN):返回两表匹配的记录。
SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id = d.dept_id;
左连接(LEFT JOIN):返回左表所有记录,右表无匹配时补 NULL。
SELECT e.name, p.project_name FROM employees e LEFT JOIN projects p ON e.emp_id = p.lead_emp_id;
多表连接:
SELECT e.name, d.dept_name, p.project_name FROM employees e JOIN departments d ON e.dept_id = d.dept_id JOIN projects p ON e.emp_id = p.lead_emp_id;
2)子查询
- 标量子查询:返回单个值,用于条件判断
SELECT name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
行子查询:返回一行多列。
SELECT * FROM employees WHERE (dept_id, salary) = (SELECT dept_id, MAX(salary) FROM employees);
存在性查询(EXISTS)
SELECT dept_name FROM departments d WHERE EXISTS (SELECT 1 FROM employees e WHERE e.dept_id = d.dept_id);
(3)分组查询(GROUP BY)
- 基本分组
SELECT dept_id, COUNT(*) as emp_count FROM employees GROUP BY dept_id;
HAVING 过滤:对分组结果过滤(WHERE 用于分组前,HAVING 用于分组后)。
SELECT dept_id, AVG(salary) as avg_salary FROM employees GROUP BY dept_id HAVING AVG(salary) > 10000;
2. 索引优化
- 索引类型:
- B-Tree 索引:最常用,适用于等值查询和范围查询(如
WHERE age > 20
)。- 哈希索引:仅支持等值查询(如
WHERE id = 1
),不支持范围查询。- 全文索引:用于文本搜索(如
MATCH AGAINST
)。- 优化原则:
- 最左前缀匹配:复合索引(如
(a, b, c)
)支持WHERE a=1
、WHERE a=1 AND b=2
,但不支持WHERE b=2
。- 避免索引失效:避免在索引列上使用函数(如
WHERE YEAR(create_time) = 2023
)。- 覆盖索引:查询的字段直接在索引中,无需回表(如
SELECT id, name FROM users WHERE id = 1
)。- 索引失效场景:
-- 错误:索引列参与计算 SELECT * FROM orders WHERE price * 0.9 < 100;-- 正确:移项到右侧 SELECT * FROM orders WHERE price < 100 / 0.9;
二、数据库设计
1. 范式(Normalization)
- 第一范式(1NF):字段不可再分。
- 反例:
address
字段存储"北京市海淀区"
(应拆分为city
和district
)。- 第二范式(2NF):消除部分依赖(主键为复合键时)。
- 表
(订单ID, 商品ID, 商品名称, 数量)
中,商品名称
只依赖于商品ID
,应拆分表。- 第三范式(3NF):消除传递依赖。
- 表
(员工ID, 部门ID, 部门地址)
中,部门地址
通过部门ID
传递依赖,应拆分表。
2. 反范式(Denormalization)
- 定义:为提高查询性能,有意违反范式,引入冗余数据。
- 场景:
- 频繁关联的字段(如订单表冗余用户姓名,避免每次 JOIN 用户表)。
- 统计数据(如文章表保存
comment_count
字段,避免每次 COUNT 评论表)。- 优缺点:
- 优点:减少 JOIN,提升查询速度。
- 缺点:数据冗余,更新时需维护一致性(如用触发器或事务)
3. 事务隔离级别
- 四大特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
- 隔离级别:
隔离级别 脏读 不可重复读 幻读 实现方式 读未提交(Read Uncommitted) ✅ ✅ ✅ 无锁 读已提交(Read Committed) ❌ ✅ ✅ 行级共享锁,读取时加锁立即释放 可重复读(REPEATABLE READ) ❌ ❌ ✅ 行级共享锁,事务结束后释放(MySQL 默认) 串行化(SERIALIZABLE) ❌ ❌ ❌ 表级共享锁,事务结束后释放 - MySQL 默认隔离级别:
REPEATABLE READ
,通过 MVCC(多版本并发控制)解决不可重复读。
三、主流数据库
1. MySQL
- 存储引擎对比:
特性 InnoDB MyISAM 事务支持 ✅ ❌ 外键支持 ✅ ❌ 锁粒度 行锁 表锁 索引与数据存储 聚簇索引(索引和数据一起存储) 非聚簇索引(索引和数据分开) 适用场景 事务性场景(如订单、支付) 只读或插入为主(如日志) - 索引优化工具:
EXPLAIN
语句:分析查询执行计划,查看是否使用索引。EXPLAIN SELECT * FROM users WHERE age > 18;
SHOW PROFILE
:查看查询各阶段耗时。
2. Redis
- 数据结构与应用场景:
- String:缓存(如
SET user:1 '{"name":"Alice"}'
)。- Hash:存储对象(如用户信息
HSET user:1 name "Alice"
)。- List:消息队列(如
LPUSH queue task1
)。- Set:去重(如点赞用户集合)。
- Sorted Set:排行榜(如
ZADD scoreboard 100 "user1"
)。- 缓存策略:
- 缓存穿透:查询不存在的数据,导致请求直达 DB。
- 解决方案:缓存空值、布隆过滤器。
- 缓存雪崩:大量缓存同时过期,导致 DB 压力骤增。
- 解决方案:随机过期时间、多级缓存。
- 缓存击穿:热点 key 过期瞬间,大量请求直达 DB。
- 解决方案:永不过期、加互斥锁。
3. MongoDB
- 适用场景:
- 灵活 schema:文档结构不固定(如用户行为日志)。
- 高并发写入:支持分片集群,写性能优异。
- 地理空间查询:内置对地理位置的索引和查询支持。
- 与关系型数据库对比:
特性 MongoDB MySQL 数据模型 文档(JSON 格式) 表结构 查询语言 类 JSON 的 BSON SQL 事务支持 4.0 + 支持多文档事务 全事务支持 水平扩展 原生支持分片集群 需要中间件(如 ShardingSphere) 适用场景 灵活、高并发写入场景 强事务一致性场景
四、综合应用示例
场景:设计一个电商订单系统,包含用户、商品、订单表。
数据库设计:
- 用户表(users)
CREATE TABLE users (id BIGINT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL,email VARCHAR(100) UNIQUE,create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
2.商品表(products):
CREATE TABLE products (id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(100) NOT NULL,price DECIMAL(10, 2) NOT NULL,stock INT DEFAULT 0,category_id BIGINT,INDEX idx_category (category_id) );
3.订单表(orders):
CREATE TABLE orders (id BIGINT PRIMARY KEY AUTO_INCREMENT,user_id BIGINT NOT NULL,total_amount DECIMAL(10, 2) NOT NULL,status TINYINT DEFAULT 0 COMMENT '0-待支付,1-已支付',create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (user_id) REFERENCES users(id),INDEX idx_user_status (user_id, status) );
索引优化:
- 为
orders.user_id
添加索引,加速用户订单查询。- 复合索引
(user_id, status)
支持按用户和状态过滤(如查询用户待支付订单)。
事务示例(扣库存):
BEGIN TRANSACTION;-- 检查库存 SELECT stock FROM products WHERE id = 1 FOR UPDATE; -- 行锁-- 扣减库存(假设库存足够) UPDATE products SET stock = stock - 1 WHERE id = 1;-- 创建订单 INSERT INTO orders (user_id, total_amount, status) VALUES (1001, 99.99, 0);COMMIT;
五、总结
数据库是面试的核心考点,需掌握:
- SQL:熟练编写复杂查询,理解索引原理与优化。
- 设计:权衡范式与反范式,根据业务选择事务隔离级别。
- 主流数据库:掌握 MySQL 存储引擎差异、Redis 缓存策略、MongoDB 适用场景。
相关文章:
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...