图片 2

SQL语句取多列的最小值(排除0)

经常遇到获取数据表中多个列的最小值和最大值,例如:

问题:从MySQL数据库中取出若干条数据、且要求每次都不一样?

第十章:创建计算字段

  • 拼接字段
    • 拼接函数 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;

图片 1


第十一章:数据处理函数

大部分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() 返回一个角度的正切

 


第十二章:汇总函数

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

    • 获取行数
    • 求和
    • 最大值、最小值和平均值
    • 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;

获取这 4个价格的最小值和最大值:


第十三章:分组数据

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

  • 分组 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 要检索的行数

SELECT
(
SELECT min(minPrice)
FROM
(
VALUES
(IIF(MarketSingleImagetextPrice=0,null,MarketSingleImagetextPrice)),
(IIF(MarketMoreGraphicOnePrice=0,null,MarketMoreGraphicOnePrice)),
(IIF(MarketMoreGraphicTwoPrice=0,null,MarketMoreGraphicTwoPrice)),
(IIF(MarketMoreGraphicThreePrice=0,null,MarketMoreGraphicThreePrice))
) AS #temp(minPrice)
) AS MinIboPrice
FROM YX_WeChatFlowMode WHERE ShapeID=1 AND FlowID = 1656


第十四章:使用子查询

  • 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输出。

 图片 2

解答:

 

情况1)如果不是大数据量,那么可以一条SQL语句解决

1 SELECT * FROM 表名 ORDER BY RAND() LIMIT 范围起始值,范围终止值;

 

情况2)如果是大数据量,那么上面的写法就显得不那么适合了,可以参考如下的做法:

步骤1.取出数据库中数据编号的最大值和最小值

1 SELECT MIN(id), MAX(id) FROM 表名;

 

步骤2.利用编程语言根据得到的最大值和最小值产生随机数,比如: