MYSQL函数、多表查询

子查询

当多个表中数据存在关联,且需要先由另一个表数据查询后使用进行当前表数据的查询

由多条sql语句组成用于返回指定数据

在这里插入图片描述

在这里插入图片描述

子查询中的sql语句一般返回一列数据并且有时可能返回唯一数据

函数

聚合函数

聚合函数:对一组值进行计算,并返回计算后的值 ,具有统计数据的作用,将多行数据进行聚合操作返回一个指定值

注意:在使用聚合函数时一般不会再对其他数据进行单独查询,因为聚合函数执行后仅返回一条数据,所以在进行查询时,如果其他数据存在多条也只返回第一条语句

sum()

求和,将指定列中所有数据求和后返回

在这里插入图片描述

avg()

求平均值,获取指定列平均值在这里插入图片描述

max()

在这里插入图片描述

min()

在这里插入图片描述

count()

返回满足条件的行数

在这里插入图片描述

字符串函数

CHARSET(str)返回字串字符集
CONCAT (string2 [,… ])连接字串
INSTR (string ,substring )返回substring在string中出现的位置,没有返回0
UCASE (string2 )转换成大写
LCASE (string2 )转换成小写
LEFT (string2 ,length )从tring2中的左边起取length个字符
LENGTH (string )string长度
REPLACE (str ,search_str ,replace_str )在str中用replace_str替换search_str
STRCMP (string1 ,string2 )逐字符比较两字串大小,
SUBSTRING (str , position [,length ])从str的position开始,取length个字符
LTRIM (string2 ) RTRIM (string2 ) trim去除前端空格或后端空格

charset()

返回指定字段字符串编码

在这里插入图片描述

concat()

连接字符串。将两字段数据或字符串进行连接

在这里插入图片描述

instr()

查找指定字符串出现的位置,不存在则返回0

在这里插入图片描述

ucase()

将指定字段数据已大写形式返回

在这里插入图片描述

lcase()

将指定字段数据已小写形式返回

在这里插入图片描述

left()

返回指定字段从左开始指定长度的数据

在这里插入图片描述

length()

返回指定字段字符个数

在这里插入图片描述

replace()

使用指定字符串替换字段中某一字符串

在这里插入图片描述

substring()

返回指定字段自定起始位置开始长度的字符串

在这里插入图片描述

trim()

空格替换

在这里插入图片描述

日期函数

用于进行日期转换以及日期格式定义的函数

ADDTIME (date2 ,time_interval )将time_interval加到date2
CURRENT_DATE ( )当前日期
CURRENT_TIME ( )当前时间
CURRENT_TIMESTAMP ( )**当前时间戳 **
DATE (datetime )返回datetime的日期部分
DATE_ADD (date2 , INTERVAL d_value d_type )在date2中加上日期或时间
DATE_SUB (date2 , INTERVAL d_value d_type )在date2上减去一个时间
DATEDIFF (date1 ,date2 )两个日期差
NOW ( )当前时间
YEAR|Month|DATE (datetime )年月日

current_date()

返回当前时间(date类型)

current_time()

返回当前时间(time类型)

current_timstamp()

返回当前时间(timestamp类型)

now()

返回当前时间(datatime类型)

date()

返回指定日期字段date部分数据

在这里插入图片描述

time()

返回指定日期字段time部分数据

在这里插入图片描述

date_add()

为包含date数据的日期类型进行添加

在这里插入图片描述

需要使用interval 进行数值的转换

date_sub()

为包含date数据的日期类型进行减少

在这里插入图片描述

datediff()

返回两个日期直接相差天数(第一个日期减第二个日期)

year()

返回指定日期类型的年

month()

返回指定日期类型的月

day()

返回指定日期类型的日

数学函数

abs()

返回数值类型绝对值

ceiling()

向上取整

floor()

向下取整

least()

获取一行数据中最小值

rand()

随机数

