mysql 语句执行顺序

一般执行顺序

  1. from =》 判断从哪些表取数据
  2. ON =》 临时表条件(虚拟表)
  3. JOIN =》 连接多表
  4. where =》判定条件,得出结果集
  5. group by=》对结果集分组
  6. having =》 对结果集过滤
  7. select =》 查询字段(这里可再进行聚合函数)
  8. DISTINCT =》 唯一筛选
  9. order by =》排序
  10. limit =》限定条数

查询拍卖出价表中,每个用户最高出价。(一个表中用户多次出价, 只取出每个用户记录最高的一条)

解题思路:首先必须要max(price),取得最大值。但在此之前要分组,按照用户ID进行分组。

如果没有 group by,只使用 max 的时候如下:

select max(price) max_price,uid from paimai_order_record;

上面只有最高的一条,而在 表名后添加 group by uid 反而变成多条了。

select max(price) max_price,uid from paimai_order_record group by uid;

另外 limit n,m 的方式中效率是非常低的,这时可以通过在 where 中增加条件,从而提高效率。

例如在ID连续的情况下:

select * from t_user where id between 9000000 and 9000100 limit 100;

如果ID不连续,但一般至少也是递增的,通过子查询查出最小 ID,然后限定为 > min_id,然后再 limit 查询数量,例如:

select * from user where type = 8 and id >= (
    select id from user where type = 8 limit 100000,1
) limit 100;

gson对空值属性自动去除

使用Gson的toJson方法时,会自动去掉值为null的键值对。

        String sql = "select * from user left join uexam on uexam.uno=user.uno";
        System.out.println(sql);
        List<Map<String, Object>> maps = ViewJDBC.queryMapList(sql);
        for (Map<String, Object> map : maps) {
            System.out.println(map);
        }
        System.out.println(Message.toJson(maps));

在sql使用join时,可能导致部分行的部分列为空,返回的原数据是正常的。

而使用 Gson 转 json 字符串后,一些为 null 的键就不存在了,对前端来说还是不错的,毕竟 null 和 undefined 都可以使用 ! 自动转boolean判断。

sql支持查询多少个字段?

前面测试过 mysql 最大支持61个表连接,

而字段数经过测试似乎是无限的:

    public static void main(String[] args){

        String sql = "select '' t0 ";
        int cols = 128000;  // 字段数
        for (int i = 1; i < cols; i++) {
            sql += ",'' t"+i;
        }
        sql += " from user";  // 任意表,这里用user
        System.out.println(sql);
        List<Map<String, Object>> maps = ViewJDBC.queryMapList(sql);
        System.out.println(maps);
    }

这里测试了 12万8千个字段,正常返回,就是有点慢,已经足够大了,没有必要测试出最大支持多少,或许是无限的。

sql可以连接多少表?

先说结论,mysql最大支持61表连接

使用sql进行测试。

已知表:

CREATE TABLE `uexam` (
  `ueno` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '编号',
  `eno` bigint(20) DEFAULT NULL COMMENT '考试编号',
  `uno` bigint(20) DEFAULT NULL COMMENT '用户编号',
  `exe` int(1) unsigned zerofill NOT NULL DEFAULT '0' COMMENT '参与考试{0.未参加,1.已参加,2.已交卷}',
  PRIMARY KEY (`ueno`)
) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8mb4;

使用Java循环拼接sql测试:

    public static void main(String[] args){

        String sql = "select ";
        int tables = 64;  // 条数
        String sql_name = "t0.*";
        String sql_table = " uexam t0";
        for (int i = 1; i < tables; i++) {
            sql_name += ",t"+i+".*";
            sql_table += " LEFT JOIN uexam t"+i+" ON "+"t"+(i-1)+".ueno=t"+i+".ueno";
        }

        sql += sql_name;
        sql += " from";
        sql += sql_table;

//        System.out.println(sql);
        List<Map<String, Object>> maps = ViewJDBC.queryMapList(sql);
        System.out.println(maps);
    }

通过tables控制数量,测试最大支持量为61,上面64会报以下错误:

java.sql.SQLException: Too many tables; MySQL can only use 61 tables in a join

多表连接时,不一定要用 = 号,也可以是 != ,或者 > ,< 与其他符号。某个表中数据不存在时则部分行的部分列返回空,可以放心把表设计为范式并使用 join 连接,可以去掉数据冗余。

es6中const和let关键字

这2个关键字都是定义变量

其中 const 是常量,一般用于循环、或不改变的数据。

而 let 用于局部变量。

在es6之前都是全局变量,而var则保留为全局变量,如果未使用关键字则也是全局变量(可以先使用再定义,叫做变量提升)

另外注意 const 变量并非完全不可变,如果指定了对象或数组等引用类型,则其内部可变。

window server 2019识别耳机麦克风

刚用window server 2019,需要视频通话,而电脑竟无法识别语音。

1.允许应用使用麦克风

win10以后有一个奇怪的规定,就是需要允许应用使用麦克风。

打开“设置”,然后点击“麦克风隐私设置”,并“允许在此设备上访问麦克风“。

2.监听测试

如果还是无声,打开“声音”,找到”录制“,双击或右键当前使用的麦克风,点击勾选”侦听此设备”。

为什么执行此步骤?以及遇到问题?如果根本无法识别麦克风,请查看台式机后端音频输入一般“粉红色”别插错,前端接口注意看清标识。

侦听以后,对麦克风吹气,如果音响有声音,则说明麦克风正常,就是声音“特别小”所以听不见!!!

切换插口看看是否能提高声音、另外声音调到最高,增强开到最高的30分贝,贴近音响以及把麦克风放在嘴边说话,则说明还没坏透。

既然能侦听到,则可以切换设备,或更新驱动等方法测试怎么提高

mysql 之 order by rand()

一般来说使用 limit 指定一个参数时,就只取n个值,它是从下标0开始的。

但如果配合 order by rand() 则能随机取n个值,因为 limit 前会进行 order by,所以这样就能够随机取n条数据。

// 固定取前5条数据
select * from user  limit 5;

// 随机取5条数据
select * from user order by rand() limit 5;

注意order by rand()的用法, 有些版本数据库可能不被支持。

wordpress主题自定义后台编辑界面css

在主题函数functions.php中添加以下函数支持:

// 编辑器自定义css
add_theme_support( 'editor-styles' );
add_editor_style( 'style-editor.css' );

第二句代码中的style-editor.css为文件名,在主题根目录下创建此css文件即可,试试编写一些样式,查看后台编辑器效果:

p{
    background-color: #111;
}

mysql 的 limit 子句

可以使用一个或两个参数

如果使用一个参数,则限制取前n条记录

select * from user limit 10;

如果想从第10条开始,往后取10条,则指定为2个参数,

其中第一个为offsset偏移量,第二个参数为条数

select * from user limit 10,10;