9.mysql高级查询 select where 运算符 group having orderby limit

2019年12月5日19:19:04 评论 28 次浏览

一个查询语句的完整形式如下所示:

select 子句
    [from 子句]
    [where 子句]
    [group by子句]
    [having子句]
    [order by子句]
    [limit 子句]
;

可见,select语句还是比较复杂的——其实是mysql中最复杂的语句。

1,以上中括号中的任一项都可以省略,但如果不省略,就应该按该顺序出现。
2,通常,from后的子句都需要有from子句, having子句需要有group by子句。
3,这些子句的“执行顺序”,也是按此顺序进行的。

9.mysql高级查询 select where 运算符 group having orderby limit

9.2.查询结果数据及select选项

9.2.1.查询“固定数据”

select  1;
select  2,  ‘abc’;
select  3,  now();

9.2.2.select中可以进行计算

select  1 + 2;
select  3+4*5,  6 + round(6.7) ;        #其中round( )为系统函数

9.2.3.查询出的数据字段可以使用别名

select  1  as  d1,  2+3  as  d2;
select  user_name  as un,  user_pass  as pwd  from  users;

9.2.4.使用distinct消除查询结果重复行

重复行的含义:
两行(或两行以上)的数据完全一样。

select  disctinct  字段1, 字段2, ...  from  表名;
select distinct user_name, user_pass from user3;

9.3.where子句

select  ....  from  表名   where  查询条件;

1,查询条件,类似php语言中的判断条件,也就是说,where相当于if。
2,查询条件的作用是:针对from子句的表“进行一行一行筛选”,以筛选出符合条件的行。
查询条件中,可以使用很多的运算符,包括:算术运算符,比较运算符,逻辑运算符,等等。

where  id > 10; //比较运算符
where  age - 18 >= 0;   //算术运算符,比较运算符
where  id < 20  and  age >= 18; //比较运算符,逻辑运算符
where  year  %  4 = 0  and  year  %  100  !=  0   ||  year  % 400  =  0;
//算术运算符,比较运算符,逻辑运算符
where 子句练习题:
1,查出价格大于5000的联想品牌的商品
select * from product where price > 5000 and pinpai = '联想';
2,查出天津产地的所有商品
select * from product where chandi = '天津';
3,查出类型id(protype_id)为3的并且价格大于等于3000小于等于10000的商品
select * from product where protype_id = 3 and price >=3000 and price <= 10000;

9.4.mysql运算符

9.4.1.算术运算符

+   -   *   /   %

9.4.2.比较运算符:

相等:     =
不相等:    <>  或  !=
大于:     >
大于等于:   >=
小于:     <
小于等于:   <=

9.4.3.逻辑运算符:

逻辑与:    &&  或  and
逻辑或:    ||   或  or
逻辑非:    !    或  not

9.4.4.其他特殊运算符

like模糊查找运算符:

用于判断某个字符型字段的值是否包含给定的字符。

xxx字段  like  ‘%关键字%’

其中:%表示“任意个数的任意字符”。
还可以使用“_”(下杠),表示“任意一个字符”。
where name like ‘罗%’ //找出name的第一个字为“罗”的所有
//可以找出:”罗成”,“罗永浩”,“罗纳尔多”,“罗”
//但找不出“c罗纳尔多”这个
where name like ‘罗_’ //可以找出:”罗成”, “罗兰”,
//但找不出“c罗”,“罗永浩”
极端情况:
where name like “罗” //其实它只是相当于: name = ‘罗’
如果不使用“%”或“_”,则 like 相当于等于(=)。比如:
xxx字段 like ‘关键字’

相当于:
xxx字段 = ‘关键字’

-- like查询:
-- 找出产品名称中包含“电视”的产品
select * from product where pro_name like '%电视%';

between范围限定运算符:

用于判断某个字段的值是否在给定的两个数据范围之间。

xxx字段  between  值1  and  值2

其含义相当于: xxx字段 >= 值1 and xxx字段 <= 值2

-- between范围限定运算符:
-- 找出product表中商品价格在5000-10000之间的商品
select * from product where price between 5000 and 10000;
-- 其实,它相当于:
select * from product where price>=5000 and price<=10000;

in运算符:

用于判断某个字段的值是否在给出的若干个“可选值”范围。

xxx字段  in (值1, 值2, ...... )

其含义是:该字段的值等于所列出的任意一个值,就算满足条件,比如:
籍贯 in (‘北京’,‘山东’,‘河北’, ‘江西’); //则某人籍贯为上述4个之一就ok。

-- in运算符:
-- 找出产地为天津或北京的所有商品
select * from product where chandi in('天津','北京');
-- 其也相当于:
select * from product where chandi ='天津' or chandi='北京';

is运算符:

用于判断一个字段中的是“是否存在”(即有没有),只有两个写法,如下所示:

where  content  is  null;           //不能写成: content = null;
where  content  is  not  null;      //不能写成: content != null;
-- is运算符:
-- 只用于两个情况: is null ,  is  not  null
select * from shuxing_test1 where f4 is null;
-- 注意:
--  不能写成: f4 = null
select * from shuxing_test1 where f4 is not null;

9.5.group by子句

