高级查询的格式:
select ... 聚合函数 from 表名
where ...
group by ...
having ...
order by ...
limit ...
语法格式:
... order by 字段名 ASC/DESC;
select name from stuinfo order by id desc;
limit放在查询语句的最后,后边不再放其他的语句。
用法:
第1页:limit (1-1)*5,5; # 1,2,3,4,5
第2页:limit (2-1)*5,5; # 6,7,8,9,10
第3页:limit (3-1)*5,5; # 11,12,13,14,15
...
第m页:limit (m-1)*n,n;
由上可知:第 4 页是:limit 15,5;
select count(id),count(name) from stuinfo;
注意:select之后的字段名如果没有在group by之后出现,则必须要对该字段进行聚合和处理(即聚合函数)
举个栗子:查询表中有哪些国家
select country from people
group by country;
####having语句
作用:对查询的结果进一步筛选
使用注意:
select country,avg(gongjili) as average from sanguo
group by country
having average>105
order by average desc
limit 2;
运算符:+、-、*、/、%
举个栗子:查询时显示所有英雄攻击力翻倍
select id, name, gongjili*2 as newgjl from sanguo;
嵌套查询也叫子查询,是把内层的查询结果作为外层的查询条件
语法格式
select 字段名列表 from 表名 where 字段名 运算符
(select 字段名 from 表名 where 条件)
注意:外层的where的条件必须和内层的select查询的字段名一样,个数也一样
如:把攻击值小于平均攻击值的名字和攻击值显示出来(sanguo表)
我们可以分开来查,然后合并成一条语句
分析:查名字和攻击值,条件是攻击值小于平均攻击值;
第一步:先求平均值
select avg(gongjizhi) from sanguo;
假设我们用avg记录查询出来的平均值
第二步:查找攻击值小于平均值的名字和攻击值
select name, gongjizhi from sanguo where gongjizhi<avg;
第三步:将上边两条合并
select name, gongjizhi from sanguo where gongjizhi<
(select avg(gongjizhi) from sanguo);
在举个栗子:找出每个国家攻击力最高的英雄的名字和攻击值
第一步:按国家分组找出攻击最大的攻击值
select max(gongjizhi) from sanguo
group by country;
第二步:显示以上英雄的名字和攻击值
select name, gongjizhi from sanguo where
gongjizhi in (第一步的结果);
第三步:合并上两步
select name, gongjizhi from sanguo
where gongjizhi in
(select max(gongjizhi) from sanguo
grounp by country);
将第三步改进一下:
select name, gongjizhi from sanguo
where (country, gongjizhi) in
(select country, max(gongjizhi) from sanguo
group by country);
方法不止一种,当然有更优的写法,现在不涉及。
语法格式:
select 字段名列表 from 表1,表2 where 条件;
笛卡尔积的匹配规则(面试中常问)
内连接
语法格式:
select 字段名列表 from 表1 inner join 表2 on 表1.字段=表2.字段;
注意:inner 可以省略,on后边的条件在两个表中必须都存在,是连接两个表的标志。
内连接显示的内容要同时满足条件,如
外连接之左连接
left join
以左表为基准,匹配右表的所有内容,不够的用显示NULL
外连接之右连接
right join
以右表为基准,去匹配左表的内容,不够的也是显示NULL
The end !