最近的工作遇到了连接查询,特在此记录,以免日后遗忘。以前学SQL连接查询的时候,通篇都是理论和数学公式,既抽象又不便于理解,因此我在这里以一个最通俗易懂的例子来说明。首先在SqlServer中建立两个表:TProvince和TCity,前者记录省,后者记录市,其数据如下所示:

Id   ProvinceName
1   浙江省
2   江苏省
3   安徽省
4   广东省
Id   CityName    ProvinceId
1   杭州市         1
2   湖州市         1
3   嘉兴市         1
4   南京市         2
5   苏州市         2
6   无锡市         2
7   合肥市         3
8   芜湖市         3
9   六安市         3
10  济南市         5

内连接

// 内连接
private void button1_Click(object sender, EventArgs e)
{string commandText = "select * from [TCity] inner join [TProvince] on [TCity].ProvinceId=[TProvince].Id";using (SqlDataAdapter adapter = new SqlDataAdapter(commandText, ConnectionString)){DataTable dataTable = new DataTable();adapter.Fill(dataTable);dataGridView1.DataSource = dataTable;}
}


从结果可以看出,内连接就是获取两张表能够对应上的数据,因此广东省和济南市这两条记录不会显示。

左连接

// 左连接
private void button2_Click(object sender, EventArgs e)
{string commandText = "select * from [TCity] left join [TProvince] on [TCity].ProvinceId=[TProvince].Id";using (SqlDataAdapter adapter = new SqlDataAdapter(commandText, ConnectionString)){DataTable dataTable = new DataTable();adapter.Fill(dataTable);dataGridView1.DataSource = dataTable;}
}


从结果可以看出,左连接确保了市的名称全部显示,但广东省由于没有对应的市,因此没有显示。因此左连接其实就是确保左边数据表记录的完整,右边则不去管它。

右连接

// 右连接
private void button3_Click(object sender, EventArgs e)
{string commandText = "select * from [TCity] right join [TProvince] on [TCity].ProvinceId=[TProvince].Id";using (SqlDataAdapter adapter = new SqlDataAdapter(commandText, ConnectionString)){DataTable dataTable = new DataTable();adapter.Fill(dataTable);dataGridView1.DataSource = dataTable;}
}


从结果可以看出,右连接确保了右边数据表的完整,而左边则不去管它。

全连接

// 全连接
private void button4_Click(object sender, EventArgs e)
{string commandText = "select * from [TCity] full join [TProvince] on [TCity].ProvinceId=[TProvince].Id";using (SqlDataAdapter adapter = new SqlDataAdapter(commandText, ConnectionString)){DataTable dataTable = new DataTable();adapter.Fill(dataTable);dataGridView1.DataSource = dataTable;}
}


从结果可以看出,全连接确保了左右两侧数据表的完整。

交叉连接

// 交叉连接
private void button5_Click(object sender, EventArgs e)
{string commandText = "select * from [TCity] cross join [TProvince]";using (SqlDataAdapter adapter = new SqlDataAdapter(commandText, ConnectionString)){DataTable dataTable = new DataTable();adapter.Fill(dataTable);dataGridView1.DataSource = dataTable;}
}


