欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SQL基础知识点总结

程序员文章站 2022-06-01 22:02:32
...
  1. order by 默认是升序

  2. count(*) count(字段)两者的区别就在于count函数不统计null

  3. 通配符过滤使用LIKE关键字是一个二元操作符,左表达式为待匹配字段,右表达式为待匹配的通配符表达式表达式由通配符和普通字符组成

    (1)单字符匹配:_ 单字符匹配在通配符表达式中可以出现多次 如: __b_d

    (2)多字符匹配:% 匹配任意次数(零或任意)

                           (_与%可以配合使用)
    

    (3)集合匹配:[] 方括号中包含一个字符集,匹配与字符集中任意一个字符相匹配的字符

                      '^':否定符来读集合取反 例: [^bt]%
    
                      集合匹配只适用于SqlServer,其他数据库可通过变通实现
    

    总结: 通配符过滤很强大,不过在检索数据是会进行全表扫描,所以速度非常慢,因此不要过分使用通配符过滤,在使用其他方式可以实现效果的时候就应该避免通配符过滤

4.空值检测使用 IS NULL 关键字 语法: “待检测字段 IS NULL” 不为空则使用IS NOT NULL 语法: “待检测字段 IS NOT NULL”

5.反义运算符 != 不等于 !< 不小于 !> 不大于 不过只支持SQLserver和DB2

对应

同义运算符 比如 “不大于"的同义词是"小于等于” 而"不小于"的同义词是"大于等于"同时SQL提供了通用的表示“不等于”的运算符“<>”,这样“不等于”、“不大于”和“不 小于”就分别可以表示成“<>”、“<=”和“>=”

6.not 运算符用来将一个表达式的值取反 真=>假 假=>真 使用方式: not(表达式)

PS:       使用“!”运算符的方式由于只能运行在SQLServer和DB2两种数据库系统上,所以如果应用程序有移植到其他数据库系统上的需求的话,就应该避免使用这种方式;               使用同义运算符的方式能够运行在所有主流数据库系统上,不过由于粗心等原因,很容易将“不大于”表示成“<”,而忘记了“不大于”是包含“小于”和“等于”这两个意思的,这            样就会造成检索数据的错误,造成应用程序的Bug;而采用NOT运算符的方式能比较容易的表达要实现的需求,而且能够实现复杂的嵌套,最重要的是避免了潜在的应用            程序的Bug,所以除了“<>”这种方式之外,所以推荐使用NOT运算符的方式来表示“非”的语义。

7.(1)多值检测使用 in

(2)范围检测使用 between and 用来检测一个值是否处于某个范围中(包括范围的边界值,也就是闭区间)。使用方法如下“字段名BETTWEEN 左范围值AND 右范围值”,

