news 2026/7/15 3:42:35

c#软件开发学习笔记--多表查询、SQLHelper

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c#软件开发学习笔记--多表查询、SQLHelper

数据库多表查询学习文档

一、多表查询概述

在实际开发中,我们经常需要从多个数据表中组合获取数据。例如:查询考试成绩时需要同时显示学员姓名,但姓名存储在学员信息表中,而成绩存储在成绩表中。


二、内连接查询(INNER JOIN)

2.1 概念

内连接查询两个表的公共部分,类似于集合的交集,只返回满足连接条件的记录。

2.2 语法格式

SELECT字段列表FROM1INNERJOIN2ON1.关联字段=2.关联字段WHERE条件

2.3 两个表内连接查询示例

-- 查询字段(StudentId是两个关联表的公共字段,需要指明来源表)SELECTScoreList.StudentId,StudentName,C#成绩 = CSharpFROMScoreListINNERJOINStudentsONStudents.StudentId=ScoreList.StudentIdWHERECSharp>75

2.4 多表内连接查询示例

SELECTStudents.StudentId,StudentName,C#成绩 = CSharp, ClassNameFROMStudentsINNERJOINScoreListONScoreList.StudentId=Students.StudentIdINNERJOINStudentClassONStudentClass.ClassId=Students.ClassIdWHERECSharp>75

2.5 注意事项

  1. 需要明确连接的表
  2. 两个表连接的条件(主外键关系)
  3. 两个表中相同的字段,必须说明来自哪个表
  4. 多表内连接时,表的顺序不影响结果

三、左外连接查询(LEFT OUTER JOIN)

3.1 概念

左外连接以左表为基准,返回左表的所有记录,以及右表中满足连接条件的记录。如果右表中没有匹配的记录,则返回 NULL。

3.2 语法格式

SELECT字段列表FROM左表LEFTOUTERJOIN右表ON左表.关联字段=右表.关联字段WHERE条件

3.3 示例对比

-- 内连接查询(没有成绩的男性不显示)SELECTStudents.StudentId,StudentName,C#成绩 = CSharpFROMStudentsINNERJOINScoreListONScoreList.StudentId=Students.StudentIdWHEREGender='男'-- 左外连接查询(董存瑞显示,但成绩为 NULL)SELECTStudents.StudentId,StudentName,C#成绩 = CSharpFROMStudentsLEFTOUTERJOINScoreListONScoreList.StudentId=Students.StudentIdWHEREGender='男'

3.4 注意事项

  • 左外连接左右表的顺序会影响查询结果
  • 交换左右表位置,查询结果会有区别(内连接没有此区别)

四、右外连接查询(RIGHT OUTER JOIN)

4.1 概念

右外连接以右表为基准,返回右表的所有记录,以及左表中满足连接条件的记录。如果左表中没有匹配的记录,则返回 NULL。

4.2 语法格式

SELECT字段列表FROM左表RIGHTOUTERJOIN右表ON左表.关联字段=右表.关联字段WHERE条件

4.3 示例

-- 查询所有班级及其学生(包括没有学生的班级)SELECTStudentId,StudentName,ClassNameFROMStudentsRIGHTOUTERJOINStudentClassONStudentClass.ClassId=Students.ClassId

五、全连接查询(FULL OUTER JOIN)

5.1 概念

全连接返回两个表的所有记录。当某条记录在另一个表中没有匹配时,对应的字段返回 NULL。全连接是左外连接和右外连接的并集。

5.2 语法格式

SELECT字段列表FROM1FULLOUTERJOIN2ON1.关联字段=2.关联字段WHERE条件

5.3 示例

-- 查询所有学生及其成绩,包括没有成绩的学生和没有对应学生的成绩记录SELECTStudents.StudentId,StudentName,C#成绩 = CSharpFROMStudentsFULLOUTERJOINScoreListONScoreList.StudentId=Students.StudentId

5.4 注意事项

  • SQL Server 支持FULL OUTER JOIN,但 MySQL 不直接支持,需要使用UNION实现
  • 返回结果 = 左表全部 + 右表全部

六、自连接查询(SELF JOIN)

6.1 概念

自连接是指同一个表自己和自己连接,常用于查询表内的层级关系或对比关系。

6.2 语法格式

SELECTa.字段列表,b.字段列表FROM表名 aINNERJOIN表名 bONa.关联字段=b.关联字段WHERE条件

6.3 示例一:查询员工及其直属上级

假设存在Employees表,包含EmployeeIdEmployeeNameManagerId字段:

-- 查询员工及其直属上级SELECTa.EmployeeId,a.EmployeeName,b.EmployeeNameASManagerNameFROMEmployees aINNERJOINEmployees bONa.ManagerId=b.EmployeeId

6.4 示例二:查询同级别的员工

-- 查询同部门的员工(排除自己)SELECTa.EmployeeNameAS员工A,b.EmployeeNameAS员工BFROMEmployees aINNERJOINEmployees bONa.DepartmentId=b.DepartmentIdWHEREa.EmployeeId<>b.EmployeeId--<>为不等于,等同于!=

6.5 注意事项

  • 必须使用表别名(如 a、b)来区分同一个表的不同引用
  • 常用于树形结构数据(如组织结构、分类层级)

七、交叉连接查询(CROSS JOIN)

7.1 概念

交叉连接返回两个表的笛卡尔积,即第一个表的每一行与第二个表的每一行组合。结果行数 = 表1行数 × 表2行数。

7.2 语法格式

-- 显式语法SELECT字段列表FROM1CROSSJOIN2-- 隐式语法(不推荐)SELECT字段列表FROM1,2

7.3 示例

-- 查询所有学生与所有课程的组合(生成选课可能性)SELECTStudentName,CourseNameFROMStudentsCROSSJOINCourses

