MySQL_04

本文介绍了SQL中的子查询及连接查询的应用实例,包括where型、from型、exists型子查询,以及左连接、右连接和内连接的具体用法。
子查询:
where型子查询,from型子查询,exists型子查询

where型例子:
#查出表中最新的商品(以id最大为最新)
select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods);
#查出每个栏目下最新的商品
select goods_id,cat_id,goods_name from goods where goods_id in (select max(goods_id) from goods group by cat_id);
#查出每个栏目下最贵的商品
select goods_id,cat_id,goods_name,shop_price from goods where shop_price in (select max(shop_price) from goods group by cat_id);
from型例子:
#查出每个栏目下最新的商品
select * from (select goods_id,cat_id,goods_name from goods order by cat_id asc,goods_id desc) as tmp group by cat_id;
#查出挂科2门及以上的学生的平均分

exists型例子:


union联合
把2次或多次查询结果合并起来
要求:两次查询的列数一致
推荐:查询的每一列相对应的列类型一样
可以来自于多张表,多次sql语句取出的列名可以不一致,此时以第一个sql列名为准
如果不同的语句中取出的行,有完全相同(每个列的值都相同),那么相同的行讲会合并(去重复),如果不去重复,可以加all
如果子句中有order by,limit等,须加括号,避免产生歧义而出错。推荐放到所有子句之后,即对最终合并后的结果来排序(在子句中,order by 配合limit使用才有意义)
例:select goods_id,goods_ name,shop_price from goods where shop_price > 5000 union select goods_id,goods_name,shop_price from goods where shop_price < 20;
#将ta和tb表中id相同的项num相加,不相同的项单独列出来
select id,sum(num) from (select * from ta union all select * from tb) as tmp group by id;




连接查询(左连接,右连接,内连接)
要素:连接接上表;连接条件
select
goods_id, goods.cat_id, cat_name, goods_name, shop_price
from
goods left join category
on goods.cat_id = category.cat_id;

左连接:
select 列1,列2,列N from
tableA left join tableB
on tableA.列=tableB.列 (此处表连接成一张大表)
where group,having....照常写
特点:以左表为准,去右表找匹配数据,找不到匹配用NULL补齐。结果行数>=M (假设A表M行,B表N行数据)

右连接:
select 列1,列2,列N from
tableA right join tableB
on tableA.列=tableB.列 (此处表连接成一张大表)
where group,having....照常写
特点:以右表为准,去左表找匹配数据,找不到匹配用NULL补齐。结果行数>=M (假设A表M行,B表N行数据)


左右连接可以相互转化,推荐使用左连接代替右连接

内连接:
select 列1,列2,列N from
tableA inner join tableB
on tableA.列=tableB.列 (此处表连接成一张大表)
where group,having....照常写
特点:查询左右表中匹配的项,左右表中不匹配的数据项丢弃。结果行数<=M或N (假设A表M行,B表N行数据),内连接是此左右连接的交集(求左右连接的并集时,可以将左右连接的结果union一下)





在girl表中增加一行数据





取出商品的名称,栏目名,品牌名(连接3张表进行查询)






