今天在数据库匹配数据的时候,发现一些数据存在别名,导致我的数据匹配不上。在这里记录分享一下

第十章:创建计算字段

  • 拼接字段
    • 拼接函数 Concat()
      • SELECT Concat(name, ‘(‘, department, ‘)’) FROM student ORDER
        BY name;
    • 去掉空格函数 Trim() LTrim() RTrim()
    • 别名 alias
      • SELECT Concat(name, ‘(‘, department, ‘)’) AS
        name_department FROM student ORDER BY name;
  • 执行算术计算
    • 支持加减乘除
      • SELECT name, 2018-birth AS age FROM student ORDER BY age;

例如: 李钟硕 (Lee Jong Suk),这里我匹配的是 “李钟硕”

第十一章:数据处理函数

大部分SQL提供下面的函数

  • 文本处理函数
    • Left() 返回串左边的字符
    • Length() 返回串的长度
    • Locate() 找出串的一个子串
    • Lower() 转换成小写
    • LTrim() 去掉串左边的空格
    • Right() 返回串右边的字符
    • RTrim() 去掉串右边的字符
    • Soundex() 返回串的Soundex值(根据发音来匹配,中文效果不怎么样)
    • SubString() 返回子串的字符
    • Upper() 转换成大写
  • 日期和时间处理函数
    • AddDate() 增加一个日期
    • AddTime() 增加一个时间
    • CurDate() 返回当前日期
    • CurTime() 返回当前时间
    • Date() 返回日期时间中的日期部分
    • DateDiff() 计算两个日期之差
    • Date_Add() 高度灵活的日期运算函数
    • Date_Format() 返回一个格式化的日期或者时间串
    • Day() 返回一个日期的天数部分
    • DayOfWeek() 返回一个日期对应一周内的第几天(星期天是第1天)
    • Hour() 返回一个时间的小时部分
    • Minute() 返回一个时间的分钟部分
    • Month() 返回一个日期的月份部分
    • Now() 返回当前日期和时间
    • Second() 返回一个时间的秒部分
    • Time() 返回一个日期时间的时间部分
    • Year() 返回一个日期的年份部分
  • 数值处理函数
    • Abs() 返回一个数的绝对值
    • Cos() 返回一个角度的余弦
    • Exp() 返回一个数的指数值
    • Mod() 返回除操作的余数
    • Pi() 返回圆周率
    • Rand() 返回一个随机数
    • Sin() 返回一个角度的正弦
    • Sqrt() 返回一个数的平方根
    • Tan() 返回一个角度的正切

示例1:

第十二章:汇总函数

  • 聚集函数(不需要实际数据本身,只是汇总信息)

    • 获取行数
    • 求和
    • 最大值、最小值和平均值
    • AVG() 返回某列的平均值
    • COUNT() 返回某列的行数
      • SELECT COUNT(*) FROM student; //不忽略null
      • SELECT COUNT(name) FROM student; //指定列明的话,忽略null
    • MAX() 返回某列的最大值
    • MIN() 返回某列的最小值
    • SUM() 返回某列之和
  • 聚集不同值

    • DISTINCE 排除值相同的行,可以用于上面的5个聚集函数,不过
      COUNT(DISTINCE price) 必须指定列名,MAX() 和 MIN() 使用 DISTINCE
      没有意义。
  • 组合聚集函数

    • SELECT COUNT(*) AS user_count, MIN(birth) AS birth_old,
      MAX(birth) AS birth_young, AVG(birth) AS birth_avg FROM
      student;

SELECT reverse(substring(reverse(Name) ,charindex(‘(‘,reverse(Name)) + 1
, len(Name)))  FROM T

第十三章:分组数据

数据分组: 把数据分为多个逻辑组,以便对每个组进行聚集计算

  • 分组 GROUP BY

    • SELECT birth, COUNT(*) AS num FROM student GROUP BY birth;
      //检索每个出生年份有几人
    • GROUP BY 可以包含多列
    • GROUP BY 可以嵌套分组
    • GROUP BY 必须出现在 WHERE 子句之后, ORDER BY 子句之前
  • 过滤分组 HAVING(HAVING 可以代替 WHERE 子句, WHERE
    是对数据分组前进行过滤,HAVING 是对数据进行分组后过滤)

    • SELECT birth FROM student GROUP BY birth HAVING birth > 1990;
      //查询1990之后哪个年份有人出生
  • 对分组进行排序 GROUP BY + ORDER BY

    • SELECT birth, COUNT(*) AS num FROM student GROUP BY birth ORDER
      BY birth; //按出生年份分组并升序排序
  • SELECT 子句

    • SELECT 要返回的列或者表达式
    • FROM 从中检索数据的表
    • WHERE 过滤行
    • GROUP BY 分组
    • HAVING 过滤分组
    • ORDER BY 排序
    • LIMIT 要检索的行数

示例2:

第十四章:使用子查询

  • SQL中所有语句都是查询,一般指的是 SELECT 语句

  • SELECT 语句可以嵌套使用,子查询就是查询嵌套查询

  • 子查询不能嵌套太多,会影响性能

  • 子查询一般跟 IN
    操作符配合使用,有时也会跟等于(=)、不等于(<>)配合使用

  • 看一个例子(从3张表中检索数据):

    • SELECT cust_name, cust_contact FROM customers WHERE cust_id
      IN
      (SELECT cust_id FROM orders WHERE order_num IN
      (SELECT order_num FROM orderitems WHERE prod_id = ‘TNT2’));
  • 作为计算列字段使用子查询:

    • 例子:从order表和customer表中查询出每个顾客的订单数):
    • SELECT cust_name,
      cust_state,
      (SELECT COUNT(*) FROM order WHERE
      order.cust_id=customer.cust_id)
      AS orders FROM customer ORDER BY cust_name;
    • 先从customer表中找出所有顾客,然后用顾客id跟order表中的顾客id匹配,查询出每个顾客的订单数,作为计算字段orders输出。

发表评论

电子邮件地址不会被公开。 必填项已用*标注