Mysql数据操作语言(查)

基本查询

基本语法形式

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

 

字段或表达式列表

1,字段,自然是来源于“表”,则其必然依赖于from子句;

2,表达式是类似这样一个内容:8,   8+3,   now(),   

其中:concat()函数是mysql中的系统函数,用于“连接”多个字符串;

3,每个“输出项”(字段或表达式结果),都可以给其设定一个“别名”(字段别名)形式为:

字段或表达式  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  

4,对where子句的更进一步理解:

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的值为所列出的这些值中的一个,就算是满足了条件;这些值,通常是零散无规律的。

 

 

like运算符:对字符串进行模糊查找

语法:

XX  like  ‘要查找的内容’

 

含义:

实现对字符串的某种特征信息的模糊查找。它其实依赖于以下2个特殊的“符号”:

%           :它代表“任何个数的任何字符”;

_            :(下杠),它代表“一个任何字符”;

 

 

常见示例及含义:

name  like  ‘%罗%’:         表示nam中“罗”这一个字的所有数据行;

name  like  ‘罗%’:            表示nam中以“罗”开头的所有数据行;比如:罗兰,

name  like  ‘%罗’:            表示nam中以“罗”结尾的所有数据行;比如:C罗,魂斗罗

name  like  ‘罗_’:              表示nam中以“罗”开头并只有2个字符的所有数据行;比如:罗兰

name  like  ‘_罗’:              表示nam中以“罗”结尾并只有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  字段;

 

原始数据:

分组之后(图示):

应用中,分组之后,通常只有如下几种可用的“组信息”了(即可以出现在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。其大致图示如下:

 

 

 

 

 

 

 

 

  

 

posted @ 2016-07-27 16:12  z2168465  阅读(86)  评论(0)    收藏  举报