group  by  字段1, 字段2, ....  ;
-- 分组的基本理解:
SELECT pinpai, count(*) as 数量, avg(price) as 平均价, max(price) as 较高价, 
    min(price), sum(price) as 价格之和 FROM `product` group by pinpai

表示对所取得的数据,以所给定的字段来进行分组。
最后的结果就是将数据分成了若干组,每组作为一个“整体”成为一行数据。
特别注意:
分组之后,只有“组信息”——一行就是一组,不能出现描述单独产品的描述

9.mysql高级查询 select where 运算符 group having orderby limit
对其按“品牌”进行分组:
9.mysql高级查询 select where 运算符 group having orderby limit
结果为
9.mysql高级查询 select where 运算符 group having orderby limit
特别注意:

分组查询的结果,要理解为,将“若干行原始数据”,分成了若干组,结果是每组为一行数据。
即:一行数据就代表“一组”这个集合概念,而不再是单个概念。
因此:一行中出现的信息,应该是“组的信息”,而不是“个体信息”。
于是,对于分组查询(group by),select中出现的信息,通常就只有两种情况的信息了:
1,分组本身的字段信息,用什么字段分组,可以出现这个字段;
2,一组的综合统计信息(主要是数字信息),主要包括:
(1)计数值: count(字段), 表示求出一组中原始数据的行数;
(2)较大值: max(字段),表示求出一组中该字段的较大值;
(3)最小值: min(字段),表示求出一组中该字段的最小值;
(4)平均值: avg(字段),表示求出一组中该字段的平均值;
(5)总和值: sum(字段),表示求出一组中该字段的累加和;

以上5个函数,也称为“聚合函数”!

示例1:
查询出各个品牌的产品的平均价。
select pinpai, avg(price)  from product  group by pinpai; 

示例2:
查询出各个产地的产品数量、平均价,较高价,较低价。
SELECT chandi, count(*) as 数量, avg(price) as 平均价, max(price) as 较高价, 
    min(price)  FROM `product` group by chandi

示例3:
查询出产品表中的产品总数。
select count(*) as 产品总数量 from product;

示例4:
查询出产品表中联想品牌的产品总数。
select count(*) as 总数 from product where pinpai = '联想';

多条件分组:

将product表中的所有商品以品牌和产地进行分组,并求出每一组的数量

多条件分组:
将product表中的所有商品以品牌和产地进行分组,并求出每一组的数量
select pinpai, chandi, count(*) as 数量 from product group by pinpai, chandi;

9.6.having子句

having  筛选条件

having的含义跟where的含义一样,但having是只用于对group by分组的结果进行的条件筛选。
即:having其实是相当于分组之后“有若干行数据”,然后对这些行再筛选。
有group by才能用having

-- having的应用:
-- 查询出品牌平均价超过5000的所有品牌的平均价,较高价,以及产品的数量。
select pinpai,avg(price) as 平均价, max(price) as 较高价, 
    count(*) as 数量 from product group by pinpai having avg(price) > 5000;

9.mysql高级查询 select where 运算符 group having orderby limit

--查询出价格超过3000的所有产品的品牌平均价超过5000所有品牌的平均价,较高价,以及产品的数量
select pinpai, avg(price) as 平均价 from product where price > 3000 group by pinpai having 平均价>5000;

9.mysql高级查询 select where 运算符 group having orderby limit

9.7.order by子句

order  by  字段1  [asc或desc], 字段2  [asc或desc], .... 

对前面所取得的数据按给定的字段进行排序。
排序方式有: 正序asc, 倒序desc,如果省略不写,就是asc

演示order by的使用:
示例1: 对所有产品按价格从高到低进行排序;
select * from product order by price desc;

9.mysql高级查询 select where 运算符 group having orderby limit

--对所有品牌的平均价按从高到低的顺序进行排序,并列出品牌名和平均价。
select pinpai, avg(price) as 平均价 from product group by pinpai order by 平均价 desc ;

9.mysql高级查询 select where 运算符 group having orderby limit

9.8.limit 子句

limit  起始行号,行数

1,limit表示对前面所取得的数据再进行数量上的筛选:取得从某行开始的多少行。
2,行号就是前面所取得数据的“自然顺序号”,从0开始算起——注意不是id,或任何其他实际数据。
3,起始行号可以省略,此时limit后只用一个数字,表示从第0行开始取出多少行。
limit子句通常用在“翻页”功能上,用于找出“第n页”的数据,其公式为:
limit (n - 1) * pageSize, pageSize; 其中pageSize表示每页显示的条数。

--示例1:
--取出商品表中价格较高的3个商品,并按倒序排列出来。
select * from product order by price desc limit 0,3;
limit 应用:翻页原理:
limit子句常常用于网页的“翻页功能”。
假设总的数据行数为9,每页显示2行(条),则:
查看第1页:  select  *  from  product  limit  0,  2;
查看第2页:  select  *  from  product  limit  2,  2;
查看第3页:  select  *  from  product  limit  4,  2;
.....
查看第n页:  select  *  from  product  limit  (n-1)*2,  2;
继续阅读
weinxin
加我微信
微信扫一扫,加我微信好友,共同交流,共同进步! (备注:焦国强博客)
mysql 最后更新:2019-12-7
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: