MySQL里面的子查询实例
2022-11-12 09:18:21
内容摘要
这篇文章主要为大家详细介绍了MySQL里面的子查询实例,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!一,子选择基本用法1,子选择的定义子迭
文章正文
这篇文章主要为大家详细介绍了MySQL里面的子查询实例,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
一,子选择基本用法1,子选择的定义子迭择允许把一个查询嵌套在另一个查询当中。比如说:一个考试记分项目把考试事件分为考试(T)和测验(Q)两种情形。下面这个查询就能只找出学生们的考试成绩select*fromscorewhereevent_idin(selectevent_idfromeventwheretype='T');2,子选择的用法(3种)用子选择来生成一个参考值在这种情况下,用内层的查询语句来检索出一个数据值,然后把这个数据值用在外层查询语句的比较操作中。比如说,如果要查询表中学生们在某一天的测验成绩,就应该使用一个内层查询先找到这一天的测验的事件号,然后在外层查询语句中用这个事件号在成绩表里面找到学生们的分数记录。具体语句为:select*fromscorewhereid=(selectevent_idfromeventwheredate='2002-03-21'andtype='Q');需要注意的是:在应用这种内层查询的结果主要是用来进行比较操作的分法时,内层查询应该只有一个输出结果才对。看例子,如果想知道哪个美国总统的生日最小,构造下列查询select*frompresidentwherebirth=min(birth)这个查询是错的!因为MySQL不允许在子句里面使用统计函数!min()函数应该有一个确定的参数才能工作!所以我们改用子选择:select*frompresidentwherebirht=(selectmin(birth)frompresidnet);exists和notexists子选择上一种用法是把查间结果由内层传向外层、本类用法则相反,把外层查询的结果传递给内层。看外部查询的结果是否满足内部查间的匹配径件。这种“由外到内”的子迭择用法非常适合用来检索某个数据表在另外一个数据表里面有设有匹配的记录数据表t1数据表t2I1C1I2C2123AC234CA先找两个表内都存在的数据selecti1fromt1whereexists(select*fromt2wheret1.i1=t2.i2);再找t1表内存在,t2表内不存在的数据selecti1formt1wherenotexists(select*fromt2wheret1.i1=t2.i2);需要注意:在这两种形式的子选择里,内层查询中的星号代表的是外层查询的输出结果。内层查询没有必要列出有关数据列的名字,田为内层查询关心的是外层查询的结果有多少行。希望大家能够理解这一点in和notin子选择在这种子选择里面,内层查询语句应该仅仅返回一个数据列,这个数据列里的值将由外层查询语句中的比较操作来进行求值。还是以上题为例先找两个表内都存在的数据selecti1fromt1wherei1in(selecti2fromt2);再找t1表内存在,t2表内不存在的数据selecti1formt1wherei1notin(selecti2fromt2);好象这种语句更容易让人理解,再来个例子比如你想找到所有居住在A和B的学生。select*fromstudentwherestatein(‘A','B')二,把子选择查询改写为关联查询的方法。1,匹配型子选择查询的改写下例从score数据表里面把学生们在考试事件(T)中的成绩(不包括测验成绩!)查询出来。Select*fromscorewhereevent_idin(selectevent_idfromeventwheretype='T');可见,内层查询找出所有的考试事件,外层查询再利用这些考试事件搞到学生们的成绩。这个子查询可以被改写为一个简单的关联查询:Selectscore.*fromscore,eventwherescore.event_id=event.event_idandevent.event_id='T';下例可以用来找出所有女学生的成绩。Select*fromscorewherestudent_idin(selectstudent_idformstudentwheresex=‘f');可以把它转换成一个如下所示的关联查询:Select*fromscoreWherestudent_id=student.student_idandstudent.sex='f';把匹配型子选择查询改写为一个关联查询是有规律可循的。下面这种形式的子选择查询:Select*fromtablelWherecolumn1in(selectcolumn2afromtable2wherecolumn2b=value);可以转换为一个如下所示的关联查询:Selecttablel.*fromtablel,table2Wheretable.column1=table2.column2aandtable2.column2b=value;(2)非匹配(即缺失)型子选择查询的改写子选择查询的另一种常见用途是查找在某个数据表里有、但在另一个数据表里却没有的东西。正如前面看到的那样,这种“在某个数据表里有、在另一个数据表里没有”的说法通常都暗示着可以用一个leftjoin来解决这个问题。请看下面这个子选择查询,它可以把没有出现在absence数据表里的学生(也就是那些从未缺过勤的学生)给查出来:Select*fromstudentWherestudent_idnotin(selectstudent_idfromabsence);这个子选择查询可以改写如下所示的leftjoin查询:Selectstudent.*Fromstudentleftjoinabsenceonstudent.student_id=absence.student_idWhereabsence.student_idisnull;把非匹配型子选择查询改写为关联查询是有规律可循的。下面这种形式的子选择查询:Select*fromtablelWherecolumn1notin(selectcolumn2fromtable2);可以转换为一个如下所示的关联查询:Selecttablel.*Fromtablelleftjointable2ontablel.column1=table2.column2Wheretable2.column2isnull;注意:这种改写要求数据列table2.column2声明为notnull。注:关于MySQL里面的子查询实例的内容就先介绍到这里,更多相关文章的可以留意
代码注释