c#软件开发学习笔记--多表查询、SQLHelper
数据库多表查询学习文档一、多表查询概述在实际开发中我们经常需要从多个数据表中组合获取数据。例如查询考试成绩时需要同时显示学员姓名但姓名存储在学员信息表中而成绩存储在成绩表中。二、内连接查询INNER JOIN2.1 概念内连接查询两个表的公共部分类似于集合的交集只返回满足连接条件的记录。2.2 语法格式SELECT字段列表FROM表1INNERJOIN表2ON表1.关联字段表2.关联字段WHERE条件2.3 两个表内连接查询示例-- 查询字段StudentId是两个关联表的公共字段需要指明来源表SELECTScoreList.StudentId,StudentName,C#成绩 CSharpFROMScoreListINNERJOINStudentsONStudents.StudentIdScoreList.StudentIdWHERECSharp752.4 多表内连接查询示例SELECTStudents.StudentId,StudentName,C#成绩 CSharp, ClassNameFROMStudentsINNERJOINScoreListONScoreList.StudentIdStudents.StudentIdINNERJOINStudentClassONStudentClass.ClassIdStudents.ClassIdWHERECSharp752.5 注意事项需要明确连接的表两个表连接的条件主外键关系两个表中相同的字段必须说明来自哪个表多表内连接时表的顺序不影响结果三、左外连接查询LEFT OUTER JOIN3.1 概念左外连接以左表为基准返回左表的所有记录以及右表中满足连接条件的记录。如果右表中没有匹配的记录则返回 NULL。3.2 语法格式SELECT字段列表FROM左表LEFTOUTERJOIN右表ON左表.关联字段右表.关联字段WHERE条件3.3 示例对比-- 内连接查询没有成绩的男性不显示SELECTStudents.StudentId,StudentName,C#成绩 CSharpFROMStudentsINNERJOINScoreListONScoreList.StudentIdStudents.StudentIdWHEREGender男-- 左外连接查询董存瑞显示但成绩为 NULLSELECTStudents.StudentId,StudentName,C#成绩 CSharpFROMStudentsLEFTOUTERJOINScoreListONScoreList.StudentIdStudents.StudentIdWHEREGender男3.4 注意事项左外连接左右表的顺序会影响查询结果交换左右表位置查询结果会有区别内连接没有此区别四、右外连接查询RIGHT OUTER JOIN4.1 概念右外连接以右表为基准返回右表的所有记录以及左表中满足连接条件的记录。如果左表中没有匹配的记录则返回 NULL。4.2 语法格式SELECT字段列表FROM左表RIGHTOUTERJOIN右表ON左表.关联字段右表.关联字段WHERE条件4.3 示例-- 查询所有班级及其学生包括没有学生的班级SELECTStudentId,StudentName,ClassNameFROMStudentsRIGHTOUTERJOINStudentClassONStudentClass.ClassIdStudents.ClassId五、全连接查询FULL OUTER JOIN5.1 概念全连接返回两个表的所有记录。当某条记录在另一个表中没有匹配时对应的字段返回 NULL。全连接是左外连接和右外连接的并集。5.2 语法格式SELECT字段列表FROM表1FULLOUTERJOIN表2ON表1.关联字段表2.关联字段WHERE条件5.3 示例-- 查询所有学生及其成绩包括没有成绩的学生和没有对应学生的成绩记录SELECTStudents.StudentId,StudentName,C#成绩 CSharpFROMStudentsFULLOUTERJOINScoreListONScoreList.StudentIdStudents.StudentId5.4 注意事项SQL Server 支持FULL OUTER JOIN但 MySQL 不直接支持需要使用UNION实现返回结果 左表全部 右表全部六、自连接查询SELF JOIN6.1 概念自连接是指同一个表自己和自己连接常用于查询表内的层级关系或对比关系。6.2 语法格式SELECTa.字段列表,b.字段列表FROM表名 aINNERJOIN表名 bONa.关联字段b.关联字段WHERE条件6.3 示例一查询员工及其直属上级假设存在Employees表包含EmployeeId、EmployeeName、ManagerId字段-- 查询员工及其直属上级SELECTa.EmployeeId,a.EmployeeName,b.EmployeeNameASManagerNameFROMEmployees aINNERJOINEmployees bONa.ManagerIdb.EmployeeId6.4 示例二查询同级别的员工-- 查询同部门的员工排除自己SELECTa.EmployeeNameAS员工A,b.EmployeeNameAS员工BFROMEmployees aINNERJOINEmployees bONa.DepartmentIdb.DepartmentIdWHEREa.EmployeeIdb.EmployeeId--为不等于等同于6.5 注意事项必须使用表别名如 a、b来区分同一个表的不同引用常用于树形结构数据如组织结构、分类层级七、交叉连接查询CROSS JOIN7.1 概念交叉连接返回两个表的笛卡尔积即第一个表的每一行与第二个表的每一行组合。结果行数 表1行数 × 表2行数。7.2 语法格式-- 显式语法SELECT字段列表FROM表1CROSSJOIN表2-- 隐式语法不推荐SELECT字段列表FROM表1,表27.3 示例-- 查询所有学生与所有课程的组合生成选课可能性SELECTStudentName,CourseNameFROMStudentsCROSSJOINCourses7.4 注意事项交叉连接会产生大量数据使用时需谨慎实际应用中通常与 WHERE 条件结合使用过滤掉不需要的组合隐式语法逗号分隔容易出错推荐使用显式CROSS JOIN八、各种连接方式对比连接类型语法返回结果表顺序影响内连接INNER JOIN两个表的公共部分交集无影响左外连接LEFT OUTER JOIN左表全部 右表匹配部分有影响右外连接RIGHT OUTER JOIN右表全部 左表匹配部分有影响全连接FULL OUTER JOIN两个表的所有记录并集无影响自连接JOIN 表名 AS 别名同一表内的关联数据无影响交叉连接CROSS JOIN两个表的笛卡尔积无影响九、第三方工具SQLHelper9.1 SqlHelper 简介SqlHelper 是基于 .NET Framework 开发的数据库操作组件通过封装 ADO.NET 对象简化数据库访问流程。9.2 核心方法方法功能返回值ExecuteNonQuery执行增删改操作影响行数intExecuteReader执行查询返回数据阅读器SqlDataReaderExecuteDataset执行查询返回数据集DataSetExecuteScalar执行查询返回单行单列object9.3 多表查询示例/// summary/// 使用SqlHelper执行多表内连接查询/// /summary/// param nameconnectionString数据库连接字符串/param/// returns包含查询结果的DataSet/returnspublicstaticDataSetGetStudentScoreWithClass(stringconnectionString){stringsqlSELECT 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 nameconnectionString数据库连接字符串/param/// returns包含查询结果的DataSet/returnspublicstaticDataSetGetAllMaleStudentScore(stringconnectionString){stringsqlSELECT 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(),StateSqlCommand执行SQL命令ExecuteNonQuery(),ExecuteReader(),ExecuteScalar()SqlDataReader读取数据只读向前Read(),GetString(),GetInt32()SqlDataAdapter填充数据集Fill(DataSet)DataSet内存中的数据库Tables[0],Tables[TableName]10.2 SqlCommand 返回三种数据类型影响行数cmd.ExecuteNonQuery()结果集cmd.ExecuteReader()一行一列cmd.ExecuteScalar()