7.4 注意事项

  • 交叉连接会产生大量数据,使用时需谨慎
  • 实际应用中通常与 WHERE 条件结合使用,过滤掉不需要的组合
  • 隐式语法(逗号分隔)容易出错,推荐使用显式CROSS JOIN

八、各种连接方式对比

连接类型语法返回结果表顺序影响
内连接INNER JOIN两个表的公共部分(交集)无影响
左外连接LEFT OUTER JOIN左表全部 + 右表匹配部分有影响
右外连接RIGHT OUTER JOIN右表全部 + 左表匹配部分有影响
全连接FULL OUTER JOIN两个表的所有记录(并集)无影响
自连接JOIN 表名 AS 别名同一表内的关联数据无影响
交叉连接CROSS JOIN两个表的笛卡尔积无影响

九、第三方工具SQLHelper

9.1 SqlHelper 简介

SqlHelper 是基于 .NET Framework 开发的数据库操作组件,通过封装 ADO.NET 对象简化数据库访问流程。

9.2 核心方法

方法功能返回值
ExecuteNonQuery执行增删改操作影响行数(int)
ExecuteReader执行查询,返回数据阅读器SqlDataReader
ExecuteDataset执行查询,返回数据集DataSet
ExecuteScalar执行查询,返回单行单列object

9.3 多表查询示例

/// <summary>/// 使用SqlHelper执行多表内连接查询/// </summary>/// <param name="connectionString">数据库连接字符串</param>/// <returns>包含查询结果的DataSet</returns>publicstaticDataSetGetStudentScoreWithClass(stringconnectionString){stringsql=@"SELECT Students.StudentId, StudentName, C#成绩 = CSharp, ClassName FROM Students INNER JOIN ScoreList ON ScoreList.StudentId = Students.StudentId INNER JOIN StudentClass ON StudentClass.ClassId = Students.ClassId WHERE CSharp > 75";returnSqlHelper.ExecuteDataset(connectionString,CommandType.Text,sql);}/// <summary>/// 使用SqlHelper执行左外连接查询/// </summary>/// <param name="connectionString">数据库连接字符串</param>/// <returns>包含查询结果的DataSet</returns>publicstaticDataSetGetAllMaleStudentScore(stringconnectionString){stringsql=@"SELECT Students.StudentId, StudentName, C#成绩 = CSharp FROM Students LEFT OUTER JOIN ScoreList ON ScoreList.StudentId = Students.StudentId WHERE Gender = '男'";returnSqlHelper.ExecuteDataset(connectionString,CommandType.Text,sql);}

十、ADO.NET 核心对象

10.1 五大核心对象

对象功能常用方法/属性
SqlConnection数据库连接Open(),Close(),State
SqlCommand执行SQL命令ExecuteNonQuery(),ExecuteReader(),ExecuteScalar()
SqlDataReader读取数据(只读向前)Read(),GetString(),GetInt32()
SqlDataAdapter填充数据集Fill(DataSet)
DataSet内存中的数据库Tables[0],Tables["TableName"]

10.2 SqlCommand 返回三种数据类型

  1. 影响行数cmd.ExecuteNonQuery()
  2. 结果集cmd.ExecuteReader()
  3. 一行一列cmd.ExecuteScalar()

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 3:42:32

Claude Design工程解密:AI设计产品的系统化架构方法论

1. 这不是一份提示词&#xff0c;而是一份AI设计产品的工程蓝图我花两个小时逐行读完Claude Design那份被红队研究员Pliny从Anthropic系统里“钓”出来的系统提示词时&#xff0c;手边的咖啡已经凉透。屏幕右下角时间显示17:43&#xff0c;窗外北京四月的晚风正卷着柳絮撞在玻璃…

作者头像 李华
网站建设 2026/7/15 3:42:08

HarmonyOS 多端实战:把手机 UI 搬上大屏后,我翻车了

HarmonyOS 一次开发、多端部署实战&#xff1a;Phone、Pad、PC、Watch 到底该共享什么 最开始做 Nameo 多端适配时&#xff0c;我不是“差点”把 Phone 页面直接搬到大屏——我真的搬了&#xff0c;而且它还真的跑起来了。 然后尴尬也跟着跑来了。 Phone 那一小块布局安静地待…

作者头像 李华
网站建设 2026/7/15 3:39:57

51单片机(三)串口通信(UART)、Modbus协议

1. 什么是UART&#xff1f; UART&#xff0c;全称是 Universal Asynchronous Receiver/Transmitter&#xff0c;即通用异步收发器。它是一种广泛应用于嵌入式系统中的串行、异步、全双工通信协议。 简单来说&#xff0c;UART 允许两个设备之间通过一根发送线&#xff08;TXD&am…

作者头像 李华
网站建设 2026/7/15 3:39:55

FPD-Link III解串器DS90UB948-Q1高速PCB设计实战与避坑指南

1. 项目概述&#xff1a;从HDMI到LVDS的桥梁搭建在车载信息娱乐系统、工业控制面板或者高端医疗显示设备的设计中&#xff0c;我们常常会遇到一个经典难题&#xff1a;主处理器或图形源&#xff08;比如一颗高性能的SoC或GPU&#xff09;输出的往往是HDMI或DisplayPort这类现代…

作者头像 李华
网站建设 2026/7/15 3:39:47

表中表:嵌套表格解析为什么是文档理解最难啃的骨头之一

目录一、一张业务申请表里的解析盲区二、什么是嵌套表格三、为什么嵌套表格难以被解析工具“看懂”&#xff1f;**根因一&#xff1a;二维网格模型装不下树形结构****根因二&#xff1a;输出 schema 不支持嵌套****根因三&#xff1a;版面边界模糊**四、嵌套表格数据丢失&#…

作者头像 李华