一个查询语句的完整形式如下所示:
select 子句
[from 子句]
[where 子句]
[group by子句]
[having子句]
[order by子句]
[limit 子句]
;
可见,select语句还是比较复杂的——其实是mysql中最复杂的语句。
1,以上中括号中的任一项都可以省略,但如果不省略,就应该按该顺序出现。
2,通常,from后的子句都需要有from子句, having子句需要有group by子句。
3,这些子句的“执行顺序”,也是按此顺序进行的。
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
表示对所取得的数据,以所给定的字段来进行分组。
最后的结果就是将数据分成了若干组,每组作为一个“整体”成为一行数据。
特别注意:
分组之后,只有“组信息”——一行就是一组,不能出现描述单独产品的描述
对其按“品牌”进行分组:
结果为
特别注意:
分组查询的结果,要理解为,将“若干行原始数据”,分成了若干组,结果是每组为一行数据。
即:一行数据就代表“一组”这个集合概念,而不再是单个概念。
因此:一行中出现的信息,应该是“组的信息”,而不是“个体信息”。
于是,对于分组查询(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;
--查询出价格超过3000的所有产品的品牌平均价超过5000所有品牌的平均价,较高价,以及产品的数量
select pinpai, avg(price) as 平均价 from product where price > 3000 group by pinpai having 平均价>5000;
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;
--对所有品牌的平均价按从高到低的顺序进行排序,并列出品牌名和平均价。
select pinpai, avg(price) as 平均价 from product group by pinpai order by 平均价 desc ;
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;