基础查询-SQL和Ling相互化

简介: 基础查询-SQL和Ling相互化

SELECT


SELECT 语句用于从表中选取数据,是 SQL 最基本的操作之一。

通过 SELECT 查询的结果被存储在一个结果表中(称为结果集)。


SQL SELECT 语法


只查询某个列的数据:


SELECT [列名称] FROM [表名称]


查询所有列的数据


SELECT * FROM [表名称]


SQL


查询所有数据


SELECT * FROM categories


查询一列或多列


SELECT category_id,category_name FROM categories


查询表达式


var list = from categories in context.Categories
                       select new
                       {
                           categories.CategoryId,
                           categories.CategoryName
                       };
            var lists = from categories in context.Categories
                        select categories;


查询语句


var list = context.Categories.Select(categories =>
            new
            {
                categories.CategoryId,
                categories.CategoryName
            });
            var lists = context.Categories.Select(categories => categories);


SQL SELECT DISTINCT 语句


DISTINCT 可以去除查询结果集中完全相同的项,只有每一个列中每一个数据都相同,才能被认为是“完全相同”。

可在 categories 表中添加相同数据的项进行测试(除主键外相同)。


SQL


SELECT DISTINCT category_id,category_name FROM categories


查询表达式


var dislist = list.Distinct();
            var dislist2 = (from categories in context.Categories
                            select new
                            {
                                categories.CategoryId,
                                categories.CategoryName
                            }).Distinct();


查询语句


var dislist = list.Distinct();
            var dislist2 = context.Categories.Distinct().Select(categories =>
              new
              {
                  categories.CategoryId,
                  categories.CategoryName
              });


WHERE 和 操作符


用于条件筛选。


操作符 描述
= 等于
<> 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在某个范围内
LIKE 搜索某种模式


注释:在某些版本的 SQL 中,操作符 <> 可以写为 !=。


BETWEEN 和操作符


BETWEEN ... ANDBETWEEN ... OR

C# 中可以使用 &&||表示。


SQL


SELECT [列名称] FROM [表名称] WHERE [列] [运算符] [值]


SELECT
  category_id,
  category_name 
FROM
  categories 
WHERE
  BETWEEN category_id > 1 
  AND category_id < 5


查询表达式


var list3 = from categories in context.Categories
                        where categories.CategoryId > 1 && categories.CategoryId < 5
                        select categories;


查询语句


var list3 = context.Categories.Where(x => x.CategoryId > 1 && x.CategoryId < 5);


LIKE 和通配符


在 SQL 中,可使用以下通配符:


通配符 描述
% 替代一个或多个字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]或者[!charlist] 不在字符列中的任何单一字符


SQL


SELECT * FROM categories WHERE  category_name like 'B%'


查询表达式


var list4 = from categories in context.Categories
                        where categories.CategoryName.StartsWith("B")
                        select categories;


不能直接使用 %。


查询语句


var list4 = context.Categories.Where(x => x.CategoryName.StartsWith("B"));


Linq 只有 Startwith 、 Endwith 和 Contains,没有其它通配符。

而 EF中提供了 EF.Functions.Like() 来进行通配符操作。


例如:


var list5 = from categories in context.Categories
                        where EF.Functions.Like(categories.CategoryName,"B_")
                        select categories;


var list5 = context.Categories.Where(x => EF.Functions.Like(x.CategoryName, "B_"));


更多通配符操作,请自行了解 EF.Functions.Like()


ORDER BY 排序


SQL


SELECT * FROM categories ORDER BY category_id


C#


var list6 = (from categories in context.Categories
                         select categories).OrderBy(c => c.CategoryId);
            var list7 = from categories in context.Categories
                        orderby categories.CategoryId
                        select categories;


var list6 = context.Categories.OrderBy(x => x.CategoryId).ToList();
            var list7 = context.Categories.ToList().OrderBy(x=>x.CategoryId);


TOP

PostgreSQL 中没有 TOP,可以使用 OFFSET、LIMIT 代替。


SELECT select_list
    FROM table_expression
    [ ORDER BY ... ]
    [ LIMIT { number | ALL } ] [ OFFSET number ]


Top(5) 的表达


SELECT * FROM test ORDER BY test  LIMIT 5


或者


SELECT * FROM test OFFSET 0 LIMIT 5


一般与 Order by 一起使用


SELECT * FROM test ORDER BY test OFFSET 5 LIMIT 5


LIMIT ALL 的效果和省略LIMIT子句一样,例如下面的 SQL 或获取全部数据。


SELECT * FROM test LIMIT ALL   --等价 SELECT * FROM test


C#代码中,则相应使用 Take 、 Skip。


var list = (from c in context.UserRoles
                        select c).Skip(0).Take(5);


var list = context.UserRoles.Skip(0).Task(5);


例外:

T-SQL 中的 Top(1) ,在 PostgreSQL 中,可以表示


SELECT * FROM test LIMIT 1


而 C# 表示:


var list00 = (from c in context.UserRoles
                         select c).First();
            var list01 = (from c in context.UserRoles
                          select c).FirstOrDefault();
            var list02 = (from c in context.UserRoles
                          select c).Take(1);
            var list10 = context.UserRoles.First();
            var list11 = context.UserRoles.FirstOrDefault();
            var list12 = context.UserRoles.Take(1);


可以使用 First() 或 FirstOrDefault() 返回查询结果中的第一条数据,方法体中不加条件,相当于 Top(1)


TakeWhile 和 SkipWhile


TakeWhile

运行查询,直到某一条件成立才停止获取;即当条件成立时,才会停止。


SkipWhile

