1. 选出列的命名问题:

    1) 选出列也称为查询列,比如select name, id from table1;里name和id就是选出列,也成为查询列,即查询得到的列;

    2) 关于选出列的要素:

        i. 选出列一定是目标表中的列,即上面的name和id必定是table1中的列;

        ii. 得到的查询结果中显示的列名就是查询列的列名(name, id),即和原表table1中的列名相同;

        iii. 如果对查询列进行运算(比如select id + 5 from table1),那得到的结果将是该列值运算后的结果(这是必然的,前面也讲过了),但是得到显示结果中列名就变成了运算表达式的字符串了(即显示结果的列名为"id + 5"!);


2. 查询列表达式:

    1) 其实广义上来说,select后面紧跟的“列名“其实严格意义上来讲叫做”查询列表达式“,因为列作为一种变量可以进行运算;

    2) 而select的显示结果中相应的列名等于查询列表达式的字符串,比如select 5 + id from talbe1; 那么显示结果中该列的列名就是"5 + id";


3. 查询列改名:

    1) 其实这是一种需求,就是可以自己命名显示结果中的列名,就拿上面的例子来讲“5 + id"这样的名字也太难看了吧!

    2) 改名规则:每一个查询列写成(以下二选一,两种都行),如果自定义名中包含一些特殊字符(比如分隔符逗号,单引号,反斜杠等,就要用双引号引起来);

         i. 查询列表达式 as 自定义名

         ii. 查询列表达式 自定义名

!!前者中间用as隔开,而后者直接用空格隔开罢了,形式上后者更简单,但是使用as更能见名知意,并且代码可读性更强,通常推荐使用as;

    3) 示例:select id + 5 as new_id, concate(name, '_new') "new,name" from table1; // 同时使用两种方法,这只是演示


!!即使查询得到的结果视图(表)名也是可以重定义的(起别名),语法和列别名相似:二选一

        i. select .... from 目标表 as 别名 ...;

        ii. select ... from 目标表 别名 ...;

!!还是建议使用as的版本;


4. 查询常量:

    1) 可以直接select常量,比如select 4...、select 'lala'...、select 3 + 9...等;

    2) 查询常量得到的结果就是常量值本身,并且结果的列名也是该常量表达式字符串,当然很难看可以改名,比如select 5 + 7; 那么结果的列名就是“5 + 7”;

    3) 查询常量真心不需要结合某张表,比如直接select 4;就可以了,得到的结果就是一个1×1列,只有一个值4的视图,就当做一个SQL命令行界面的计算器使;

    4) 但如果结合表查常量其实原理和插列是一样的,比如select 5 from t1; // 如果t1中有10行,那么结果就是10行5

    5) 再比如select 5 from t1 where id > 3; // 如果t1表中id大于3的有5行,那么结果就是5行5

    6) 标准SQL要求的查询常量的规范:

         i. 上述直接select 5;这样的语法其实标准SQL是不支持的!!这是MySQL自己支持的一种写法;

         ii. 标准SQL要求任何查询都必须要指定一个表!但是常量查询真心和具体的表没什么关系;

         iii. 因此标准SQL规定了一种虚表dual,即该表是虚的,没有任何意义,仅仅作为查询常量时的一种占位符!

         iv. 查询常量时虚表的用法:select 常量表达式 from dual;


5. 结果去重:

    1) 在select后面紧跟distinct关键字就可以对结果行去重;

    2) 这种重复的检查是针对查询列的组合而言的,比如select distinct name, id from t1; // 是对name和id的组合去重!

    3) distinct必须对整个结果行去重(即紧跟在select后面,表示结果的整个行起作用),但并不能针对个别列去重,比如我只想对id去重是不可以的,例如select name, distinct id from t1;是不可以的,理由很简单,id如果重复了,那难道name就不管了吗?也许id重复时name不重复,那么不重复的name被剔除了岂不是非常不合理吗?


6. 升降序排列:

    1) 默认显示的结果是按照表中原有的记录插入顺序排列的,但有时候又需要结果根据某列的值升序或者降序排列(比如按照成绩排列等等);

    2) SQL使用select的属性order by来指定结果的升降序排列,格式:select ... where ... order by 列1 [desc], 列2 [desc];

         i. 其中desc表示降序排列,asc表示升序排列,默认情况下(什么都不写)就表示升序排列,所以除非你真的需要降序排列那就显式地写以下desc,否则就默认为升序;

         ii. 这里表示结果按照列1的大小排列,如果列1的值相同时再按照列2的值排列...,以此类推;

         iii. 只要该列的数据类型是可比的(比如数值型、字符串型、日期型等)就可以作为参照列进行排序;

         iv. 这个列1、列2的列名可以是原列名也可以是列别名(自定义的/重定义的列名);

    3) 示例:select * from t2 order by id asc, name desc; // 这里按照id升序排列(asc可以不写),当id相同时再按照name降序排列

    4) order by中同样可以使用表达式,比如:select * from t2 order by id + 5;  // 就是按照id+5的结果的大小升序排列,因此SQL是非常灵活的!!