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数据库并展示在前端页面的实现代码
May 02 MySQL
MySQL 使用自定义变量进行查询优化
May 14 MySQL
MySQL5.7并行复制原理及实现
Jun 03 MySQL
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
Aug 23 MySQL
mysql 索引合并的使用
Aug 30 MySQL
MySQL中连接查询和子查询的问题
Sep 04 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
排查MySQL生产环境索引没有效果
Apr 11 MySQL
mysql 索引的数据结构为什么要采用B+树
Apr 26 MySQL
postgresql如何找到表中重复数据的行并删除
May 08 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
中英文字符串翻转函数
2008/12/09 PHP
PHP 日期时间函数的高级应用技巧
2009/10/10 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
PHP+Oracle本地开发环境搭建方法详解
2019/04/01 PHP
在第一个input框内输入内容.textarea自动得到第一个文件框的值的javascript代码
2007/04/20 Javascript
JavaScript中的Screen屏幕对象
2008/01/16 Javascript
Javascript select控件操作大全(新增、修改、删除、选中、清空、判断存在等)
2008/12/19 Javascript
JavaScript 开发中规范性的一点感想
2009/06/23 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
JS实现隔行换色的表格排序
2017/03/27 Javascript
JS兼容所有浏览器的DOMContentLoaded事件
2018/01/12 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
vue的滚动条插件实现代码
2019/09/07 Javascript
小程序input数据双向绑定实现方法
2019/10/17 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
python将字符串转换成数组的方法
2015/04/29 Python
python过滤字符串中不属于指定集合中字符的类实例
2015/06/30 Python
Python 的内置字符串方法小结
2016/03/15 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
python 利用jinja2模板生成html代码实例
2019/10/10 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
python实现简单的五子棋游戏
2020/09/01 Python
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
遇到的Mysql的面试题
2014/06/29 面试题
大学生村官工作感言
2014/01/10 职场文书
银行学习十八大感想
2014/01/11 职场文书
给公司的建议书范文
2014/05/13 职场文书
初中差生评语
2014/12/29 职场文书
周一早安温馨问候祝福语!
2019/07/15 职场文书
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android