当前位置: 首页 > article >正文

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=1WHERE 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字段存储"北京市海淀区"(应拆分为citydistrict)。
  • 第二范式(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
    • 存储引擎对比
      特性InnoDBMyISAM
      事务支持
      外键支持
      锁粒度行锁表锁
      索引与数据存储聚簇索引(索引和数据一起存储)非聚簇索引(索引和数据分开)
      适用场景事务性场景(如订单、支付)只读或插入为主(如日志)
    • 索引优化工具
      • 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:文档结构不固定(如用户行为日志)。
      • 高并发写入:支持分片集群,写性能优异。
      • 地理空间查询:内置对地理位置的索引和查询支持。
      • 与关系型数据库对比
        特性MongoDBMySQL
        数据模型文档(JSON 格式)表结构
        查询语言类 JSON 的 BSONSQL
        事务支持4.0 + 支持多文档事务全事务支持
        水平扩展原生支持分片集群需要中间件(如 ShardingSphere)
        适用场景灵活、高并发写入场景强事务一致性场景

    四、综合应用示例

    场景:设计一个电商订单系统,包含用户、商品、订单表。

     

    数据库设计

     
    1. 用户表(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)
      );

      索引优化

    2. orders.user_id添加索引,加速用户订单查询。
    3. 复合索引(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;

    五、总结

    数据库是面试的核心考点,需掌握:

     
    1. SQL:熟练编写复杂查询,理解索引原理与优化。
    2. 设计:权衡范式与反范式,根据业务选择事务隔离级别。
    3. 主流数据库:掌握 MySQL 存储引擎差异、Redis 缓存策略、MongoDB 适用场景。

    相关文章:

    Java 语言特性(面试系列2)

    一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 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 究竟是什么?

    大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

    零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

    一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

    Vue记事本应用实现教程

    文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

    内存分配函数malloc kmalloc vmalloc

    内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

    地震勘探——干扰波识别、井中地震时距曲线特点

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

    7.4.分块查找

    一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

    【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

    缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; 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:技术路线“神仙打架”,视频生成冲上云霄

    文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

    C++实现分布式网络通信框架RPC(3)--rpc调用端

    目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

    Ubuntu系统下交叉编译openssl

    一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

    Cursor实现用excel数据填充word模版的方法

    cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

    synchronized 学习

    学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; 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服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

    C++_核心编程_多态案例二-制作饮品

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

    深入剖析AI大模型:大模型时代的 Prompt 工程全解析

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

    使用VSCode开发Django指南

    使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

    SkyWalking 10.2.0 SWCK 配置过程

    SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

    超短脉冲激光自聚焦效应

    前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

    【杂谈】-递归进化:人工智能的自我改进与监管挑战

    递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

    Linux 文件类型,目录与路径,文件与目录管理

    文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

    Flask RESTful 示例

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

    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任务调度系统

    要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

    iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

    美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

    TDengine 快速体验(Docker 镜像方式)

    简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

    【Linux】shell脚本忽略错误继续执行

    在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...