在这里插入图片描述

在数据库表中有以下字符数据,如:
13-1、13-2、13-3、13-10、13-100、13-108、13-18、13-11、13-15、14-1、14-2
现在希望通过SQL语句进行排序,并且首先要按照前半部分的数字进行排序,然后再按照后半部分的数字进行排序,输出要排成这样:
13-1、13-2、13-3、13-10、13-11、13-15、13-18、13-100、13-108、14-1、14-2

#-前面升序 -后面降序
select * from sort order by str 
#查找每个-的位置
select instr(str,'-') from sort
#获取-左边的值
select CONVERT(left(str,instr(str,'-')-1),SIGNED) from sort

#获取-右边的值
select CONVERT(right(str,length(str)-instr(str,'-')),SIGNED) from sort

select * from sort order by CONVERT(left(str,instr(str,'-')-1),SIGNED) asc , CONVERT(right(str,length(str)-instr(str,'-')),SIGNED) desc

分组

关键字group by

使用指定字段进行分组,字段数据的个数就是分组的个数,这样在使用聚合函数时只会对相应分组进行聚合操作

在这里插入图片描述

聚合函数一般与分组一同使用,但是在进行条件判断时,如果对于聚合函数进行判断且存在分组那么不能使用where进行条件判断必须使用having(只针对于聚合函数的值的判断)

在这里插入图片描述

where进行筛选与having的区别

WHERE子句:
用来筛选 FROM 子句中指定的操作所产生的行
GROUP BY子句:
用来分组 WHERE 子句的输出
HAVING子句:
用来从分组的结果中筛选行

多表操作

在进行数据查询时想查询并返回多个表的数据的时候使用多表查询

连接查询

全连接

在进行多表连接查询时返回两表的笛卡尔积,在进行表连接时会将每张表的每一行与另一张表的每一行数据进行连接

注意:使用全连接会造成大量的冗余数据,所以一般在where语句中进行筛选

不建议使用全连接进行连接查询,因为全连接进行连接效率不高,因为是首先现将所有数据返回笛卡尔积之后使用where进行筛选

执行步骤为先将所有数据进行连接之后再进行条件筛选

在这里插入图片描述

内连接

INNER JOIN

语法:select *from 表1 inner join 表2 on 连接条件

内连接必须书写on连接条件(如果不写与全连接结构一致)

与全连接不同的是,内连接是在进行连接时直接将数据进行过滤之后进行返回

在这里插入图片描述

外连接

左外连接 (LEFT JOIN)
右外连接 (RIGHT JOIN)

语法:select * from 表1 left[right] join 表2 on连接条件

以左表或右表为准,保留左表或右表全部数据的基础上进行连接

在这里插入图片描述

在这里插入图片描述

sql查询语法总结

select 查询展示的字段与函数

from 数据源(可以是由另一个查询语句返回的结果作为表)

inner /left/right join 连接查询

on 连接条件

where 筛选条件

group by 分组字段

having 分组条件筛选

order by 排序字段 asc /desc

limit 起始行 ,截取行

在进行sql查询语句书写时

1、明确数据源连接

查询展示字段所在的表

2、筛选条件where

根据需求决定展示数据的行有哪些

3、分组条件

根据需求决定使用分组的字段(注意分组字段是以指定字段的值进行分组)

4、排序与截取

一些练习

–21查询统计出每个班的平均分、显示平均分超过70分的信息、并按照降序显示信息
select avg(c.score) from computer c left join student s on s.studentid=c.studentid
group by s.classid having avg(c.score)>70 order by avg(c.score) desc;

–20查询出成绩最高的学生的编号、姓名、计算机成绩、所在班级名称
select s.studentid,s.studentname,c.score,class.classname from student s
left join computer c on s.studentid=c.studentid left join class on class.classid=s.classid
where s.studentid =(select c.studentid from computer c where c.score = (select max(score) from computer));

