mysql复杂查询源代码_MYSQL之——复杂查询

查找某个字段的特定位置有特定的字符

方式一:select * from `userinfo` where substring(`describe`,6,2)='美貌';  //_匹配一个字符,那么n个下划线指定n个位置之后出现某个字符,%匹配任意一个字符,维护和阅读非常困难。

方式二:select * from `userinfo` where `describe` like '_____美貌%';  //使用substring(`字段`,截取开始的位置,截取长度)获取结果中的子串,然后再进行匹配。

再使用explain关键字查看SQL语句的性能

笛卡尔积:多表一一进行组合

如:select * from `teacher`,`student`;

内连接(笛卡尔积)可以直接并列多张表完成或者使用inner join 关键字表示内连接。限制条件用where添加,更规范的是使用on来加上连接条件。

如:select * from `teacher` inner join`course` where teacher.tid=course.tid

select * from `teacher` inner join`course` on teacher.tid=course.tid

左连接:select * from `teacher` left join`course` on teacher.tid=course.tid

右连接:select * from `teacher` right join`course` on teacher.tid=course.tid

聚合(统计)函数:avg sum count max min

聚合函数,需要指定统计的范围,如果不使用group by,就以整个表中的所有数据进行统计。

group by 表示按照某个字段进行分组,在使用的时候,如果不是统计结果,那么会显示各组第一条数据的内容。

如果查询非统计结果,会出现only_full_group_by的报错。

这时是因为sql的查询模式限制,必须使用强校验的group by,去修改my.cnf或者my.ini里面的sql_mode参数,去掉only_full_group_by,或者直接添加sql_mode='STRICT_TRANS_TABLES'。

可以在数据库中用 show variables like '%sql_mode%'进行查看。

查询男女学员的平均成绩

1)查询所有成员的平均成绩

如:select avg(`score`) FROM `student` LEFT JOIN `score` on student.sid=score.sid;

2)对学生性别进行分组

如:select avg(`score`),ssex FROM `student` LEFT JOIN `score` on student.sid=score.sid GROUP BY student.ssex;

查询每位学员的平均成绩

如:select SUM(score/4),sname FROM `student` LEFT JOIN `score` on student.sid=score.sid GROUP BY student.sname;

查询所有同学的学号,姓名,选课数,总成绩

如:select student.sid as '学号',student.sname as '姓名',count(score.cid) as '选课数',sum(score) as '总成绩' from student LEFT JOIN score on student.sid=score.sid GROUP BY student.sid;

查询每一门课程的任课老师,选课学员数,以及平均成绩,平均年龄

如:

select

course.cid as '课程号',

course.cname as '课程名',

teacher.tname as '任课老师',

count(score.sid) as '学员数',

avg(student.sage) as '平均年龄',

avg(score.score) as '平均成绩'

FROM

course

LEFT JOIN teacher on teacher.tid=course.tid

LEFT JOIN score on course.cid=score.cid

LEFT JOIN student on score.sid=student.sid

GROUP BY course.cid

查询没门课程的平均成绩(子查询)

如:

select

*

FROM

(

select score.cid,avg(score.score) as avgscore FROM score GROUP BY score.cid

)

as avgscore

RIGHT JOIN course on course.cid=avgscore.cid;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值