<think>我们面对的问题是:在尝试加载 `mysql_native_password` 插件时,出现错误提示 `Cant find symbol '_mysql_plugin_interface_version_' in library`。这个错误通常意味着插件库文件不兼容或损坏。以下是解决步骤: ### 错误原因分析 1. **插件文件不匹配**: - 使用的插件库文件(`.so` 或 `.dll`)与 MySQL 服务器版本不兼容[^4] - 文件可能来自不同版本的 MySQL 或已损坏 2. **文件位置错误**: - 插件文件未放置在正确的插件目录中 3. **符号表缺失**: - 插件库编译时未包含必要的接口符号 `_mysql_plugin_interface_version_` --- ### 解决方案 #### 步骤 1:确认插件文件位置 首先查询 MySQL 插件目录: ```sql SHOW VARIABLES LIKE 'plugin_dir'; ``` 记录返回的路径(例如 `/usr/lib/mysql/plugin/`),然后检查该目录下是否存在 `mysql_native_password.so`(Linux)或 `mysql_native_password.dll`(Windows)。 #### 步骤 2:验证文件兼容性 比较插件文件与 MySQL 版本的匹配性: ```bash # 查看 MySQL 版本 mysql --version # 检查插件文件信息 (Linux) file /usr/lib/mysql/plugin/mysql_native_password.so ``` 输出应包含类似 `ELF 64-bit LSB shared object, x86-64` 的架构信息,并与服务器架构一致。 #### 步骤 3:替换插件文件 如果文件缺失或不匹配: 1. **从官方包提取**: - 下载对应版本的 MySQL 二进制包 - 解压后复制 `lib/plugin/mysql_native_password.so` 到步骤 1 的目录 2. **使用系统包管理器修复**: ```bash # Ubuntu/Debian sudo apt --reinstall install mysql-server-8.0 # RHEL/CentOS sudo yum reinstall mysql-community-server-8.0 ``` #### 步骤 4:手动编译(高级) 若官方包未提供,可编译插件: ```bash # 下载 MySQL 源码 git clone --branch=mysql-8.0.31 https://github.com/mysql/mysql-server.git # 编译插件 cd mysql-server/plugin/mysql_native_password mkdir build && cd build cmake .. -DMYSQL_MAINTAINER_MODE=OFF make # 复制产物 cp mysql_native_password.so $(mysql -NBe "SHOW VARIABLES LIKE 'plugin_dir'") ``` #### 步骤 5:加载验证 重新尝试加载: ```sql INSTALL PLUGIN mysql_native_password SONAME 'mysql_native_password.so'; ``` --- ### 替代方案:使用默认插件 若问题持续,改用 MySQL 8.0 默认的 `caching_sha2_password`: ```sql ALTER USER 'repl'@'%' IDENTIFIED WITH caching_sha2_password BY 'secure_password'; FLUSH PRIVILEGES; ``` --- ### 故障排查表 | 现象 | 解决方案 | |------|----------| | `ERROR 1126` | 检查 `plugin_dir` 权限:`sudo chmod 755 /usr/lib/mysql/plugin` | | 文件存在但错误依旧 | 运行 `ldd mysql_native_password.so` 检查依赖 | | Windows DLL 错误 | 使用 Dependency Walker 检查 DLL 依赖链 | > **注意**:完成后需重启 MySQL 服务使新插件生效。 §§相关问题§§ 1. 如何查看 MySQL 插件的依赖关系? 2. 从源代码编译 MySQL 插件的通用步骤是什么? 3. 如何调试 MySQL 插件加载失败问题? 4. 在 Docker 容器中如何持久化 MySQL 插件? </think>### 解决 `Can't find symbol '_mysql_plugin_interface_version_' in library` 错误 这个错误通常表示插件文件与 MySQL 版本不兼容或文件损坏。以下是完整的解决方案: --- #### 步骤 1:验证插件文件状态 1. **确认插件文件是否存在**: ```bash # Linux 执行 sudo find / -name 'mysql_native_password.so' 2>/dev/null # Windows 检查默认目录 C:\Program Files\MySQL\MySQL Server 8.0\lib\plugin\ ``` 2. **检查文件完整性**: ```bash # Linux 查看文件类型 file $(mysql -NBe "SHOW VARIABLES LIKE 'plugin_dir';" | awk '{print $2}')/mysql_native_password.so # 预期输出应包含 "ELF 64-bit LSB shared object" ``` --- #### 步骤 2:解决符号缺失问题 ##### 方案 A:修复插件文件 1. **从官方安装包提取文件**: ```bash # 获取 MySQL 的 DEB/RPM 包 wget https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb # 解压获取插件文件 ar -x mysql-apt-config_0.8.22-1_all.deb tar -xvf data.tar.xz --wildcards '*.so' cp usr/lib/mysql/plugin/mysql_native_password.so /usr/lib/mysql/plugin/ ``` 2. **重置文件权限**: ```bash sudo chmod 755 /usr/lib/mysql/plugin/mysql_native_password.so sudo chown mysql:mysql /usr/lib/mysql/plugin/mysql_native_password.so ``` ##### 方案 B:重建插件(需 MySQL 源码) ```bash # 在 MySQL 源码目录操作 cd mysql-server/plugin/mysql_native_password mkdir bld && cd bld cmake .. -DMYSQL_MAINTAINER_MODE=OFF make sudo cp mysql_native_password.so $(mysql_config --plugindir) ``` --- #### 步骤 3:替代解决方案 1. **使用默认认证插件**: ```sql ALTER USER 'repl'@'%' IDENTIFIED WITH caching_sha2_password BY 'repl'; FLUSH PRIVILEGES; ``` 2. **降级 MySQL 版本**: ```bash # Ubuntu/Debian 示例 sudo apt install mysql-server-8.0=8.0.32-1ubuntu22.04 ``` --- #### 验证修复 ```sql -- 尝试重新加载插件 INSTALL PLUGIN mysql_native_password SONAME 'mysql_native_password.so'; -- 检查插件状态 SELECT plugin_name, plugin_status FROM information_schema.plugins WHERE plugin_name = 'mysql_native_password'; ``` --- ### 关键配置说明 | 配置项 | 推荐值 | 作用 | |--------|--------|------| | `plugin_dir` | `/usr/lib/mysql/plugin/` | 插件存储路径 | | `plugin_maturity` | `stable` | 插件稳定性级别 | | `skip_symbolic_links` | `OFF` | 允许符号链接 | > **注意**:MySQL 8.0.26+ 对插件接口做了向后不兼容修改,导致旧版插件失效[^4]。建议使用与服务器完全匹配的插件版本。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值