mysql子查询

聚合函数

聚合函数对一组值执行计算,并返回单个值。 除了 COUNT 以外,聚合函数都会忽略空值。 聚合函数经常与 SELECT 语句的 GROUP BY 子句一起使用。常用的聚合函数有:

  • sum(expr):求和
  • avg(expr):求平均数
  • count(expr):计数器,返回SELECT语句检索到的行中非NULL值的数目
  • max(expr) 获取最大值
  • min(expr) 获取最小值

mysql查询子句

where(条件查询)

在where条件查询中可以使用比较运算符,逻辑运算符,in,between and和模糊查询:

  • 比较运算符包括:>, =, <, >=, <=, !=
  • 逻辑运算符:and, or, not
  • in:类似python中的in
  • between and:表示在什么之间
  • 模糊查询like:类似正则表达式的用法,用通配符去匹配字符,但是在这里的通配符只有两个,%匹配任意长度的任意字符,_匹配任意单个字符。

例如:

1.学生成绩为60分到90分之间的有哪些?

where scores between 60 and 90

2.查找学生姓王的学生?

where name like '王%'

group by(分组)

将查询的结果按照某个字段的值进行分组,如果需要对分组后的数据进行筛选就还需要用到having子句,而不是where子句。

例如:
查找数学英语这两门课的平均成绩大于70分的学生:(假设表scores中有数学英语成绩和姓名)

select name,avg(score) as c from scores group by(name) having c >70;

as(别名)

对于一些名字比较长的字段或者表名,我们可以给它一个比较简短且全局唯一的别名,然后通过别名去引用它(查询语句也可以做别名)。

例如:

select name,age from student as st;
select avg(age) as avg_age from student;

order by(排序)

通常在处理数据或者查询数据的时候往往都需要进行排序,sql中使用order by对相应的数据进行排序,默认查询结果是按照(asc)升序排列的,要降序排列使用desc。

例如:
查询学生的成绩,并按照降序排列

select name,score from scores order by score desc;

if(判断)

if(字段,exp1,exp2) 或者 ifnull(字段,exp1,,exp2) 作用:if表达式中如果字段值为真则返回exp1的值,如果为假的话,返回exp2的值 ifnull表达式中如果字段的值为假则返回exp1的值,如果为假的话,返回exp2的值。

例如: 查询男女学生的人数(分组和聚合函数)

select if(stusex, '男', '女') as '性别', count(stusex) as '人数' from TbStudent group by stusex;

去重和显示结果条数

使用distinct(字段名)表示去除字段名中重复的项。
limit子句用来现在结果的显示条数,用法为limit [offset],N其中offset可以不设置默认为0,如果设置则表示偏移offset条信息然后显示N条信息。offset也可以单独使用。

例如:
取出成绩表中在第四个到第六个这三个人:

select name from scores limit 3,3;

子查询

  • where型子查询
    把内层查询结果当作外层查询的比较条件

例如:
不适用排序,找出最高分的学生姓名和成绩

select name,score from scores where score = (select max(score) from scores);

  • from型子查询
    把内层的查询结果供外层再次查询

例如:
不用group by,查询平均成绩大于等于90分的学生的学号和平均成绩:

select ts1.stuid,t2.avg from tbstudent ts1,(select sid,avg(score) as avg from tbsc group by(sid)) as t2 where t2.sid=ts1.stuid and t2.avg>=90;

  • exists型子查询
    把外层查询结果拿到内层,看内层的查询是否成立

例如:查询哪些栏目下有商品,栏目表category,商品表goods

select cat_id,cat_name from category where exists(select * from goods where goods.cat_id = category.cat_id);

联接

定义 A INNER/LEFT/RIGHT JOIN B操作中,A表被称为左表,B表被称为右表。
a) 内关联: Inner Join on 作用:仅对满足连接条件的列进行关联,其中inner可省略

b) 左外连接:Left Outer Jion on 作用:其中outer可以省略。如A LEFT JOIN B,会输出左表A中所有的数据,同时将符合ON条件的右表B中搜索出来的结果合并到左表A表中,如果A表中存在而在B表中不存在,则结果集中会将查询的B表字段值(如此处的P.PUNISHMENT字段)设置为NULL。 所以,LEFT JOIN的作用是: LEFT JOIN:从右表B中将符合ON条件的结果查询出来,合并到A表中,再作为一个结果集输出。

c) 右外连接:Right Outer Jion on 作用:其中outer可以省略,而RIGHT JOIN刚好相反,“A RIGHT JOIN B ON ……”是将符合ON条件的A表搜索结果合并到B表中,作为一个结果集输出:

练习:

以前一篇MariaDB基础中的练习题创建的数据库为基础

tbcourse表
tbsc表
tbstudent表

习题如下:

1.查询所有学生信息:

select * from tbstudent;

2.查询所有课程名称及学分

select cosname,sum(coscredit) from tbcourse join tbsc on tbcourse.cosid=tbsc.cid group by(tbcourse.cosname);

3.查询所有女学生的姓名和出生日期(筛选)

select stuname,stubirth from tbstudent where stusex=0;

4.查询所有80后学生的姓名、性别和出生日期(筛选)

select stuname,stusex,stubirth from tbstudent where stubirth between '1980-1-1' and '1990-1-1';

5.查询姓王的学生姓名和性别(模糊)

select stuname,stusex from tbstudent where stuname like '王%';

6.查询姓郭名字总共两个字的学生的姓名(模糊)

select stuname from tbstudent where stuname like '郭_';

7.查询姓郭名字总共三个字的学生的姓名(模糊)

select stuname from tbstudent where stuname like '郭_';

8.查询名字中有王字的的学生的姓名(模糊)

select stuname from tbstudent where stuname like '%王%';

9.查询没有录入家庭住址和照片的学生姓名(多条件筛选和空值处理)

select stuname from tbstudent where stuaddr is null and stuphoto is null;

10.查询学生选课的所有日期(去重)

select distinct(scdate) from tbsc;

11.查询学生的姓名和生日按年龄从大到小排列(排序)

select stuname,stubirth from tbstudent order by(stubirth);

12.查询所有录入了家庭住址的男学生的姓名、出生日期和家庭住址按年龄从小到大排列(多条件筛选和排序)

select stuname,stubirth,stuaddr from tbstudent where stuaddr is not null and stusex=1 order by(stubirth);

13.查询年龄最大的学生的出生日期(聚合函数)

select stuname,stubirth from tbstudent where stubirth=(select min(stubirth) from tbstudent);

14.查询年龄最小的学生的出生日期(聚合函数)

select stuname,stubirth from tbstudent where stubirth=(select max(stubirth) from tbstudent);

15.查询男女学生的人数(分组和聚合函数)

select stusex,count(stusex) from tbstudent group by(stusex);

16.查询课程编号为1111的课程的平均成绩(筛选和聚合函数)

select cid,ifnull(avg(score), 0) from tbsc group by(cid);

17.查询学号为1001的学生的所有课程的总成绩(筛选和聚合函数)

select sid,sum(score) from tbsc where sid=1001;

18.查询每个学生的学号和平均成绩,null值处理为0(分组和聚合函数)

select stuid,ifnull(c.avg,0) from tbstudent t left join (select sid,avg(tbsc.score) as avg from tbsc group by(sid)) as c on c.sid=t.stuid;

19.查询平均成绩大于等于90分的学生的学号和平均成绩

select ts1.stuid,t2.avg from tbstudent ts1,(select sid,avg(score) as avg from tbsc group by(sid)) as t2 where t2.sid=ts1.stuid and t2.avg>=90;

或者

select sid,avg(score) as avg from tbsc group by(sid) having avg(score)>=90;

20.查询年龄最大的学生的姓名

select t1.stuname from tbstudent t1 where t1.stubirth=(select min(stubirth) from tbstudent);

21.查询选了两门以上的课程的学生姓名

select t1.stuname,t1.stuid from tbstudent t1 join (select sid,count(cid) as count from tbsc group by(sid)) as t on t.sid=t1.stuid and t.count>=2;

22.查询选课学生的姓名和 平均成绩

select t1.stuname,ifnull(t2.avg,0) from tbstudent t1 join (select sid,avg(score) as avg from tbsc group by(sid)) as t2 on t1.stuid=t2.sid;

23.查询学生姓名、所选课程名称和成绩

select t1.stuname,t2.cosname,ifnull(t3.score,0) from tbstudent t1 join tbsc t3 on t1.stuid=t3.sid join tbcourse t2 on t2.cosid=t3.cid;

24.查询每个学生的姓名和选课数量

select t1.stuname,ifnull(t2.count,0) from tbstudent t1 left join (select sid,count(cid) as count from tbsc group by(sid)) as t2 on t1.stuid=t2.sid;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname...
    哈哈海阅读 1,207评论 0 7
  • 一、子查询定义 定义: 子查询允许把一个查询嵌套在另一个查询当中。 子查询,又叫内部查询,相对于内部查询,包含内部...
    我是强强阅读 3,073评论 0 4
  • Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 S...
    望l阅读 293评论 0 0
  • 给定一个整数n,求解它的阶乘的乘积里末尾0的个数。举个例子,比如3! = 1 * 2 * 3 = 6,末尾0的个数...
    reedthinking阅读 1,609评论 0 1
  • 这个工作状态的确不行啊 不上心啊 自己负责的事 不光是事没上心 而且也抓不住重点
    温水把我煮阅读 96评论 0 0