mysql查询中的分组,排序及多表连接

行数限定(重点)

限定显示多行
格式:select *from 表名 limit 从第几行开始,显示几行
说明:
[从第几行开始,] --可写可不写,不写是从第0行开始

分组(重点)

1.分组介绍:用group by 结合合计函数,根据一个或多列对结果集进行分组
2.格式:
	select 列名1,聚合函数(计算的列名)
	from 表名
	group by 列名1
3.分组操作:
	求各个班的总分数
	分析:
		1.要显示的列名是class_id
		select class_id
		2.要计算的列是语文+英语+数学
		select class_id,sum(语文+英语+数学)
		3.分组是要分班级
		select class_id,sum(语文+英语+数学)
		from student
		group by class_id
4.分组条件:having
	1.通常和group by一起使用,是分组的条件,类似于where,只不过where后面不能加聚合函数,having可以
	2.格式:
	select 列名,聚合函数
	from 表名
	group by 列名
	having 条件
	例子:显示各个学号,总成绩小于600的学生总成绩 成绩表
	 SELECT 学号,SUM(成绩) FROM 成绩表
 		  GROUP BY 学号
  		  HAVING SUM(成绩)<600;
  	
	例子:求总成绩大于1300的班级  student表
	select class_id,sum(语文+英语+数学)
	from student
	group by class_id
	having sum(语文+英语+数学)>1300
	
		
		

排序(重点)

1.order by语句用于对指定的结果集进行排序
2.order by的默认排序是升序
3.如果要降序加上desc
4.格式:
select * from 表名 order by 列名 desc;  --desc如果不写,默认是升序,如写了就是降序
5.操作
	1.student表,以数学成绩排序,显示学生的信息
	select *from student order by 数学
	2.student表,以学生的总成绩排序,显示学生的信息
	select 姓名,语文+英语+数学 from student order by 语文+英语+数学

函数(重点)

1.Mysql有四大函数
	1.字符串函数
	2.数字函数
	3.时间日期函数
	4.控制流函数
2.字符串函数
	1.length:获取字符串的字节长度  --注意:一个中文是三个字节
	2.char_length:获取字符串的字符长度
	操作:
	显示姓名的字节长度
	select 姓名,length(姓名) from student;
	显示姓名的字符长度
	select 姓名,char_length(姓名) from student;
	3.MID 可以从某个位置获取某个长度的字符(不是字节)
	select 列名,mid(列名,开始截取的位置,截取的字符个数) from 表名
	注意:开始的位置是从1开始,截取的位置包含写的数字
	如:select 姓名,mid(姓名,2,1) from 表名
	从第2个字符(包含第2个字符)开始截取1个字符
	例子:把student学生的名打印出来
3.数学函数
	1.round:四舍五入
	格式:select round(23.4567,2) ---保留小数点后两位,不写,2表示不留小数点后的数字
	注意:数据库管理系统,在上面的这种情况下会提供一张虚表来显示函数得出的结果
	2.求数据的最小值和最大值
	格式:SELECT LEAST(1,2,3,4,5,6);  --最小,结果是1
	格式:SELECT GREATEST(4,8,5,6,7); --最大,结果是8
4.时间日期函数
	1.获取日期时间(now())
	select now(); --2020-07-16 14:06:25
	2.获取日期(current_date())
	SELECT CURRENT_DATE(); --2020-07-16
	3.获取当前的时间(current_time())
	select current_time() --14:06:26
	4.将日期转换为天数,从1970年1月1日开始计算 (to_days)
	select to_days('xxxx-xx-xx')
	5.获取该年过去了多少天(dayofyear())
	SELECT DAYOFYEAR(NOW()); 如果dayofyear要填写日期那么要用xxxx-xx-xx格式
	6.返回当前日期是今年的第几周 week()
	 SELECT WEEK (NOW());如果WEEK要填写日期那么要用xxxx-xx-xx格式
5.控制流函数
	if是控制流函数,有三个参数,如果第一个参数为空,输出第三个参数,否则输出第二个参数
	ifnull是控制流函数,有两个参数,如果第一个参数为空,那么输出第二个参数,否则输出第一个参数
	1.select if(true,'bbb','ccc') --输出第二个参数,其他输出第三个参数,0表示false,其他数字表示true
	2.select ifnull(null,'222')

多表查询(重点)

1.表连接:在多个表中获取数据,这时要连接表
2.内连接:只有两个表中匹配到的数据才会有查询结果
	1.where:用来连接表
	格式:
	select 表名1.列名,表名2.列名 from 表1,表2
	where 表1.列1=表2.列1
	显示学号,姓名,性别,籍贯,成绩
	select 学生信息.学号,学生信息.姓名,学生信息.性别,学生信息.籍贯,成绩表.成绩 
	from 学生信息,`成绩表`
	where 学生信息.学号=成绩表.学号
	连接操作时遵守的原则
	1.select 子句列表中,每个目标列前都要加上基表名称
	2.from 子句应包括所有使用的基表
	3.where 子句应定义一个连接
	注意:连接时,最核心的是找到表与表之间能关联的列,这个关联的列,列名可以不一致,但是数据和数据类型要一致
	2.用 inner join on来连接
	格式:select 表1.列,表2.列 from 表1 inner join 表2
	on 表1.列=表2.列
	注意:如果显示的列是唯一的,那么可以不写基表
	3.给表取别名
	格式:
	select 别名1.列,别名1.列,别名2.列
	from 表1 别名1,表2 别名2
	where 别1.列1=别2.列
	显示学生的姓名,性别,籍贯,班级编号,年级,人数  -- 要给表取别名
	select s.姓名,s.性别,s.籍贯,s.班级编号,b.年级,b.人数
	from 学生信息 s,班级信息 b  --注意,别名不取数字,要取有意义的字符
	where s.班级编号=b.班级编号
	
	4.用join on来连接表,可以分为等值连接和非等值连接
		1.等值连接,就是条件连接是等号
		格式:elect 表1.列,表2.列 from 表1 inner join 表2
		on 表1.列=表2.列
		2.非等值连接,就是条件不是等号
		格式:elect 表1.列,表2.列 from 表1 inner join 表2
		on 表1.列>表2.列
	5.表连接后面可以添加条件
	格式一:select 表1.列,表1.列,表2.列
	from 表1,表2
	where 表1.列=表2.列
	and 条件
	and 条件
	格式二:
	select 表1.列,表2.列
	from 表1 inner join 表2
	on 表1.列=表2.列
	and 条件
	and 条件
	格式三:
	select 表1.列,表2.列
	from 表1 inner join 表2
	on 表1.列=表2.列
	where 条件
	6.针对多表(>2)的表进行连接
	1.where
	格式:
	select 表1.列,表2.列,表3.列
	from 表1,表2,表3
	where 表1.列=表2.列 and 表2.列=表3.列 and ...
	2.inner join on
	select 表1.列,表2.列,表3.列
	from 表1 inner join 表2
	on 表1.列=表2.列 inner join 表3
	on 表2.列=表3.列 ...

猜你喜欢

转载自blog.csdn.net/BS936/article/details/107699754