从结果可以看出,交叉连接就不管对应不对应了,它只是左边数据与右边数据的逐一匹配,也就是笛卡尔积。全部代码如下所示:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsFormsApplication2
{public partial class Form1 : Form{// 连接字符串private static string ConnectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString();// 构造函数public Form1(){InitializeComponent();}// 内连接private void button1_Click(object sender, EventArgs e){string commandText = "select * from [TCity] inner join [TProvince] on [TCity].ProvinceId=[TProvince].Id";using (SqlDataAdapter adapter = new SqlDataAdapter(commandText, ConnectionString)){DataTable dataTable = new DataTable();adapter.Fill(dataTable);dataGridView1.DataSource = dataTable;}}// 左连接private void button2_Click(object sender, EventArgs e){string commandText = "select * from [TCity] left join [TProvince] on [TCity].ProvinceId=[TProvince].Id";using (SqlDataAdapter adapter = new SqlDataAdapter(commandText, ConnectionString)){DataTable dataTable = new DataTable();adapter.Fill(dataTable);dataGridView1.DataSource = dataTable;}}// 右连接private void button3_Click(object sender, EventArgs e){string commandText = "select * from [TCity] right join [TProvince] on [TCity].ProvinceId=[TProvince].Id";using (SqlDataAdapter adapter = new SqlDataAdapter(commandText, ConnectionString)){DataTable dataTable = new DataTable();adapter.Fill(dataTable);dataGridView1.DataSource = dataTable;}}// 全连接private void button4_Click(object sender, EventArgs e){string commandText = "select * from [TCity] full join [TProvince] on [TCity].ProvinceId=[TProvince].Id";using (SqlDataAdapter adapter = new SqlDataAdapter(commandText, ConnectionString)){DataTable dataTable = new DataTable();adapter.Fill(dataTable);dataGridView1.DataSource = dataTable;}}// 交叉连接private void button5_Click(object sender, EventArgs e){string commandText = "select * from [TCity] cross join [TProvince]";using (SqlDataAdapter adapter = new SqlDataAdapter(commandText, ConnectionString)){DataTable dataTable = new DataTable();adapter.Fill(dataTable);dataGridView1.DataSource = dataTable;}}}
}

C#实现SqlServer连接查询相关推荐

  1. 连接查询 左连接 右连接 内连接 1112 sqlserver

    1112连接查询 内联连 关键词 inner join-on inner join...on 格式 表1 inner join 表2 on 表1.列 = 表2.列 表1 inner join 表2 o ...

  2. SQLServer学习笔记八:多表连接查询

    学习目标 掌握多表连接查询的概念 学会使用内连接查询数据 学会使用外连接查询数据 学会使用UNION合并查询结果 前面学习的内容都是基于单个数据库表的查询,下面将学习涉及多个表的数据查询. 多表连接查 ...

  3. SQL数据库语言基础之SqlServer多表连接查询与INNER JOIN内连接查询

    文章目录 一.简单连接查询 二.多表连接查询 三.INNER JOIN 内连接查询 一.简单连接查询 1.直接连接:无连接规则连接两表,得到的是两个表的笛卡尔积. 连接后的行数=表1行数*表2行数 连 ...

  4. SQLserver 外连接查询-左连接查询

    外连接包括 : (左外连接 右外连接 全连接 简称 为:左连接 右) 先上定义: /*左连接 left join on 返回左表的所有行,对应右表中数据有一对多的联系,则全部展示,右表中没有匹配 上 ...

  5. mysql join on 索引_连接查询,表关联查询join on,索引,触发器,视图

    一.连接查询 1.统计每一个部门的人数  "部门名,部门的人数" select department,count(eid) from employee group by depar ...

  6. SQLServer子查询相关知识笔记

    今天给大家介绍以下SQLServer子查询相关知识,希望对大家能有所帮助! 1.子查询概念介绍 子查询可以嵌套在SELECT.INSERT.UPDATE.DELETE语句或其他子查询语句中的查询,子查 ...

  7. Oracle、 Mysql 、 SQLserver 分页查询

    MYSQL 分页最简单了. SELECT * FROM Account  WHERE (usertype='base' or usertype='home' or usertype='salse')  ...

  8. sqlserver连接池及查看连接数相关

    sqlserver连接池及查看连接数相关 asp.net 连接池 数据库链接是一种危险的.昂贵的.有限的资源,特别是在多层Web应用程序中.你必须正确管理你的链接,因为你的方法将极大的影响应用程序的整 ...

  9. MySQL-数据操作-分组查询-连接查询-子查询-分页查询-联合查询

    文章目录 ==分组查询== 基础 案例 特点 分组查询中的筛选条件分为两类 注意事项 分组查询案例 案例 ==连接查询== 概述 ==sql92标准== 概述 等值连接 非等值连接 自连接 案例 == ...

最新文章

  1. mysql 锁机制 mvcc_轻松理解MYSQL MVCC 实现机制
  2. 【pmcaff】产品经理必知改善用户体验的基本方法
  3. vscode快捷键大全
  4. TiDB数据库备份恢复与数据迁移
  5. java ftp遍历所有子文件_Java 遍历指定文件夹及子文件夹下的文件
  6. Bootstrap3基础 warning/active... 表格的状态类(不同的背景色)
  7. 青蛙换位置excel_吃青蛙:如何在Excel中创建每日交付的sprint消耗图
  8. HDU-2082 找单词 母函数
  9. 记一次Mysql查询字段为空串在java中使用equals不相等的问题
  10. android 自定义字体_Android自定义字体教程
  11. verilog 简单module_HDLBits:在线学习 Verilog (二十九 · Problem 140-144)
  12. 在运行microsoft windows 非核版本的计算机上_系统版本决定获得Win10 2004与20H2版更新时间...
  13. Image Pyramids
  14. 网络安全渗透测试自学
  15. FlashFXP 连接centos
  16. LaTeX编写IEEE会议论文字体报错、且参考文献中会议/期刊的名字没有斜体的问题解决
  17. 互联网日报 | 微信聊天时可直接“搜一搜”了;蚂蚁集团9月18日科创板首发上会;谷歌正式发布安卓11系统...
  18. DP接口与HDMI接口的区别?
  19. Python values()函数用法
  20. unity 球体表面平均分割点

热门文章

  1. curl命令介绍与使用
  2. c# 开发winform控件
  3. CSS3-数据可视化
  4. springboot远程心电诊断系统毕业设计源码091759
  5. 通达信 c java,通达信的c
  6. 【强化学习】Q-Learning算法求解悬崖行走问题 + Python代码实战
  7. Axure AxureRP9 密钥
  8. 详解非局部均值滤波原理以及用MATLAB源码实现
  9. flask_restful中的输出域(Resource、fields、marshal、marshal_with)
  10. Android开发基础规范(二)