–19查询出年龄在20-25之间的学生的编号、姓名、年龄、计算机成绩
select s.studentid,s.studentname,s.studentage ,c.score from student s
left join computer c on s.studentid=c.studentid
where s.studentage between 20 and 25;

–18查询出G1T07班学生的编号、姓名、班级名称、计算机成绩
select s.studentid,s.studentname,class.classname,c.score from student s
left join computer c on s.studentid=c.studentid left join class on class.classid=s.classid
where s.classid = (select class.classid from class where class.classname=‘G1T06’)
group by s.studentid;

–17删除姓名包含“c”字符的学生计算机成绩 成绩为null
update computer set score=null where studentid in
(select s.studentid from student s where s.studentname like’%c%’);

–17删除姓名包含“c”字符的学生计算机成绩 此行移除
delete from computer where studentid in
(select s.studentid from student s where s.studentname like’%c%’);

–16查询出每个班级的学生的平均分(查询的结果中包含平均分和班级名称)
select classname,avg(score) from class left join student s on class.classid=s.classid
left join computer c on s.studentid=c.studentid group by classname;

–15将参加过考试的学生的年龄更改为20
update student set studentage=20 where studentid in
(select studentid from computer where score is not null);

–14查询男、女生的计算机平均成绩、最高分、最低分
select s.studentsex,avg(c.score),max(c.score),min(c.score) from computer c left join student s
on c.studentid=s.studentid group by s.studentsex;

–13查询出班级编号大于3的男生的学生信息
select s.* from student s where classid>3 and studentsex=‘男’;

–12查询出班级编号大于3的学生的计算机平均分信息
select avg(score) from computer c
where c.studentid in (select s.studentid from student s where classid>3 );

–11查询出班级编号大于3的学生基本信息
select s.* from student s where classid>3 ;

–10查询出和Jim住在同一个地方的学生的基本信息
select s.* from student s where studentaddress=
(select s.studentaddress from student s where studentname=‘Jim’ );

–9查询显示出班级的计算机平均分大于80的班级名称、平均分信息,并按照平均分降序显示
select s.classid,avg(c.score) from student s left JOIN
computer c on s.studentid=c.studentid
GROUP BY classid having avg(c.score)>80 order by avg(c.score) desc;

–8查询出每个班的学生的计算机成绩的平均分,最高分,最低分
select s.classid,avg(c.score),max(c.score),min(c.score) from student s left JOIN
computer c on s.studentid=c.studentid group by s.classid;

–7查询出所有学生的信息和计算机成绩信息
select s.*,c.score from student s left join
computer c on s.studentid=c.studentid ;

–6查询出计算机成绩大于80分的学生编号、姓名、班级名称
select class.classname,s.studentname,s.classid from student s left join
computer c on s.studentid=c.studentid left join class on s.classid=class.classid
where score>80;

–5查询出姓名中包含有c的学生编号、姓名、计算机成绩
select s.studentid,s.studentname,c.score from student s left join
computer c on s.studentid=c.studentid where s.studentname like(’%c%’);

–4查询出年龄大于19岁的学生编号、姓名、计算机成绩
select s.studentid,s.studentname,c.score from student s left join
computer c on s.studentid=c.studentid where s.studentage>19;

–3查询出学生的编号、姓名、所在班级名称、计算机成绩
select s.studentid,s.studentname,class.classname,c.score from student s
left join computer c on s.studentid=c.studentid left join class on s.classid=class.classid
where c.score is not null;

–2查询参加过考试的学生信息
select s.* from student s
left join computer c on s.studentid=c.studentid where c.score is not null;

–1查询出学生的编号,姓名,计算机成绩 简化
select s.studentid, s.studentname, c.score from student s
left join computer c on s.studentid=c.studentid;

–1查询出学生的编号,姓名,计算机成绩
select student.studentid,student.studentname,computer.score from student
left join computer on student.studentid=computer.studentid;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值