Python学习之复习MySQL-Day3(DQL)
目录
- 文章声明⭐⭐⭐
- 让我们开始今天的学习吧!
- DQL简介
- 基本查询
- 查询多个/全部字段
- 设置别名
- 去除重复记录
- 条件查询
- 条件查询介绍
- 实例演示
- 聚合函数
- 什么是聚合函数?
- 常见的聚合函数
- 实例演示
- 分组查询
- 分组查询语法
- where 和 having 的区别
- 实例演示
- 排序查询
- 语法
- 实例演示
- 分页查询
- 语法
- 实例演示
- 综合练习
文章声明⭐⭐⭐
- 该文章为我(有编程语言基础,非编程小白)的 MySQL复习笔记
- 知识来源为 B站UP主(黑马程序员)的MySQL课程视频,归纳为自己的语言与理解记录于此并加以实践
- 此前我已经学习过了MySQL,现在是在复习阶段,所以不是面向小白的教学文章
- 不出意外的话,我大抵会 持续更新
- 想要了解前端开发(技术栈大致有:Vue2/3、微信小程序、uniapp、HarmonyOS、NodeJS、Typescript)与Python的小伙伴,可以关注我!谢谢大家!
让我们开始今天的学习吧!
DQL简介
DQL英文全称Data Query Language,即数据查询语言,用来查询表中数据
完整语法如下:
select 字段列表 from 表名列表 where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序字段列表 limit 分页参数
基本查询
查询多个/全部字段
mysql> select id,username from emp;
+------+----------+
| id | username |
+------+----------+
| 1 | Richie |
| 2 | Taylor |
| 3 | Mike |
+------+----------+
3 rows in set (0.00 sec)mysql> select * from emp; # 数据量大的时候尽量不要使用,因为效率比较低
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 2 | Taylor | 34 | 女 |
| 3 | Mike | 45 | 男 |
+------+----------+------+--------+
3 rows in set (0.00 sec)
设置别名
设置别名的好处在于,我们可以自定义字段名,可以更直观的观察数据
mysql> select username as name,gender as sex from emp;
+--------+------+
| name | sex |
+--------+------+
| Richie | 男 |
| Taylor | 女 |
| Mike | 男 |
+--------+------+
3 rows in set (0.00 sec)mysql> select username name,gender sex from emp; # as可以省略
+--------+------+
| name | sex |
+--------+------+
| Richie | 男 |
| Taylor | 女 |
| Mike | 男 |
+--------+------+
3 rows in set (0.00 sec)
去除重复记录
mysql> select distinct gender '性别' from emp; # 使用关键字distinc来去除重复记录
+------+
| 性别 |
+------+
| 男 |
| 女 |
+------+
2 rows in set (0.00 sec)
条件查询
条件查询介绍
| 比较运算符 | 功能 |
|---|---|
| > | 大于 |
| >= | 大于等于 |
| < | 小于 |
| <= | 小于等于 |
| = | 等于 |
| <> 或 != | 不等于 |
| between … and … | 在某个范围之内(含最大最小值) |
| in(…) | 在in之后的列表中的值,就是多选一的意思 |
| like 占位符 | 模糊匹配(_匹配单个字符,%匹配任意个字符) |
| is null | 是null |
| 逻辑运算符 | 功能 |
|---|---|
| and 或 && | 并且(多个条件同时成立) |
| or 或 || | 或者(多个条件任意一个成立) |
| not 或 ! | 非(不是) |
实例演示
mysql> select * from emp where age = 88; # 查询年龄等于88的员工
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 5 | 张三 | 88 | |
+------+----------+------+--------+
1 row in set (0.00 sec)mysql> select * from emp where age < 30; # 查询年龄小于30的员工
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 4 | | 25 | 女 |
+------+----------+------+--------+
2 rows in set (0.00 sec)mysql> select * from emp where age <= 25; # 查询年龄小于等于25的员工
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 4 | | 25 | 女 |
+------+----------+------+--------+
2 rows in set (0.00 sec)mysql> select * from emp where username = '' or username is null; # 查询没有姓名的员工
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 4 | | 25 | 女 |
+------+----------+------+--------+
1 row in set (0.00 sec)mysql> select * from emp where not (username = '' or username is null); # 查询有姓名的员工
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 2 | Taylor | 34 | 女 |
| 3 | Mike | 45 | 男 |
| 5 | 张三 | 88 | |
+------+----------+------+--------+
4 rows in set (0.00 sec)mysql> select * from emp where age != 45; # 查询年龄不等于45的员工
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 2 | Taylor | 34 | 女 |
| 4 | | 25 | 女 |
| 5 | 张三 | 88 | |
+------+----------+------+--------+
4 rows in set (0.00 sec)mysql> select * from emp where age between 20 and 40; # 查询年龄在20-40之间的员工
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 2 | Taylor | 34 | 女 |
| 4 | | 25 | 女 |
+------+----------+------+--------+
3 rows in set (0.00 sec)mysql> select * from emp where gender = '女' and age < 30; # 查询性别为女且年龄小于30的员工
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 4 | | 25 | 女 |
+------+----------+------+--------+
1 row in set (0.00 sec)mysql> select * from emp where gender = '女' and age < 30; # 查询年龄为21或者25或者34的员工
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 4 | | 25 | 女 |
+------+----------+------+--------+
1 row in set (0.00 sec)mysql> select * from emp where age in (21,25,34); # 查询年龄为21或者25或者34的员工
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 2 | Taylor | 34 | 女 |
| 4 | | 25 | 女 |
+------+----------+------+--------+
3 rows in set (0.00 sec)mysql> select * from emp where username like '__'; # 查询姓名为两个字的员工
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 5 | 张三 | 88 | |
+------+----------+------+--------+
1 row in set (0.00 sec)mysql> select * from emp where username like '%e'; # 查询姓名最后是e的员工
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 3 | Mike | 45 | 男 |
+------+----------+------+--------+
2 rows in set (0.00 sec)
聚合函数
什么是聚合函数?
聚合函数用于将一列数据作为一个整体,进行纵向的计算
注意:null不参与聚合函数的运算
常见的聚合函数
| 函数 | 功能 |
|---|---|
| count | 统计数量 |
| max | 最大值 |
| min | 最小值 |
| avg | 平均值 |
| sum | 求和 |
实例演示
mysql> select * from emp;
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 2 | Taylor | 34 | 女 |
| 3 | Mike | 45 | 男 |
| 4 | | 25 | 女 |
| 5 | 张三 | 88 | |
+------+----------+------+--------+
5 rows in set (0.00 sec)mysql> select count(id) from emp; # 统计有多少条包含id字段的记录,不统计null
+-----------+
| count(id) |
+-----------+
| 5 |
+-----------+
1 row in set (0.00 sec)mysql> select avg(age) from emp; # 统计员工的平均年龄
+----------+
| avg(age) |
+----------+
| 42.6000 |
+----------+
1 row in set (0.03 sec)mysql> select max(age) from emp; # 统计员工的最大年龄
+----------+
| max(age) |
+----------+
| 88 |
+----------+
1 row in set (0.00 sec)mysql> select min(age) from emp; # 统计员工的最小年龄
+----------+
| min(age) |
+----------+
| 21 |
+----------+
1 row in set (0.00 sec)mysql> select sum(age) from emp where gender = '男'; # 统计男员工的年龄之和
+----------+
| sum(age) |
+----------+
| 66 |
+----------+
1 row in set (0.00 sec)
分组查询
分组查询语法
select 字段列表 from 表名 [where 条件] group by 分组字段名 [having 分组后过滤的条件]
where 和 having 的区别
- 执行时机不同:where 是在 group by 分组之前进行过滤,不满足 where 条件的,不参与 group by 分组;而 having 则是在 group by 分组之后过滤的
- 判断条件不同:where 不能对聚合函数进行判断过滤,而 having 则可以
注意:执行顺序为 where > 聚合函数 > having
实例演示
mysql> select * from emp;
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 2 | Taylor | 29 | 女 |
| 3 | Mike | 38 | 男 |
| 4 | Jack | 88 | 男 |
| 5 | Joker | 56 | 男 |
| 6 | Nancy | 18 | 女 |
+------+----------+------+--------+
6 rows in set (0.00 sec)mysql> select gender,count(*) from emp group by gender; # 根据性别分组,统计男员工和女员工的数量
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男 | 4 |
| 女 | 2 |
+--------+----------+
2 rows in set (0.00 sec)mysql> select gender,avg(age) from emp group by gender; # 根据性别分组,统计男员工和女员工的平均年龄
+--------+----------+
| gender | avg(age) |
+--------+----------+
| 男 | 50.7500 |
| 女 | 23.5000 |
+--------+----------+
2 rows in set (0.03 sec)mysql> select gender,count(*) from emp where age < 60 group by gender having count(*) >= 3; # 查询年龄小于60的员工,并根据性别分组,获取员工数量大于等于3的性别
+--------+----------+
| gender | count(*) |
+--------+----------+
| 男 | 3 |
+--------+----------+
1 row in set (0.00 sec)mysql> select gender,count(*) num from emp where age < 60 group by gender having num >= 3; # 还可以在上一个例题中起别名
+--------+-----+
| gender | num |
+--------+-----+
| 男 | 3 |
+--------+-----+
1 row in set (0.03 sec)
排序查询
语法
select 字段列表 from 表名 order by 字段1 排序方式1,字段2 排序方式2 ... ;
排序方式
- 升序:asc(ascend,此为默认值)
- 降序:desc(descend)
实例演示
mysql> select * from emp;
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 2 | Taylor | 29 | 女 |
| 3 | Mike | 38 | 男 |
| 4 | Jack | 88 | 男 |
| 5 | Joker | 56 | 男 |
| 6 | Nancy | 18 | 女 |
+------+----------+------+--------+
6 rows in set (0.00 sec)mysql> select username '姓名',age '年龄',gender '性别' from emp where gender = '男' order by age; # 根据 年龄对男员工进行升序排序
+--------+------+------+
| 姓名 | 年龄 | 性别 |
+--------+------+------+
| Richie | 21 | 男 |
| Mike | 38 | 男 |
| Joker | 56 | 男 |
| Jack | 88 | 男 |
+--------+------+------+
4 rows in set (0.00 sec)
分页查询
语法
select 字段列表 from 表名 limit 起始索引 , 查询记录数;
注意:
- 起始索引从 0 开始计算,起始索引 = (要查询的页码数 - 1)* 每页显示记录数
- 如果查询的是第一页,起始索引可以省略
实例演示
mysql> select * from emp;
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 2 | Taylor | 29 | 女 |
| 3 | Mike | 38 | 男 |
| 4 | Jack | 88 | 男 |
| 5 | Joker | 56 | 男 |
| 6 | Nancy | 18 | 女 |
| 7 | Linken | 57 | 男 |
+------+----------+------+--------+
7 rows in set (0.00 sec)mysql> select * from emp limit 0 , 4; # 查询第一页员工数据,每页展示4条数据
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 2 | Taylor | 29 | 女 |
| 3 | Mike | 38 | 男 |
| 4 | Jack | 88 | 男 |
+------+----------+------+--------+
4 rows in set (0.00 sec)mysql> select * from emp limit 4; # 查询第一页数据时可以简写
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 1 | Richie | 21 | 男 |
| 2 | Taylor | 29 | 女 |
| 3 | Mike | 38 | 男 |
| 4 | Jack | 88 | 男 |
+------+----------+------+--------+
4 rows in set (0.00 sec)mysql> select * from emp limit 5,5; # 查询第二页数据,每页展示5条数据
+------+----------+------+--------+
| id | username | age | gender |
+------+----------+------+--------+
| 6 | Nancy | 18 | 女 |
| 7 | Linken | 57 | 男 |
+------+----------+------+--------+
2 rows in set (0.00 sec)
综合练习
# 查询年龄为20,21,22,23岁的女性员工信息
select * from emp where age in (20,21,22,23) && gender = '女';
# 查询性别为男,并且年龄在 20-40 (不包含20岁包含40岁)岁且姓名长度等于4的员工信息
select * from emp where gender = '男' && age between 21 and 40 && name like '____';
# 统计员工表中年龄小于60岁的男性员工和女性员工的人数
select gender , count(*) from emp where age < 60 group by gender
# 查询所有年龄小于等于35岁的员工姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按入职时间降序排序
select name,age from emp where age <= 35 order by age asc,entrytime desc;
# 查询性别为男,并且年龄在 20-40岁(包含20、40岁)以内的前五名员工信息
select * from emp where gender = '男' && age between 20 and 40 limit 5;
相关文章:
Python学习之复习MySQL-Day3(DQL)
目录 文章声明⭐⭐⭐让我们开始今天的学习吧!DQL简介基本查询查询多个/全部字段设置别名去除重复记录 条件查询条件查询介绍实例演示 聚合函数什么是聚合函数?常见的聚合函数实例演示 分组查询分组查询语法where 和 having 的区别实例演示 排序查询语法实…...
AI超级个体:ChatGPT与AIGC实战指南
目录 前言 一、ChatGPT在日常工作中的应用场景 1. 客户服务与支持 2. 内部沟通与协作 3. 创新与问题解决 二、巧用ChatGPT提升工作效率 1. 自动化工作流程 2. 信息整合与共享 3. 提高决策效率 三、巧用ChatGPT创造价值 1. 优化产品和服务 2. 提高员工满意度和留任率…...
SpringBoot集成websocket(5)|(使用OkHttpClient实现websocket以及详细介绍)
SpringBoot集成websocket(5)|(使用OkHttpClient实现websocket以及详细介绍) 文章目录 SpringBoot集成websocket(5)|(使用OkHttpClient实现websocket以及详细介绍)[TOC] 前言一、初始…...
Kafka-Kafka基本原理与集群快速搭建(实践)
Kafka单机搭建 下载Kafka Apache Download Mirrors 解压 tar -zxvf kafka_2.12-3.4.0.tgz -C /usr/local/src/software/kafkakafka内部bin目录下有个内置的zookeeper(用于单机) 启动zookeeper(在后台启动) nohup bin/zookeeper-server-start.sh conf…...
Elasticsearch 进阶(索引、类型、字段、分片、副本、集群等详细说明)-06
笔记来源:Elasticsearch Elasticsearch进阶 进阶-核心概念 索引Index 一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字…...
hive的分区表和分桶表详解
分区表 Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区,这样的查询效率会提高很多。 静态分区表基本语法 创建分区表 create table dept_p…...
verilog语法进阶-分布式ram
概述: FPGA的LUT查找表是用RAM设计的,所以LUT可以当成ram来使用,也并不是所有的LUT都可以当成ram来使用,sliceM的ram可以当成分布式ram来使用,而sliceL的ram只能当成rom来使用,也就是只能读,不能写&#x…...
HarmonyOS使用HTTP访问网络
HTTP数据请求 1 概述 日常生活中我们使用应用程序看新闻、发送消息等,都需要连接到互联网,从服务端获取数据。例如,新闻应用可以从新闻服务器中获取最新的热点新闻,从而给用户打造更加丰富、更加实用的体验。 那么要实现这样一种…...
GZ015 机器人系统集成应用技术样题1-学生赛
2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书(学生赛) 样题1 选手须知: 本任务书共 25页,如出现任务书缺页、字迹不清等问题,请及时向裁判示意,并进行任务书的更换。参赛队…...
计算机毕业设计 基于SpringBoot的日常办公用品直售推荐系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...
uniapp:使用fixed定位,iOS平台的安全区域问题解决
manifest.json > 添加节点 "safearea": { //iOS平台的安全区域"background": "#1C1E22","backgroundDark": "#1C1E22", // HX 3.1.19支持"bottom": {"offset": "auto"} },已解决ÿ…...
三层交换机原理与配置
文章目录 三层交换机原理与配置一、三层交换技术概述二、传统的 MLS三、基于CEF 的MLS1、转发信息库(FIB)2、邻接关系表3、工作原理: 四、三层交换机的配置1、三层交换机配置命令2、三层交换机配置步骤 三层交换机原理与配置 一、三层交换技…...
Linux-----5、文件系统
# 文件系统 # 终端的基本操作 ㈠ 打开多个终端 ㈡ 快速清屏 新建标签:command T 新建窗口:command N 关闭标签:command Q 关闭窗口:command W 放大:command 缩小:command - 清屏ÿ…...
电脑自动关机怎么设置?
电脑自动关机怎么设置?如果你是一名上班族,工作忙起来很多事情都会忘记做,有时候忙到很晚后紧急下班,就会忘记给电脑关机,电脑如果经常不关机,那么电脑就会超负荷的运转,大家都知道电脑的寿命是…...
MS5602视频 8 位数模转换器,可替代TLC5602
MS5602 是低功率、超高速视频数模转换器。 MS5602 以 DC 至 20MHz 的采样速率,将数字信号转换成模拟信号。由于高速工作 的特性, MS5602 适合于数字电视、电脑视频处理及雷达信号处 理等数字视频应用。 MS5602 工作在 -40C 至 85C 的温度范围内 …...
Logistic Regression——逻辑回归
1. 为什么需要逻辑回归 在前面学习的线性回归中,我们的预测值都是任意的连续值,例如预测房价。除此之外,还有一个常见的问题就是分类问题,而逻辑回归是一个解决分类问题的模型,其预测值是离散的。 分类问题又包括…...
跟随鼠标动态显示线上点的值(基于Qt的开源绘图控件QCustomPlot进行二次开发)
本文为转载 原文链接: 采用Qt快速绘制多条曲线(折线),跟随鼠标动态显示线上点的值(基于Qt的开源绘图控件QCustomPlot进行二次开发) 内容如下 QCustomPlot是一个开源的基于Qt的第三方绘图库,能…...
Todesk、向日葵等访问“无显示器”主机黑屏问题解决
我的环境是 ubuntu 22.04 安装 要安装 video dummy,请在终端中运行以下命令: sudo apt install xserver-xorg-video-dummy配置 video dummy 的配置文件请自行搜索 使用任何文本编辑器打开此文件。 我的是 /etc/X11/xorg.conf 默认配置文件包含以下内…...
maven打包插件maven-jar-plugin与spring-boot-maven-plugin
maven几种打包插件介绍 文章目录 🔊1.spring-boot-maven-plugin打包后效果 📕2.maven-jar-plugin打包后效果🖊️最后总结 🔊1.spring-boot-maven-plugin <plugins><plugin><groupId>org.springframework.boot&…...
uniapp微信小程序下载base64图片流或https图片
常规https的图片下载是这样的 const urlPath https://test/logo.png uni.downloadFile({url: urlPath,success(res){// 这时会产生一个临时路径,在应用本次启动期间可以正常使用。if (res.statusCode 200) {// 需要将图片保存到相册uni.saveImageToPhotosAlbum({…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