运行查询,直到某一条件成立才停止跳过;即当条件成立时,才会开始。


In

与 Where 一起使用,表示符合条件中的一个。


SELECT * FROM test WHERE test IN ('1','2')


SELECT * FROM test WHERE test NOT IN ('1','2')


C# 中用 Contains 表示


string[] item = new string[] { "a","b","c"};
            var list = from c in context.UserRoles
                       where item.Contains(c.RoleId)
                       select c;


var list2 = context.UserRoles.Where(x => item.Contains(x.RoleId));


Alias(as)


SQL 中,可以给查询的列设置别名,例如


SELECT test as ttttt FROM test


C#中,应该无直接如此的操作。

不过,很多操作形式最后生成的 SQL 都会出现 AS。


EXISTS 和 NOT EXISTS


SQL C#
IN Contains
EXISTS Any
NOT EXISTS All


EXISTS


判断子查询中是否有结果集返回,如果有即为 TRUE。

子查询中应当有 where 等条件


SELECT * FROM test EXISTS ({子查询})


EXISTS 并不关注 子查询中返回了什么、返回了多少结果集,它只判断有没有结果返回(查询返回的结果集,行数>0)。


例如


SELECT * FROM test EXISTS (SELECT 1 FROM test where test == "a")


C#

使用 .Any()


var list = from s in context.UserRoles
                       where (from c in context.UserRoles
                              select c).Any()
                       select s;


var list2 = context.UserRoles.Where(x => context.UserRoles.Any());


Any() 中也可以加条件


var list = from s in context.UserRoles
                       where (from c in context.UserRoles
                              select c).Any(x => x.RoleId != "x")
                       select s;


var list2 = context.UserRoles.Where(x => context.UserRoles.Any(x => x.RoleId != "x"));


NOT EXISTS


无结果集返回则为,没有返回则为 TRUE。

子查询中应当有 where 等条件判断。


Linq 的 拓展方法 All,表示每一个元素是否都符合条件。返回 Bool。。


var list = from s in context.UserRoles
                       where context.UserRoles.All(x=>x.RoleId=="a")
                       select s;


var list2 = context.UserRoles.Where(x => context.UserRoles.All(x => x.RoleId == "x"));


In 比 EXISTS 的速度快。

相关文章
|
4月前
|
SQL 数据挖掘 数据库
第三篇:高级 SQL 查询与多表操作
本文深入讲解高级SQL查询技巧,涵盖多表JOIN操作、聚合函数、分组查询、子查询及视图索引等内容。适合已掌握基础SQL的学习者,通过实例解析INNER/LEFT/RIGHT/FULL JOIN用法,以及COUNT/SUM/AVG等聚合函数的应用。同时探讨复杂WHERE条件、子查询嵌套,并介绍视图简化查询与索引优化性能的方法。最后提供实践建议与学习资源,助你提升SQL技能以应对实际数据处理需求。
289 1
|
6月前
|
SQL 运维 监控
SQL查询太慢?实战讲解YashanDB SQL调优思路
本文是Meetup第十期“调优实战专场”的第二篇技术文章,上一篇《高效查询秘诀,解码YashanDB优化器分组查询优化手段》中,我们揭秘了YashanDB分组查询优化秘诀,本文将通过一个案例,助你快速上手YashanDB慢日志功能,精准定位“慢SQL”后进行优化。
|
1月前
|
SQL 人工智能 数据库
【三桥君】如何正确使用SQL查询语句:避免常见错误?
三桥君解析了SQL查询中的常见错误和正确用法。AI产品专家三桥君通过三个典型案例:1)属性重复比较错误,应使用IN而非AND;2)WHERE子句中非法使用聚合函数的错误,应改用HAVING;3)正确的分组查询示例。三桥君还介绍了学生、课程和选课三个关系模式,并分析了SQL查询中的属性比较、聚合函数使用和分组查询等关键概念。最后通过实战练习帮助读者巩固知识,强调掌握这些技巧对提升数据库查询效率的重要性。
84 0
|
6月前
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
2月前
|
SQL
SQL中如何删除指定查询出来的数据
SQL中如何删除指定查询出来的数据
|
4月前
|
SQL 关系型数据库 MySQL
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
凌晨2点报警群炸了:一条sql 执行200秒!搞定之后,我总结了一个慢SQL查询、定位分析解决的完整套路
|
3月前
|
SQL 存储 弹性计算
OSS Select 加速查询:10GB CSV 文件秒级过滤的 SQL 语法优化技巧
OSS Select 可直接在对象存储上执行 SQL 过滤,跳过文件下载,仅返回所需数据,性能比传统 ECS 方案提升 10~100 倍。通过减少返回列、使用等值查询、避免复杂函数、分区剪枝及压缩优化等技巧,可大幅降低扫描与传输量,显著提升查询效率并降低成本。
|
6月前
|
SQL 大数据 数据挖掘
玩转大数据:从零开始掌握SQL查询基础
玩转大数据:从零开始掌握SQL查询基础
255 35
|
6月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
6月前
|
SQL 缓存 关系型数据库
SQL为什么不建议执行多表关联查询
本文探讨了SQL中不建议执行多表关联查询的原因,特别是MySQL与PG在多表关联上的区别。MySQL仅支持嵌套循环连接,而不支持排序-合并连接和散列连接,因此在多表(超过3张)关联查询时效率较低。文章还分析了多表关联查询与多次单表查询的效率对比,指出将关联操作放在Service层处理的优势,包括减少数据库计算资源消耗、提高缓存效率、降低锁竞争以及更易于分布式扩展等。最后,通过实例展示了如何分解关联查询以优化性能。
222 0