语法形式:
select [all | distinct] 字段或表达式列表 [from子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句];
字段或表达式列表:
- 字段,自然是来源于“表”,则其必然依赖于from子句;
- 表达式是类似这样一个内容:8,8+3, now()
- concat()函数是mysql中的系统函数,用于“连接”多个字符串;
每个“输出项”(字段或表达式结果),都可以给其设定一个“别名”(字段别名)形式为:
字段或表达式 as 别名;
》
注意:实际上,表的字段并没有改变,而只是改变了“结果集”的字段名;
all 和 distinct
用于设定select出来的数据,是否消除“重复行”,可以不写,那就是默认值all:
- all:表示不消除,即所有都出来,默认值;
- distinct:表示会消除;
- 使用all(跟不使用结果是一样的):
对比:
from子句
from子句表示select部分从中“取得”数据的数据源——其实就是表
where子句
说明:
- where子句就是对from子句中的“数据源”中的数据进行筛选的条件设定,筛选的机制是“一行一行进行判断”,其作用,几乎就跟各种语言中if语句的作用一样。
- where子句依赖于from子句;
- where子句中,通常都需要使用各种“运算符”;
- 算术运算符: + - * / %
- 比较运算符: > >= < <= =(等于) < >(不等于) ==(等于) !=(不等于)
- 逻辑运算符: and or not
对where子句的更进一步理解: is运算符:空值和布尔值的判断
形式 | 含义 |
---|---|
XX is null | 判断某个字段是“null”值——就是没有值 |
XX is not null | 判断某个字段不是“null”值 |
XX is true | 判断某个字段为“真”(true) |
XX is false | 判断某个字段为“假”(false):0, 0.0, ‘’, null |
所谓布尔值,其实是tinyint(1)这个类型的一个“别名”,本质上,只是判断一个数字是否为0;
between运算符:范围判断
用于判断某个字段的数据值是否在某个给定的范围——适用于数字类型;
语法:
- XX between 值1 and 值2;
含义:
- XX字段的值在给定“值1”和“值2”之间,其实相当于: XX >=值1 and XX <= 值2;
in运算符:给定确定数据的范围判断
语法:
XX in (值1,值2, 值3, .....);
含义:
- 表示字段XX的值为所列出的这些值中的一个,就算是满足了条件;这些值,通常是零散无规律的。
- 它罗列出的数据,如果有一定的规律,则其实可以使用逻辑运算符或between运算符来代替。
like运算符:对字符串进行模糊查找
语法:
XX like ‘要查找的内容’
含义:
实现对字符串的某种特征信息的模糊查找。它其实依赖于以下2个特殊的“符号”:
- % :它代表“任何个数的任何字符”;
- _ :(下杠),它代表“一个任何字符”;
如果我要找某个字段中含“%”(或_)的行,怎么办?转义就ok:
- \%:表示%这个字符本身
- \ _ :表示_这个字符本身
group by 子句:分组
形式:
group by 字段1 【desc|asc】, 字段2 【desc|asc】, .....
说明:
- 分组是对“前述”已经找出的数据(即where已经筛选过了)进行某种指定标准(依据)的分组。
- 同时,该分组结果,可以同时指定其“排序方式”:desc(倒序),asc(顺序);
- 通常,分组就一个字段(依据),2个以上很少。
分组:就是将多行数据,以某种标准(就是指定的字段)来进行“分类”存放。
特别注意:
- 分组之后的结果,一定要理解为:只有一个一个组了
- 结果是:在select语句中的“输出(取出)”部分,只应该出现“组的信息”:
select 组信息1, 组信息2, ..... from 数据源 group by 字段;
应用中,分组之后,通常只有如下几种可用的“组信息”了(即可以出现在select中):
- 每一组的“数量”信息:就是用count(*)获得;
- 原来数据中的“数值类型字段的聚合信息”,包括如下几个:
类型 | 形式 |
---|---|
最大值 | max(字段名) |
最小值 | min(字段名) |
平均值 | avg(字段名) |
总和值 | sum(字段名) |
having子句
having的作用跟where完全一样,但其只是对“分组的结果数据”进行筛选;
- where对原始数据行进行筛选;
- having对分组之后的数据行进行筛选;
例:找出商品数超过2个的品牌信息:
结果为:
- count(*)是独立计算的结果:即对每一组进行原始数据行的统计,并用该条件进行筛选。
例:
结果为:
“恢复”(导入)数据:
mysql登录后:source “备份数据文件的完整路径”
order by 子句
- 它用于将前面“取得”的数据以设定的标准(字段)来进行排序以输出结果。
- 形式:
order by 字段1 【asc|desc】, 字段2 【asc|desc】,......
说明:
- 对前面的结果数据以指定的一个或多个字段排序;
- 排序可以谁定正序(asc,默认值)或倒序(desc);
- 多个字段的排序,都是在前一个字段排序基础上,如果还有“相等值”,才继续以后续字段排序;
limit子句
含义:
它用于将“前述取得的数据”,按指定的行取出来:从第几行开始取出多少行;
形式:
limit 起始行号, 要取出的行数;
说明:
- 起始行号都是从0开始算起的;
- 起始行号跟数据中的任何一个字段(比如id)没有关系;
- 要取出的行数也是一个数字,自然应该是大于0的;
- 有一个简略形式:limit 行数; 表示直接从第0行开始取出指定的行数,它相当于limit 0, 行数;
对整个select语句的一些总结
- 虽然在形式上,select的很多子句都是可以省略的,但他们的顺序(如果出现),就不能打乱的:必须仍然按照给出的顺序写出;
- where子句依赖于from子句:即没有from,就不能有where;
- having子句依赖于groupby子句:即没有groupby,就不能有having;
- select中的“字段”也是依赖于from子句;
- 上述各子句的“内部执行过程”,基本上也都是按照该顺序进行的: