基础知识(C#语法、数据库SQL Server)回顾与总结

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

前言

已经有大概一个多月没有更新博客,可能是开始变得有点懒散了吧,有时候想写,但是又需要额外投入更多的时间去学习,感觉精力完全不够用啊,所以为了弥补这一个多月的潜水,决定写一篇,衔接9月未写博客的空缺。

无需定义实体,返回object类型,如何获取属性值?

这样的场景在下拉列表中很常见,在下拉列表中我们只需要Id和Name两个字段,无需其他字段,同时也是为了节约流量,例如实体和数据如下:

复制代码
    public class Department
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime CreatedTime { get; set; }
        public string Contact { get; set; }
        public string ContactUser { get; set; }
    }
复制代码
复制代码
            var deparments = new List<Department>()
            {
                new Department(){ Id=1,Name="department1",CreatedTime=DateTime.Now,Contact="13682687787",ContactUser="Tom"},
                new Department(){ Id=2,Name="department2",CreatedTime=DateTime.Now,Contact="13682687788",ContactUser="Jeffcky"},
                new Department(){ Id=3,Name="department3",CreatedTime=DateTime.Now,Contact="13682687783",ContactUser="Lily"},
                new Department(){ Id=4,Name="department4",CreatedTime=DateTime.Now,Contact="13682687782",ContactUser="Jim"},
                new Department(){ Id=5,Name="department5",CreatedTime=DateTime.Now,Contact="13682687781",ContactUser="Allen"},
            };
复制代码

此时为了再额外定义另外的实体,我们通过匿名类型来进行转换

复制代码
        static IEnumerable<object> Change(List<Department> departments)
        {
            var changeDepartments = departments.Select(d => new
            {
                id = d.Id,
                name = d.Name
            });
            return changeDepartments;
        }
复制代码

将上述集合传入到该Change方法中则返回集合中包含id和name的列,这样在下拉列表就能很好的显示,但是如果用户选择了所在部门,下一次再次进行编辑时需要在该转换集合中得到用户的id和name,此时集合返回类型为object,我们如何得到其中的属性id和用户id进行比对呢,我们来看看以下两种方法。

反射

反射应该是我们首先能够想到的方式了,获取该实体类型的属性并获取其值。例如我们要在上述Change方法返回的集合中获取到id=1的对象,我们通过如下反射来获取。

  var changes = Change(deparments);

  var specialDepartment = changes.FirstOrDefault(d => Convert.ToInt32(d.GetType().GetProperty("id").GetValue(d)) == 1);

dynamic关键字 

上述实现是最原始的方式,当dynamic关键字出世之后,我们可以直接将集合中的object类型转换为dynamic动态对象,在运行时让编译器自己去计算,如此一来上述的实现可以更加简洁实现。

           var changes = Change(deparments);

            var specialDepartment = changes.FirstOrDefault(d => ((dynamic)d).id == 1);

虽然上述利用dynamic关键字实现看似很简洁但是也有其缺点,类似于JavaScript中动态类型,它是区分大小写的,要是我们将id写成Id直接抛出异常,如下:

  var specialDepartment = changes.FirstOrDefault(d => ((dynamic)d).Id == 1);

 

为了这样避免出错,而且我们还是需要有智能提示,那就老老实实写一个专门针对下拉列表的转换类,也未尝不可。

    public class SelectItem
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

数据排名

排名这个也是常见不能再常见的场景了,例如在微信运动中就有截止到每天到十点每天所走步数好友的排名,场景有几种对应的实现方式也有几种,我们来看看。建立如下简单示例表。

不同等分数排名

不同等分数即分数都不一样,如下

首先我们利用Row_Number()函数来实现排名。

SELECT UserId,Score,
    ROW_NUMBER() OVER(ORDER BY Score DESC) AS [Rank]
FROM dbo.Ranks

这样我们就可以获取到某个用户所在排名为多少,这只是针对没有同样的分数而言,要是分数有一样的呢,Row_Number函数还适用?

同等分数并列排名

我们将数据修改成如下:

再来利用Row_Number来进行排名。

此时分数同样为90则排名一个为第三名,另个却为第四名,用户表示我不服,分数不一样,而且没有其他维度的判断逻辑,怎么我就变成第四名了呢,不应该是并列第三名么。这是程序员小哥的bug。我不听,我不听。下面再来设计一个课程得分的表ExamResult。

并列分数排名又分为两种场景,比如上述学生Sam的数学和科学都是为90,则并列第一名,到了社会这门学科是第三名,还是第二名呢,这就看实际应用场景,若是第三名我们就需要用RANK函数来排名。

复制代码
SELECT  Name ,
        Subject ,
        Marks ,
        RANK() OVER (PARTITION BY name ORDER BY Marks DESC ) Rank
FROM    ExamResult
ORDER BY name ,
        subject
复制代码

若是没有空缺排名则利用DENSE_RANK函数来实现。

复制代码
SELECT  Name ,
        Subject ,
        Marks ,
        DENSE_RANK() OVER ( PARTITION BY name ORDER BY Marks DESC ) Rank
FROM    ExamResult
ORDER BY name
复制代码

由上我们知道关于SQL Server中RANK和DENSE_RANK函数的区别在于DENSE_RANK函数没有排名空缺。在大部分场景下都需要考虑并列排名的情况,其ROW_NUMBER函数不再适用,除非明确知道排名中不会存在分数并列的情况,否则谨慎适用。

