SQL基礎(chǔ)查詢和LINQ集成化查詢
SELECT
SELECT 語句用于從表中選取數(shù)據(jù),是 SQL 最基本的操作之一。
通過 SELECT 查詢的結(jié)果被存儲(chǔ)在一個(gè)結(jié)果表中(稱為結(jié)果集)。
SQL SELECT 語法
只查詢某個(gè)列的數(shù)據(jù):
SELECT [列名稱] FROM [表名稱]
查詢所有列的數(shù)據(jù)
SELECT * FROM [表名稱]
SQL
查詢所有數(shù)據(jù)
SELECT * FROM categories
查詢一列或多列
SELECT category_id,category_name FROM categories
查詢表達(dá)式
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 可以去除查詢結(jié)果集中完全相同的項(xiàng),只有每一個(gè)列中每一個(gè)數(shù)據(jù)都相同,才能被認(rèn)為是“完全相同”。
可在 categories 表中添加相同數(shù)據(jù)的項(xiàng)進(jìn)行測試(除主鍵外相同)。
SQL
SELECT DISTINCT category_id,category_name FROM categories
查詢表達(dá)式
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 | 在某個(gè)范圍內(nèi) |
LIKE | 搜索某種模式 |
注釋:在某些版本的 SQL 中,操作符 <> 可以寫為 !=。
BETWEEN 和操作符
BETWEEN ... AND
或 BETWEEN ... OR
C# 中可以使用 &&
或 ||
表示。
SQL
SELECT [列名稱] FROM [表名稱] WHERE [列] [運(yùn)算符] [值]
SELECT category_id, category_name FROM categories WHERE BETWEEN category_id > 1 AND category_id < 5
查詢表達(dá)式
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 中,可使用以下通配符:
通配符 | 描述 |
---|---|
% | 替代一個(gè)或多個(gè)字符 |
_ | 僅替代一個(gè)字符 |
[charlist] | 字符列中的任何單一字符 |
[^charlist]或者[!charlist] | 不在字符列中的任何單一字符 |
SQL
SELECT * FROM categories WHERE category_name like 'B%'
查詢表達(dá)式
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()
來進(jìn)行通配符操作。
例如:
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_"));
更多通配符操作,請(qǐng)自行了解 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) 的表達(dá)
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 或獲取全部數(shù)據(jù)。
SELECT * FROM test LIMIT ALL --等價(jià) SELECT * FROM test
C#代碼中,則相應(yīng)使用 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() 返回查詢結(jié)果中的第一條數(shù)據(jù),方法體中不加條件,相當(dāng)于 Top(1)
。
TakeWhile 和 SkipWhile
TakeWhile
運(yùn)行查詢,直到某一條件成立才停止獲?。患串?dāng)條件成立時(shí),才會(huì)停止。
SkipWhile
運(yùn)行查詢,直到某一條件成立才停止跳過;即當(dāng)條件成立時(shí),才會(huì)開始。
In
與 Where 一起使用,表示符合條件中的一個(gè)。
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 中,可以給查詢的列設(shè)置別名,例如
SELECT test as ttttt FROM test
C#中,應(yīng)該無直接如此的操作。
不過,很多操作形式最后生成的 SQL 都會(huì)出現(xiàn) AS。
EXISTS 和 NOT EXISTS
SQL | C# |
---|---|
IN | Contains |
EXISTS | Any |
NOT EXISTS | All |
EXISTS
判斷子查詢中是否有結(jié)果集返回,如果有即為 TRUE。
子查詢中應(yīng)當(dāng)有 where 等條件
SELECT * FROM test EXISTS ({子查詢})
EXISTS 并不關(guān)注 子查詢中返回了什么、返回了多少結(jié)果集,它只判斷有沒有結(jié)果返回(查詢返回的結(jié)果集,行數(shù)>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
無結(jié)果集返回則為,沒有返回則為 TRUE。
子查詢中應(yīng)當(dāng)有 where 等條件判斷。
Linq 的 拓展方法 All,表示每一個(gè)元素是否都符合條件。返回 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 的速度快。
到此這篇關(guān)于SQL基礎(chǔ)查詢和LINQ集成化查詢的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SQL Server基礎(chǔ)之行數(shù)據(jù)轉(zhuǎn)換為列數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于SQL Server基礎(chǔ)之行數(shù)據(jù)轉(zhuǎn)換為列數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用SQL Server具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08SQLServer批量更新兩個(gè)關(guān)聯(lián)表數(shù)據(jù)的方法
這篇文章主要介紹了SQLServer批量更新兩個(gè)關(guān)聯(lián)表數(shù)據(jù)的方法,提供了2種關(guān)聯(lián)查詢與更新語句的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08SQL Server 數(shù)據(jù)庫中的收縮數(shù)據(jù)庫和文件操作
收縮數(shù)據(jù)文件通過將數(shù)據(jù)頁從文件末尾移動(dòng)到更靠近文件開頭的未占用的空間來恢復(fù)空間,在文件末尾創(chuàng)建足夠的空間后,可取消對(duì)文件末尾的數(shù)據(jù)頁的分配并將它們返回給文件系統(tǒng),本文給大家介紹SQL Server 數(shù)據(jù)庫中的收縮數(shù)據(jù)庫和文件的相關(guān)知識(shí),一起看看吧2023-07-07SqlServer存儲(chǔ)過程實(shí)現(xiàn)及拼接sql的注意點(diǎn)
這篇文章主要介紹了SqlServer存儲(chǔ)過程實(shí)現(xiàn)及拼接sql的注意點(diǎn)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07深入SQLServer中ISNULL與NULLIF的使用詳解
本篇文章是對(duì)SQLServer中ISNULL與NULLIF的使用進(jìn)行了詳細(xì)分析介紹,需要的朋友參考下2013-06-06