1、数值比较/字符比较
1、数值比较:= != > >= < <=
2、字符比较:= !=
2、逻辑操作
1、and(两个或多个条件同时成立)
2、or(任意一个条件成立即可)
3、范围内比较
1、where 字段名 between 值1 and 值2
2、where 字段名 in(值1,值2,值3...) #枚举式
3、where 字段名 not in(值1,值2,值3,....)
4、匹配空、非空(只能用is 和 is not)
1、空:where 字段名 is null
2、非空: where 字段名 is not null
5、模糊比较
1、where 字段名 like 表达式
2、表达式
1、_:匹配单个字符
2、%:匹配0到多个字符
3、示例
#匹配名字中至少两个字符
select name from sanguo where name like "_%_"
#匹配名字中任意字符
select name from sanguo where name like "%"
#匹配名字中3个字符
select name from sanguo where name like "___"
#匹配名字中姓赵的
select name from sanguo where name like "赵%"
注意:
1、NULL:空值,只能用 is 或者 is not 去匹配
2、"":空字符串,用 = 或者 != 去匹配
1、总结
3、select ...聚合函数 from 表名
1、where...
2、group by ...
4、having ...
5、order by...
6、limit ...;
1、给查询结果进行排序
2、...order by 字段名 asc/desc
3、升序:ASC(默认) 降序:DESC
4、示例
1、将英雄按防御值从高到低排序
select * from sanguo order by fangyu desc;
select * from sanguo order by fangyu;
2、将蜀魏两国英雄中名字为三个字的按防御值升序排列
select * from sanguo
where country in ("蜀国","魏国")
and name like "___" order by fangyu;
1、作用:限制显示查询记录的个数
2、用法
1、limit n -->显示n条记录
2、limit m,n -->显示从第m+1条记录开始,显示n条(从0计数)
3、练习
1、在蜀国英雄中,查找防御值倒数第二名至倒数第四名的记录
select * from sanguo
where country = "蜀国"
order by fangyu asc
limit 1,3;
2、在蜀国英雄中,查找攻击力前三名且名字不为NULL的英雄
的名字、攻击值和国家
select name,gongji,country from sanguo
where
country = "蜀国" and name is not NULL
order by gongji desc
limit 3;
4、分页
每页显示5条记录,显示第4页的内容:limit 15,5
每页显示n条记录,显示第m页:limit (m-1)*n ,n
1、分类
avg(字段名):求该字段的平均值
sum(字段名):求和
max(字段名):最大值
min(字段名):最小值
count(字段名):统计该字段记录的个数
注意:count(*)能统计所有满足条件的记录,包括非条件字段为空
2、示例
1、攻击力最强值是多少
select max(gongji) from db1.sanguo;
2、统计id、name两个字段分别有几条记录
select count(id),count(name) from db1.danguo;
#NULL值不会被统计,""会被统计
3、记录蜀国英雄的总攻击力
select sum(gongji) from db1.sanguo
where country = "蜀国";
4、统计蜀国英雄中攻击力大于200的英雄的数量
select count(*) from db1.sanguo
where
country = "蜀国" and gongji > 200;
1、作用:
给查询的结果进行分组,自动过滤重复的记录
2、示例:
1、查询表中一共有几个国家
select country from sanguo group by country;
2、计算所有国家的平均攻击力
select country,avg(gongji) from sanguo
group by country;
说明:先分组、再聚合、再去重,其中select后字段的结果
必须要与group by聚合结果的条数相同
3、查找所有国家中英雄数量最多的前两名的国家名称和英雄数量
select country,count(id) as number from sanguo
group by country
order by number desc
limit 2;
注意:
1、group by之后的字段名必须要为select之后的字段名
2、如果select之后的字段名和group by之后的字段不一致,则必
须对该字段进行聚合处理(聚合函数),使其能够组成一个表(个
数相同)
1、作用
对查询的结果进行进一步筛选
2、示例
1、找出平均攻击力>105的国家的前两名,显示国家名和平均攻击力
错误:select country,avg(gongji) from sanguo
where avg(gongji) > 105
group by country
order by avg(gongji) desc
limit 2; #where语句后只能处理表内已有的字段名
正确:select country,avg(gongji) as pg from sanguo
group by country
having pg >105
order by pg desc
limit 2;
注意:
1、having语句通常和group by语句联合使用,过滤由group by
语句返回的纪录集
2、where只能操作表中实际存在的字段,having可操作由聚合函数
生成的显示列
1、作用
不显示字段重复值(去除所有字段都相同的记录)
2、示例
1、表中都有那些国家
select distinct country from sanguo;
2、查询蜀国一共有多少个英雄
select count(distinct id) from sanguo
where country = "蜀国";
注意:
1、distinct和from之间所有字段都相同才会去重
2、distinct不能对任何字段做聚合处理
1、运算:
+ - * / %
2、示例
1、查询时所有英雄攻击力翻倍
select from name,gongji*2 from sanguo;
1、定义:
把内层的查询结果作为外层的查询条件
2、语法格式:
select ... from 表名 where 条件(select ...);
3、示例:
1、把攻击值小于平均攻击值的英雄名字和攻击值显示出来
1、先计算平均值
select avg(gongji) from MOSHOU.sanguo;
2、找到 < 平均值
select name,gongji from MOSHOU.sanguo
where gongji < (
select avg(gongji) from MOSHOU.sanguo);
2、找出每个国家攻击力最高的英雄的名字和攻击值
1、找出每个国家最高攻击力
select country,max(gongji) from MOSHOU.sanguo
group by country;
2、找出其名字和攻击值
#无BUG版
select name,gongji from MOSHOU.sanguo
where (country,gongji) in (
select country,max(gongji)
from MOSHOU.sanguo
group by country);
#有BUG版本
select country,gongji from MOSHOU.sanguo
where gongji in (
select max(gongji) from MOSHOU.sanguo
group by country);
1、两种方式
1、select 字段名列表 from 表名列表;(笛卡尔积)
t1: name -> "A1" "A2" "A3"
t2: name2 -> "B1" "B2"
select * from t1,t2;
2、...where条件;
1、显示省和市的详细信息
select sheng.s_name,city.c_name from sheng,city
where
sheng.s_id = city.cfather_id;
3、显示省市县的详细信息
select sheng.s_name,city.c_name,xian.x_name
from sheng,city,xian
where
sheng.s_id = city.cfather_id
and city.c_id = xian.xfather_id;
1、内连接
1、语法格式
select 字段名 from
表1 inner join 表2 on 条件
inner join 表3 on 条件;
2、显示省市详细信息
select sheng.s_name,city.c_name from sheng
inner join city
on sheng.s_id = city.cfather_id;
3、显示省市县详细信息
select sheng.s_name,city.c_name,xian.x_name
from sheng inner join city
on sheng.s_id = city.cfather_id
inner join xian
on city.c_id = xian.xfather_id;
2、外连接(可以将不匹配的字段以null值添加在主要连接字段上)
1、左连接
1、以 左表 为主显示查询结果
2、语法:
select 字段名 from
表1 left join 表2 on 条件
left join 表3 on 条件;
3、显示省市详细信息
select sheng.s_name,city.c_name from
sheng left join city
on sheng.s_id = city.cfather_id;
2、右连接
用法同左连接,以右表为主来显示查询结果
显示省市详细信息
select sheng.s_name,city.c_name from sheng
right join city
on sheng.s_id = city.cfather_id;
左连接以左表字段为主,为表字段匹配不到填NULL
右连接同左连接以右字段显示为主