MySQL中的SQL查询与运算符操作

  • 运算符操作
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、"":空字符串,用 = 或者 != 去匹配
  • SQL查询(单表查询)
1、总结
	3、select ...聚合函数 from 表名
		1、where...
		2、group by ...
		4、having ...
		5、order by...
		6、limit ...;
  • oder by
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;
  • limit(永远放在SQL语句的最后写)
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;
  • group by
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之后的字段不一致,则必
	须对该字段进行聚合处理(聚合函数),使其能够组成一个表(个
数相同)
  • having语句
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可操作由聚合函数
生成的显示列
  • distinct
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条件;

笛卡尔积
MySQL中的SQL查询与运算符操作_第1张图片
示例:设有三个表:省、市、县
MySQL中的SQL查询与运算符操作_第2张图片
MySQL中的SQL查询与运算符操作_第3张图片
MySQL中的SQL查询与运算符操作_第4张图片

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
MySQL中的SQL查询与运算符操作_第5张图片
右连接同左连接以右字段显示为主
MySQL中的SQL查询与运算符操作_第6张图片

  • 多表查询与内连接的区别
    1、从结果上看两者相同;
    2、但是从实现上看,多个from是笛卡尔集,再筛选,效率是O(n^2),很差;
    连接join是先做hash,再匹配,效率是O(logN),很好;
    故推荐使用内连接

你可能感兴趣的:(MySQL)