SQL基础查询和LINQ集成化查询

作者:痴者工良 时间:2024-01-18 21:51:47 

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 ... AND 或 BETWEEN ... 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

SQLC#
INContains
EXISTSAny
NOT EXISTSAll

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 的速度快。

来源:https://www.cnblogs.com/whuanle/p/11360160.html

标签:SQL,基础,LINQ,集成化,查询
0
投稿

猜你喜欢

  • python Selenium等待元素出现的具体方法

    2022-02-22 02:47:20
  • C#中通过使用Connection类来实现打开/关闭数据库的代码实例

    2024-01-21 22:36:55
  • 简单的PHP图片上传程序

    2024-05-22 10:06:54
  • oracle使用sql语句增加字段示例(sql删除字段语句)

    2024-01-22 03:22:39
  • 详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件

    2023-11-10 13:20:31
  • Pycharm2022最新版无法换源解决方法

    2023-02-09 20:51:55
  • Python Opencv图像处理基本操作代码详解

    2023-06-08 08:08:05
  • python递归函数求n的阶乘,优缺点及递归次数设置方式

    2022-12-08 16:17:08
  • 平面设计人员必读

    2008-07-16 11:58:00
  • Mysql调优Explain工具详解及实战演练(推荐)

    2024-01-13 07:46:43
  • 在sqlserver中如何使用CTE解决复杂查询问题

    2024-01-24 13:31:34
  • python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案

    2023-08-29 20:25:40
  • Go语言reflect.TypeOf()和reflect.Type通过反射获取类型信息

    2024-04-23 09:38:27
  • Python flask框架端口失效解决方案

    2021-02-19 23:48:46
  • 基于Python的微信机器人开发 微信登录和获取好友列表实现解析

    2021-09-14 17:03:46
  • Python实现Socket通信建立TCP反向连接

    2023-11-13 04:20:19
  • Python numpy 模块介绍

    2022-06-04 02:03:00
  • python 实现GUI(图形用户界面)编程详解

    2023-10-05 15:11:34
  • 用mysql做站点时怎样记录未知错误的发生

    2009-01-14 13:16:00
  • Vue.js实战之使用Vuex + axios发送请求详解

    2023-07-02 17:03:48
  • asp之家 网络编程 m.aspxhome.com