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


Posted in MySQL onJanuary 18, 2022

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

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

到此这篇关于SQL基础查询和LINQ集成化查询的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

MySQL 相关文章推荐
MySQL InnoDB ReplicaSet(副本集)简单介绍
Apr 24 MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 MySQL
详解MySQL中的主键与事务
May 27 MySQL
MySQL连表查询分组去重的实现示例
Jul 01 MySQL
mysql配置SSL证书登录的实现
Sep 04 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
Feb 12 MySQL
MySQL高级进阶sql语句总结大全
Mar 16 MySQL
mysql性能优化以及配置连接参数设置
May 06 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
Jul 07 MySQL
SQLServer常见数学函数梳理总结
Aug 05 MySQL
MySQL常见优化方案汇总
Jan 18 #MySQL
mysql sum(if())和count(if())的用法说明
SQL语法CONSTRAINT约束操作详情
Jan 18 #MySQL
MySQL笔记 —SQL运算符
Jan 18 #MySQL
Mysql中一千万条数据怎么快速查询
Dec 06 #MySQL
Mysql中有关Datetime和Timestamp的使用总结
Dec 06 #MySQL
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
Dec 06 #MySQL
You might like
php json_encode值中大括号与花括号区别
2013/09/30 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
JS常用正则表达式总结
2013/11/12 Javascript
基于jquery的文字向上跑动类似跑马灯的效果
2014/09/22 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
canvas的神奇用法
2017/02/03 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
angular实现图片懒加载实例代码
2017/06/08 Javascript
微信小程序开发之实现自定义Toast弹框
2017/06/08 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
js实现上传并压缩图片效果
2018/01/10 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
[47:43]完美世界DOTA2联赛PWL S3 Magama vs GXR 第二场 12.19
2020/12/24 DOTA
[01:09:16]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第一场 1月25日
2021/03/11 DOTA
Python过滤列表用法实例分析
2016/04/29 Python
利用Python读取txt文档的方法讲解
2018/06/23 Python
Python实现KNN(K-近邻)算法的示例代码
2019/03/05 Python
python实现银行管理系统
2019/10/25 Python
Pytorch基本变量类型FloatTensor与Variable用法
2020/01/08 Python
python使用python-pptx删除ppt某页实例
2020/02/14 Python
波兰灯具、照明和LED购物网站:Lampy.pl
2019/03/11 全球购物
舞会礼服和舞会鞋:PromGirl
2019/04/22 全球购物
美国新娘礼品店:The Paisley Box
2020/09/08 全球购物
工商技校毕业生自荐信
2013/11/15 职场文书
争论的故事教学反思
2014/02/06 职场文书
乡镇八一建军节活动方案
2014/08/24 职场文书
“四风”问题整改措施和努力方向
2014/09/20 职场文书
行政司机岗位职责
2015/04/10 职场文书
Python Pandas常用函数方法总结
2021/06/15 Python