删除数据重复

如果数据库表设计不够合理,或者说出现并发很容易导致插入重复情况,此时我们去尝试删除数据重复的表。我们首先创建如下测试表。

复制代码
 CREATE TABLE DuplicateRows
    (
      Id INT ,
      Name VARCHAR(20)
    )
    
 INSERT INTO DuplicateRows
 VALUES ( 1, 'Andy' )
 INSERT INTO DuplicateRows
 VALUES ( 1, 'Andy' )
 INSERT INTO DuplicateRows
 VALUES ( 2, 'Bill' )
 INSERT INTO DuplicateRows
 VALUES ( 2, 'Bill' )
 INSERT INTO DuplicateRows
 VALUES ( 2, 'Bill' )
 INSERT INTO DuplicateRows
 VALUES ( 3, 'Chris' )
复制代码

 

我们看到如上数据Name为Andy的数据重复两次,同时Name为Bill的数据重复三次。关于数据重复删除方式总结起来有四种方式,我们一起来总结下。

借助临时表(方式一)

复制代码
SELECT DISTINCT
        *
INTO    #tmp
FROM    [dbo].[DuplicateRows]
DELETE  FROM [dbo].[DuplicateRows]
INSERT  INTO [dbo].[DuplicateRows]
        SELECT  *
        FROM    #tmp
DROP TABLE #tmp
复制代码

上述逻辑很简单,我们查询出不重复的删除并插入到临时表中,然后删除表中数据将临时表中不重复的数据插入到表中即可。

RANK() OVER( PARTITION BY)(方式二) 

上述是最简单的方式,若是我们表中有一列和另外一行列不同,此时利用DISTINCT关键字过滤数据将不再起作用。在这种情况下,我们可以添加一列,作为行唯一标识符(自动递增升序)。然后获取每个Id的名称。 如果Rank大于1,则表示它是重复行然后删除。 删除重复的行后,删除唯一列标识。 如下:

添加唯一标识列且自增长。

  ALTER TABLE [dbo].[DuplicateRows] ADD  sNo INT IDENTITY(1,1)

利用RANK函数对名称进行分区并进行sNo排序。

  SELECT    * ,
            RANK() OVER ( PARTITION BY Id, Name ORDER BY sNo ) [rank]
  FROM      [dbo].[DuplicateRows]
 

此时再删除rank大于1即重复的数据。

复制代码
 DELETE E
 FROM   [dbo].[DuplicateRows] E
        INNER JOIN ( SELECT * ,
                            RANK() OVER ( PARTITION BY Id, Name ORDER BY sNo DESC ) [rank]
                     FROM   [dbo].[DuplicateRows]
                   ) T ON E.sno = t.sno
 WHERE  T.[rank] > 1
复制代码

最后删除唯一标识列sNo.

 ALTER TABLE [dbo].[DuplicateRows] 
 DROP  COLUMN sNo

完整代码如下:

复制代码
  ALTER TABLE [dbo].[DuplicateRows] ADD  sNo INT IDENTITY(1,1)

  DELETE    E
  FROM      [dbo].[DuplicateRows] E
            INNER JOIN ( SELECT * ,
                                RANK() OVER ( PARTITION BY Id, Name ORDER BY sNo DESC ) [rank]
                         FROM   [dbo].[DuplicateRows]
                       ) T ON E.sno = t.sno
  WHERE     T.[rank] > 1

  ALTER TABLE [dbo].[DuplicateRows] 
  DROP  COLUMN sNo
复制代码

 DELELTE TOP(2)(方式三)

如果我们想删除特定重复的数据,通过DELETE TOP语句来完成,例如删除上述id = 2的重复数据。

 DELETE TOP ( 2 )
 FROM   [dbo].[DuplicateRows]
 WHERE  Id = 2

HAVING COUNT(*) >1(方式四)

如果我们需要将所有重复的数据都删除,只保留未被删除的数据,利用HAVING COUNT(*) >1完成,若是查询到重复个数大于1则删除。

   DELETE   FROM [dbo].[DuplicateRows]
   WHERE    Id IN ( SELECT  Id
                    FROM    [dbo].[DuplicateRows]
                    GROUP BY Id
                    HAVING  COUNT(*) > 1 )

上述讲到了删除数据重复的四种方式,若是需要查询并过滤数据重复情况,举一反三同样大部分也适用。

总结

本节讲述一点基础知识,回顾了一下,十一期间有时间会讲讲vue。see u.








本文转自Jeffcky博客园博客,原文链接:http://www.cnblogs.com/CreateMyself/p/7524227.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
4天前
|
人工智能 运维 关系型数据库
|
11天前
|
SQL 关系型数据库 MySQL
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL 数据库 SQL 语句调优方法详解(2-1)
本文深入介绍 MySQL 数据库 SQL 语句调优方法。涵盖分析查询执行计划,如使用 EXPLAIN 命令及理解关键指标;优化查询语句结构,包括避免子查询、减少函数使用、合理用索引列及避免 “OR”。还介绍了索引类型知识,如 B 树索引、哈希索引等。结合与 MySQL 数据库课程设计相关文章,强调 SQL 语句调优重要性。为提升数据库性能提供实用方法,适合数据库管理员和开发人员。
|
1月前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
51 16
|
1月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
3月前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
|
2月前
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
114 9
|
3月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
344 6
|
4月前
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
4月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
125 11
|
4月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。

热门文章

最新文章

下一篇
oss创建bucket