select查询的完整模式

select [all | distinct] 字段或表达式列表 [from子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句];
字段或表达式列表

每个“输出项”(字段或表达式结果),都可以给其设定一个“别名”(字段别名)形式为:
字段或表达式 as 别名;
在这里插入图片描述在这里插入图片描述在这里插入图片描述
注意:实际上,表的字段并没有改变,而只是改变了“结果集”的字段名;

all 和 distinct
用于设定select出来的数据,是否消除“重复行”,可以不写,那就是默认值all:
all:表示不消除,即所有都出来,默认值;
distinct:表示会消除;
使用all(跟不使用结果是一样的):
在这里插入图片描述
对比:
在这里插入图片描述
from子句
from子句表示select部分从中“取得”数据的数据源——其实就是表。

通常,其后面就是表名; 比如: from tab1,
但,也可能是其他一些数据来源; from tab1,tab2(连接表);

select输出(取出)部分,如果给定的是字段名,则其必然是来源于这里的“数据源”的字段;
where子句
说明:
1,where子句就是对from子句中的“数据源”中的数据进行筛选的条件设定,筛选的机制是“一行一行进行判断”,其作用,几乎就跟各种语言中if语句的作用一样。
2,则,可见,where子句依赖于from子句;
3,where子句中,通常都需要使用各种“运算符”;
算术运算符: + - * / %
比较运算符: > >= < <= =(等于) < >(不等于) ==(等于) !=(不等于)
逻辑运算符: and or not
在这里插入图片描述在这里插入图片描述
is运算符:空值和布尔值的判断
有4种情况的使用:
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个特殊的“符号”:
% :它代表“任何个数的任何字符”;
_ :(下杠),它代表“一个任何字符”;
在这里插入图片描述在这里插入图片描述
常见示例及含义:

name like‘%罗%’: 表示name中“罗”这一个字的所有数据行;
name like‘罗%’: 表示name中以“罗”开头的所有数据行;比如:罗兰,
name like‘%罗’:表示name中以“罗”结尾的所有数据行;比如:C罗,魂斗罗
name like‘罗_’:表示name中以“罗”开头并只有两个字符的所有数据行;比如:罗兰	
name like‘_罗’: 表示name中以“罗”结尾并只有2个字符的所有数据行;比如:C罗

一个新的问题:
如果我要找某个字段中含“%”(或_)的行,怎么办?转义就ok:
% :表示%这个字符本身
_ :表示_这个字符本身
例:
XX like ‘%%%’; 表示XX中含有百分号(%)这个字符的所有行;

group by 子句:分组
形式:
group by 字段1 【desc|asc】, 字段2 【desc|asc】, …
说明:
1,分组是对“前述”已经找出的数据(即where已经筛选过了)进行某种指定标准(依据)的分组。
2,同时,该分组结果,可以同时指定其“排序方式”:desc(倒序),asc(顺序);
3,通常,分组就一个字段(依据),2个以上很少。
什么叫做分组?
分组:就是将多行数据,以某种标准(就是指定的字段)来进行“分类”存放。
特别注意:
分组之后的结果,一定要理解为:只有一个一个组了
则,结果是:在select语句中的“输出(取出)”部分,只应该出现“组的信息”:
select 组信息1, 组信息2, … from 数据源 group by 字段;
在这里插入图片描述
分组之后(图示):
在这里插入图片描述
则我们对这些组(5组),就应该理解为5条数据结果。

应用中,分组之后,通常只有如下几种可用的“组信息”了(即可以出现在select中):
1,分组依据本身的信息,其实就是该分组依据的字段名;
2,每一组的“数量”信息:就是用count(*)获得;
3,原来数据中的“数值类型字段的聚合信息”,包括如下几个:
最大值: max(字段名)
最小值: min(字段名)
平均值: avg(字段名)
总和值: sum(字段名)
上述其实是4个系统内部函数;
在这里插入图片描述
结果为在这里插入图片描述:,表示,每一种品牌的商品数量。
继续举例:
在这里插入图片描述
结果为:
在这里插入图片描述
则这个结果的含义就非常明显:
某个品牌有多少件商品,及该品牌的最高价,最低价,平均价和总价,全都出来了。

having子句
一句话:
having的作用跟where完全一样,但其只是对“分组的结果数据”进行筛选;
即:
where对原始数据行进行筛选;
having对分组之后的数据行进行筛选;
示例1:找出平均价大于5000的品牌信息:
在这里插入图片描述
结果为:在这里插入图片描述
示例2:找出商品数超过2个的品牌信息:
在这里插入图片描述
结果为:
在这里插入图片描述
还有一种用法:
在这里插入图片描述
此时,count(*)是独立计算的结果:即对每一组进行原始数据行的统计,并用该条件进行筛选。
结果为:
在这里插入图片描述
order by 子句
它用于将前面“取得”的数据以设定的标准(字段)来进行排序以输出结果。
形式:
order by 字段1 【asc|desc】, 字段2 【asc|desc】,…
说明:
1,对前面的结果数据以指定的一个或多个字段排序;
2,排序可以谁定正序(asc,默认值)或倒序(desc);
3,多个字段的排序,都是在前一个字段排序基础上,如果还有“相等值”,才继续以后续字段排序;
举例:
在这里插入图片描述
结果为:
在这里插入图片描述
例2:
在这里插入图片描述
结果为:
在这里插入图片描述
limit子句
含义:
它用于将“前述取得的数据”,按指定的行取出来:从第几行开始取出多少行;
形式:
limit 起始行号, 要取出的行数;
说明:
1,起始行号都是从0开始算起的;
2,起始行号跟数据中的任何一个字段(比如id)没有关系;
3,要取出的行数也是一个数字,自然应该是大于0的;
4,有一个简略形式:limit 行数; 表示直接从第0行开始取出指定的行数,它相当于limit 0, 行数;
举例1:
原始取出的数据为:
在这里插入图片描述在这里插入图片描述
然后,从中取出“部分数据”:
在这里插入图片描述
在这里插入图片描述
再来一个
在这里插入图片描述
在这里插入图片描述
再来一个例子:
在这里插入图片描述
结果为:
在这里插入图片描述
对整个select语句的一些总结
1,虽然在形式上,select的很多子句都是可以省略的,但他们的顺序(如果出现),就不能打乱的:必须仍然按照给出的顺序写出;
2,where子句依赖于from子句:即没有from,就不能有where;
3,having子句依赖于groupby子句:即没有groupby,就不能有having;
4,select中的“字段”也是依赖于from子句;
5,上述各子句的“内部执行过程”,基本上也都是按照该顺序进行的:
即从from的数据源中获得“所有数据”,然后使用where对这些数据进行“筛选”,之后再使用groupby子句对筛选出来的数据进行“分组”,接下来才可以使用having对这些分组的数据进行筛选,然后才可以orderby 和limit。其大致图示如下:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37171379/article/details/86714551