国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

讀《程序員的SQL金典》[1]--基礎數據檢索

2024-07-21 02:50:51
字體:
來源:轉載
供稿:網友
讀《程序員的SQL金典》[1]--基礎數據檢索

前言

《程序員的SQL金典》這本書是楊中科老師的,拜讀了一下,簡單做了讀書筆記供以后翻閱。僅供學習分享,要想細讀的話推薦購買原版呀!

這次讀書的時候用了新的辦法把看書計劃進行了量化,雖然簡單,發現還是有效果的。

image


1. Count(*)與Count(column)區別

Count(*)統計結果集總條數;

Count(column)統計結果集中column字段不為null的總條數。

2. 低效的where 1=1

為了實現動態拼接查詢條件的功能,有時我們會使用where 1=1這樣看似聰明的解決方案。但實際上會造成很大的性能損失,這個條件使得數據庫無法使用索引等優化查詢策略,數據庫會進行全表掃描。當數據量較大的時候查詢速度可能會變得很慢。(在SQL Server2012等數據庫中,對這種情況其實已經做了優化)

優化前:

PRivate static void CreateWhere(QueryParam param)        {    string where = " where 1=1 " ;    if (param != null )            {    if (param.Haspicture)                {                    where += " AND picture<>'' " ;                }    if (param.ClassId > 0)                {                    where += " AND ClassID=@classid " ;                }    if (param.AuthorId > 0)                {                    where += " AND UserId=@UserId";                }            }        }

可以改用下面的邏輯實現。

private static void CreateWhere1(QueryParam param)        {    StringBuilder where = new StringBuilder( " where 1=1 ");    bool hasWhere = false ;    if (param != null )            {    if (param.HasPicture)                {                    hasWhere = AppendWhereIfNeed(where, hasWhere);                    where.AppendLine( "picture<>'' ");                }    if (param.ClassId > 0)                {                    hasWhere = AppendWhereIfNeed(where, hasWhere);                    where.AppendLine( "ClassID=@classid ");                }    if (param.AuthorId > 0)                {                    hasWhere = AppendWhereIfNeed(where, hasWhere);                    where.AppendLine( "UserId=@UserId");                }            }        }    private static bool AppendWhereIfNeed( StringBuilder where, bool hasWhere)        {    if (hasWhere)            {                where.Append( " and ");            }            else            {                where.Append( " where ");            }    return true ;        }
3.Group By分組

分組查詢時,所有SELECT語句中出現的列必須出現在Group By子句中(聚合函數除外。)

實例:

①錯誤

SELECT FAge ,FSalary FROM T_Employee GROUP BY FAge

--選擇列表中的列 'T_Employee.FSalary' 無效,因為該列沒有包含在聚合函數或 GROUP BY 子句中。

②正確

SELECT FAge ,Max( FSalary) FROM T_Employee GROUP BY FAge

FAge (無列名)22 1200.0023 5000.0025 8300.0028 6200.00

4.Having 語句

①聚合函數不能出現在where語句中,此時可以使用having語句代替。

SELECT FAge , COUNT(*) AS CountOfThisAge FROM T_EmployeeGROUP BY FAge--WHERE COUNT(*)>1--錯誤HAVING COUNT (*)> 1--正確

②HAVING子句位置要在GROUP子句之后;

③HAVING子句也可以像where一樣使用較復雜的過濾條件

SELECT FAge ,COUNT(*) AS CountOfThisAge FROM T_EmployeeGROUP BY FAgeHAVING COUNT (FAge)= 1 OR COUNT(FAge )=2SELECT FAge ,COUNT(*) AS CountOfThisAge FROM T_EmployeeGROUP BY FAgeHAVING COUNT (FAge) IN(1 ,2)
5.ROW_NUMBER() OVER(排序規則)

ROW_NUMBER()函數可以計算數據的行號。但該函數不能放在WHERE子句中,如果想根據行號進行過濾可以使用子查詢來實現。

SELECT * FROM(SELECT ROW_NUMBER () OVER (ORDER BY FSalary DESC) num, FName,FSalaryFROM T_Employee) AWHERE A .num BETWEEN 1 AND 3
6.DISTINCT

DISTINCT是針對這個結果集取消重復的,而不是針對單個列。

7.字符串計算函數

LEN(string)可以計算字段的長度。

SELECT FName ,LEN( FName) AS NameLengthFROM T_EmployeeWHERE FName IS NOT NULL

SUBSTRING(str,start,length):

字符串截取函數。str表示原字符串,start為開始位置(從1開始計算),length為截取的長度。

SELECT FName ,SUBSTRING( FName,1 ,2) AS NameLengthFROM T_EmployeeWHERE FName IS NOT NULL

執行結果:

FName NameLengthTom ToJerry JeJane Ja

8.UNION

UNION可以進行結果集的合并。如果想合并之后自動去掉重復行,可以使用UNION ALL.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新安县| 高邑县| 阿克苏市| 潮州市| 武陟县| 黄浦区| 武隆县| 岳西县| 青川县| 大庆市| 许昌县| 丰原市| 东丰县| 安吉县| 准格尔旗| 东港市| 怀仁县| 叶城县| 河池市| 海兴县| 东莞市| 合肥市| 象州县| 彝良县| 临江市| 嘉善县| 建宁县| 都昌县| 广昌县| 太和县| 来安县| 获嘉县| 通辽市| 农安县| 辽阳县| 邛崃市| 志丹县| 兰溪市| 长泰县| 寿宁县| 凌海市|