PS:     数据库系统对“BETTWEEN AND”进行了查询优化,使用它进行范围值检测将会得到比其他方式更好的性能,因此在进行范围值检测的时候应该优先使“BETTWEEN               AND”。需要注意的就是“BETTWEEN AND”在进行检测的时候是包括了范围的边界值的(也就是闭区间),如果需要进行开区间或者半开半闭区间的范围值检测的话就必            须使用其他的解决方案了
  1.     where 1=1 一般用来动态拼接sql,这样很可能会造成非常大的性能损失,因为使用添加了“1=1”的过滤条件以后数据库系统就无法使用索引等查询优化策略,数据库系统将        *对每行数据进行扫描(也就是全表扫描)以比较此行是否满足过滤条件,当表中数据量比较大的时候查询速度会非常慢。因此如果数据检索对性能有比较高的要求就不       要使用这种“简便”的方式。
    
  2. GROUP BY

    (1) 数据分组 group by 常常伴随聚合函数一起使用,gorup by子句负责将数据分成逻辑组,聚合还是这对每一个组进行统计计算,需要分组的所有列必须位于group by子句的 列名列表中没有出现在group by子句中的列(聚合函数除外)是不能放到select语句后的列名列表中的group by子句可以指定多个列,用逗号隔开即可,系统会按照分组顺序来逐 层分组,实现组中组的效果

    (2) having语句用于对分组进行过滤, 聚合函数不能在where语句中使用,必须使用having子句来代替

             having语句也可以像where语句一样使用复杂的过滤条件,特别注意having语句中不能包含未分组的列名
    
  3. row_number()函数可以计算每一行数据在结果集中的行号(从1开始计数) 语法: row_number() over(排序规则)

    开窗函数只能出现在 select 或 order by 子句中

  4. 抑制重复数据: distinct 所有数据库都支持的关键字

                         distinct是对整个数据集进行数据重复抑制的,而不是针对每一个列
    
  5. 数据处理函数

    (1)计算字符串长度的函数 LEN() MSSQL LENGTH() MYSQL,Oracle,DB2

    (2)取得字符串的子串的函数 SUBSTRING(1,2,3) MSSQL MYSQL SUBSTR(1,2,3) Oracle DB2 第一个参数为要取的主字符串 第二个参数为字串的起始位置 第三参数为字 串的长度

    PS:多个函数可以嵌套使用

    (3)SIN() 正弦函数 ABS() 绝对值函数

    (4) 字符串拼接函数 CONCAT() 支持一个或者多个参数 MSSQL与MYSQL不同 MSSQL可以直接使用"+“来拼接字符串,Oracle使用”||“进行字符串拼接使用方式和MSSQL 中的”+"一样,也支持CONCAT()函数,但是只支持两个参数,不支持两个以上字符串的拼接,进行多个字符串拼接时可以使用函数嵌套

  6. 计算字段的用途:不仅能在SELECT中使用计算字段可以在进行数据过滤,删除,更新的时候使用计算字段

  7. 联合结果集:UNION可以连接多个结果集,就像"+"可以连接多个数字一样简单,只要在每个结果集之间加入UNION即可

    联合结果集的原则:

    不必受被联合的多个结果集之间的关系限制,使用UNION有两个基本原则要遵守:

    (1)每个结果集必须有相同的列数

    (2)每个结果集的列必须类型相容

    UNION和UNION ALL的区别:

    UNION 会将完全重复的数据合并为一条,如果联合结果集中返回所有数据而不管他们是否唯一,可以使用UNION ALL联合结果集在制作报表的时候经常用到

  8. 函数部分

    日期时间函数: 数据库中的日期时间数据类型分为日期,时间,日期时间以及时间戳四种类型

                             1.日期类型用来表示"年-月-日"信息的数据类型,精确到"日" 一般用Date来表示日期类型
    
                             2.时间类型用来表示"小时:分:秒"信息的数据类型,精确到"秒"一般用Time表示时间类型
    
                             3.日期时间类型用来表示"年-月-日 小时:分:秒"信息的数据类型,精确到秒,一般用DateTime来表示日期时间类型
    
                             4.时间戳类型一般用TimeStamp来表示
    
    PS:    不同的数据库系统对日期、时间、日期时间与时间戳等数据类型的支持差异性非常大,有的数据类型在有的数据库系统中不被支持,而有的数据类型的表示精度则                和其类型名称所暗示的精度不同,比如MSSQLServer 中不支持Time 类型、Oracle 中的Date 类型中包含时间信息。数据库中的日期时间函数对这些类型的支持差别是               非常小的,因此在一般情况下我们将这些类型统一称为“日期时间类型”
    

    GETDATE() 获取当前日期时间的函数

    DATEADD() 用于进行日期时间的加法运算 DATEADD (datepart , number, date )

                        datepart取值: year(年份) quarter(季度) month(月份) dayofyear(当年度的第几天) day(日) week(当年度的第几天) weekday(星期几) hour(小时) minute(分)                               second(秒) millisecond(毫秒)
    

    Oracle可以通过"+,-"来对时间进行赋值

    DATEDIFF(datepart,startdate,enddate) 计算日期差额 datepart为计算差额使用的单位

    DATENAME(datepart,date) 计算一个日期是星期几 datepart:要返回的日期部分的参数 如果使用Weekday(或者使用别名dw)做为datepart参数调用DATENAME()函数 就可以得到一个日期是星期几

    DATEPART(DATEPART,date) 返回一个日期的特定部分

    PS: DATEPART()函数和DATENAME()函数完全一样,不过其实它们并不是只是名称不同的别名函数,虽然都是用来提取日期的特定部分的,不过DATEPART()函数的 返回值是数字而DATENAME()函数则会将尽可能的以名称的方式做为返回值

  9. 类型转换

    MSSQLServer提供了名称为CASE()和CONVERT()两个函数用于进行类型转换

    参数格式 :CAST(expression AS data_type)和CONVERT(data_type,expression)

  10. 空值处理

    COALESCE()函数,这个函数主要用来进行空值处理, 格式: COALESCE ( expression,value1,value2……,valuen)

    PS: COALESCE()函数的第一个参数expression为待检测的表达式,而其后的参数个数不定。COALESCE()函数将会返回包括expression在内的所有参数中的第一个非 空表达式。如果expression不为空值则返回expression;否则判断value1是否是空值,如果value1不为空值则返回value1;否则判断value2是否是空值,如果value2不 为空值则返回value3;……以此类推,如果所有的表达式都为空值,则返回NULL

    COALESCE()函数的简化版: ISNULL() 只接受两个变量 格式: ISNULL(expression,value)

    NULLIF()函数 格式: NULLIF ( expression1 , expression2 )

    PS: 如果两个表达式不等价,则 NULLIF 返回第一个 expression1的值。如果两个表达式等价,则 NULLIF 返回第一个 expression1类型的空值。也就是返回类型与第 一 个 expression 相同。

  11. 流程控制函数

    CASE用法: case when then else end 和switch语句非常类似,在制作报表的时候非常有用

  12. 开窗函数

    开窗函数在聚合函数后增加了一个OVER关键字 格式:函数名(列)OVER(选项)