读《程序员的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.00
23     5000.00
25     8300.00
28     6200.00

4.Having 语句

①聚合函数不能出现在where语句中,此时可以使用having语句代替。

复制代码
SELECT FAge , COUNT(*) AS CountOfThisAge FROM T_Employee

GROUP BY FAge

--WHERE COUNT(*)>1--错误

HAVING COUNT (*)> 1--正确
复制代码

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

③HAVING子句也可以像where一样使用较复杂的过滤条件

复制代码
SELECT FAge ,COUNT(*) AS CountOfThisAge FROM T_Employee

GROUP BY FAge

HAVING COUNT (FAge)= 1 OR COUNT(FAge )=2

SELECT FAge ,COUNT(*) AS CountOfThisAge FROM T_Employee

GROUP BY FAge

HAVING COUNT (FAge) IN(1 ,2)
复制代码

5.ROW_NUMBER() OVER(排序规则)

ROW_NUMBER()函数可以计算数据的行号。但该函数不能放在WHERE子句中,如果想根据行号进行过滤可以使用子查询来实现。

复制代码
SELECT * FROM
(
SELECT ROW_NUMBER () OVER (ORDER BY FSalary DESC) num, FName,FSalary
FROM T_Employee
) A
WHERE A .num BETWEEN 1 AND 3
复制代码

6.DISTINCT

DISTINCT是针对这个结果集取消重复的,而不是针对单个列。

7.字符串计算函数

LEN(string)可以计算字段的长度。

SELECT FName ,LEN( FName) AS NameLength
FROM T_Employee
WHERE FName IS NOT NULL

SUBSTRING(str,start,length):

字符串截取函数。str表示原字符串,start为开始位置(从1开始计算),length为截取的长度。

SELECT FName ,SUBSTRING( FName,1 ,2) AS NameLength
FROM T_Employee
WHERE FName IS NOT NULL

执行结果:

FName     NameLength
Tom     To
Jerry     Je
Jane     Ja

8.UNION

UNION可以进行结果集的合并。如果想合并之后自动去掉重复行,可以使用UNION ALL.




    本文转自 陈敬(Cathy) 博客园博客,原文链接:http://www.cnblogs.com/janes/p/3573923.html,如需转载请自行联系原作者



相关文章
|
5月前
|
SQL 关系型数据库 MySQL
【MySQL入门到精通-黑马程序员】MySQL基础篇-SQL概述及DDL
(精度指数的所有位数;标度指小数点后数的位数) 字符串类型
62 0
|
6月前
|
SQL 分布式计算 大数据
黑马程序员-大数据入门到实战-分布式SQL计算 Hive 入门
黑马程序员-大数据入门到实战-分布式SQL计算 Hive 入门
73 0
|
7月前
|
SQL 程序员 开发工具
让程序员长期用眼无忧!NineData SQL 窗口现已支持深色模式
NineData SQL开发工具现已支持深色模式,为用户提供更舒适的使用体验。长时间暴露在明亮屏幕下容易引发眼睛疲劳和不适,而深色模式通过降低屏幕亮度减轻了眼睛的负担。此外,深色模式还能节省能源、改善低光环境,并适用于开发人员、夜间工作者和移动设备用户等不同群体。您可以在NineData SQL窗口中尝试深色模式,享受更加舒适和愉悦的使用体验。
68 1
|
SQL JavaScript 小程序
公司25k招了一个程序员不会优化慢SQL,试用期没过就被开了!
公司25k招了一个程序员不会优化慢SQL,试用期没过就被开了!
|
SQL 数据库
基础SQL——DDL
基础SQL——DDL
82 0
基础SQL——DDL
|
SQL Java Maven
【Flink】小白级入门,Flink sql 的基础用法(下)
【Flink】小白级入门,Flink sql 的基础用法
298 0
|
SQL Java 大数据
【Flink】小白级入门,Flink sql 的基础用法(上)
【Flink】小白级入门,Flink sql 的基础用法
385 0
Java程序员最容易犯的十大SQL错误,你犯过几次?
前言 Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美地将两者结合起来完全得依靠编程人员的水准: 技能:任何人都能容易学会命令式编程 模式:有些人用“模式-模式”,举个例子,模式可以应用到任何地方,而且都可以归为某一类模式 心境:首先,要写个好的面向对象程序是比命令式程序难得多,你得花费一些功夫 但当Java程序员写SQL语句时,一切都不一样了。SQL是说明性语言而非面向对象或是命令式编程语言。在SQL中要写个查询语句是很简单的。但在Java里类似的语句却不容易,因为程序员不仅要反复考虑编程范式,而且也要考虑算法的问题。 下面是Java程序员在写SQL时常犯的10个错误
|
SQL Oracle 关系型数据库
数据库基础认识概述课堂笔记【数据库SQL基础学习笔记2020课堂版01】
数据库基础认识概述课堂笔记【数据库SQL基础学习笔记2020课堂版01】
110 0
数据库基础认识概述课堂笔记【数据库SQL基础学习笔记2020课堂版01】
|
SQL 存储 关系型数据库
MySQL基本的SELECT语句,SQL语言概述,基础和重要不冲突,完整详细可收藏
MySQL基本的SELECT语句,SQL语言概述,基础和重要不冲突,完整详细可收藏
158 0
MySQL基本的SELECT语句,SQL语言概述,基础和重要不冲突,完整详细可收藏