• SQL Server 2005技术内幕:查询、调整和优化5——用C#实现SQL查询


    前面几篇文章作为自己的读书笔记(SQL Server 2005技术内幕:查询、调整和优化),基本都是书上的内容,没敢放在首页上。现在学习SQL Server都是理论知识,自己有个习惯,一直看理论看下去不容易吸收,所以看到“聚合”这一节决定写写代码,用来加深对SQL Server执行计划的理解。

    首先看看我在在SQL Server中是怎么处理连接查询和分组查询的。

    代码
    --建表
    if OBJECT_ID('tableA'is not null
       
    drop table tableA
    Create table tableA(
       ID 
    int identity primary key,
       Name 
    varchar(30)
    )
     
    if OBJECT_ID('tableB'is not null
       
    drop table tableB
    Create table tableB(
       ID 
    int,
       summary 
    varchar(30)
    )
     
    --插入测试数据
    insert into tableA(Name) select 'A' union all select 'B' union all select 'C'
    insert into tableB(ID, summary)
       
    select 1'test-001' union all
       
    select 1'test-002' union all
       
    select 3'test-001' union all
       
    select 4'test-001'
     
     
    --左连接查询
    select A.ID, A.Name, B.summary from tableA A left join tableB B on(A.ID = B.ID)
     
    --根据ID分组查询
    select ID, COUNT(1number from tableB group by ID
     

    上面一段SQL非常简单,创建了两张表,TableATableB,字典非常简单,TableBIDTableA的外键,这里没有主动建立外键关系。插入几条测试数据,其中实现左连接和分组查询结果如下:


    下面我们用C#代码是连接查询和分组功能:

    代码
            class TableA
            {
                
    public int ID { getset; }
                
    public Char Name { getset; }
            }
     
            
    class TableB
            {
                
    public int ID { getset; }
                
    public String summary { getset; }
            }

     

    第一部创建两个实体类与SQL Server中两个实体相对应,然后插入测试数据:

     

           代码

     private IList<TableA> tableA = null;
            
    private IList<TableB> tableB = null;
     
            
    public SQLQuery()
            {
                tableA 
    = new List<TableA>()
                {
                    
    new TableA(){ID=1, Name = 'A'},
                    
    new TableA(){ID=2, Name = 'B'},
                    
    new TableA(){ID=3, Name = 'C'}
                };
                tableB 
    = new List<TableB>()
                {
                    
    new TableB(){ID=1, summary = "test-001"},
                    
    new TableB(){ID=1, summary = "test-002"},
                    
    new TableB(){ID=3, summary = "test-001"},
                    
    new TableB(){ID=4, summary = "test-001"},
                };
            }

    实现连接查询的代码如下:

    代码
            /// <summary>
            
    /// 实现SQL中左连接的效果
            
    /// </summary>
            public void JoinQuery()
            {
                
    foreach (var item in tableA)
                {
                    
    foreach (var item2 in tableB)
                        
    if (item.ID == item2.ID)
                            Console.WriteLine(
    "ID: {0}; Name: {1}; Summary: {2}", item.ID, item.Name, item2.summary);
                    
    if ((from s in tableB where s.ID == item.ID select s).Count() == 0)
                        Console.WriteLine(
    "ID: {0}; Name: {1}; Summary: {2}", item.ID, item.Name, null);
                }
            }

    嵌套循环中的两个集合tableAtableB是数据库中两个表,第二循环中比对连接键,相同则输出,第一个循环中最后的那个if用来检查tableB集合中是存在引用tableA的当前ID,如果没有输出一行有IDSummarynull的记录,这里是左连接的特例,如果是普通的内连接,这一行可以去掉。

     

    实现分组查询的代码如下:

    代码
    /// <summary>
            
    /// 分组查询
            
    /// </summary>
            public void GroupByQuery()
            {
                
    int[] ID = (from s in tableB group tableB by s.ID into groupKey select groupKey.Key).ToArray();
                
    int IDIndex = 0;
                
    int count = 0;
                
    foreach (var item in tableB)
                {
                    
    if (ID[IDIndex] != item.ID)
                    {
                        Console.WriteLine(
    "ID: {0}; Number: {1}", ID[IDIndex], count);
                        count 
    = 0;
                        IDIndex
    ++;

                        
    if (ID[IDIndex] == item.ID)
                            count
    ++;

                    }
                    
    else
                        count
    ++;

                }
                Console.WriteLine(
    "ID: {0}; Number: {1}", ID[IDIndex], count);
            }

    这段代码开始对分组键进行去重,这点可以参考我的上篇文章,采用是的流聚合,这里不多加解释。变量IDIndex是用来获取当前ID的索引,Count计算分组情况,也是我们分组查询的目的所在。这里的算法可能有问题,有重复的地方,但功能实现,那位大侠有兴趣可以帮忙改改。

    小弟初学SQL Server,之前对数据库的理解仅限于CRUD,这是第一次写文章,写得不对或不好的地方大家帮忙指点下!

     

  • 相关阅读:
    Mybatis 动态sql(转载)
    mapper映射文件配置之select、resultMap(转载)
    mapper映射文件配置之insert、update、delete(转载)
    MyBatis主配置文件(转载)
    函数装饰器和闭包(二)
    函数装饰器和闭包(一)
    指针的指针(二)
    指针的指针(一)
    Makefile基础(三)
    Python之多线程与多进程(二)
  • 原文地址:https://www.cnblogs.com/fengxiang/p/1818386.html
Copyright © 2020-2023  润新知