游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

MySQL高手必备子查询技巧,面试官看了我的分享连呼牛逼

  子查询
  出现在select语句中的select语句,称为子查询或内查询。
  外部的select查询语句,称为主查询或外查询。子查询分类
  按结果集的行列数不同分为4种标量子查询(结果集只有一行一列)列子查询(结果集只有一列多行)行子查询(结果集有一行多列)表子查询(结果集一般为多行多列)
  按子查询出现在主查询中的不同位置分select后面:仅仅支持标量子查询。from后面:支持表子查询。where或having后面:支持标量子查询(单列单行)、列子查询(单列多行)、行子查询(多列多行)exists后面(即相关子查询):表子查询(多行、多列)准备测试数据
  测试数据比较多,放在我的个人博客上了。
  浏览器中打开链接:http:www。itsoku。comarticle209
  mysql中执行里面的javacode2018employees库部分的脚本。
  成功创建javacode2018employees库及5张表,如下:
  select后面的子查询
  子查询位于select后面的,仅仅支持标量子查询。示例1
  查询每个部门员工个数SELECTa。,(SELECTcount()FROMemployeesbWHEREb。departmentida。departmentid)AS员工个数FROMdepartmentsa;示例2
  查询员工号102的部门名称SELECT(SELECTa。departmentnameFROMdepartmentsa,employeesbWHEREa。departmentidb。departmentidANDb。employeeid102)AS部门名;from后面的子查询
  将子查询的结果集充当一张表,要求必须起别名,否者这个表找不到。
  然后将真实的表和子查询结果表进行连接查询。示例1
  查询每个部门平均工资的工资等级查询每个部门平均工资SELECTdepartmentid,avg(a。salary)FROMemployeesaGROUPBYa。departmentid;薪资等级表SELECTFROMjobgrades;将上面2个结果连接查询,筛选条件:平均工资betweenlowestsalandhighestsal;SELECTt1。departmentid,saAS平均工资,t2。gradelevelFROM(SELECTdepartmentid,avg(a。salary)saFROMemployeesaGROUPBYa。departmentid)t1,jobgradest2WHEREt1。saBETWEENt2。lowestsalANDt2。highestsal;
  运行最后一条结果如下:mysqlSELECTt1。departmentid,saAS平均工资,t2。gradelevelFROM(SELECTdepartmentid,avg(a。salary)saFROMemployeesaGROUPBYa。departmentid)t1,jobgradest2WHEREt1。saBETWEENt2。lowestsalANDt2。highestsal;departmentid平均工资gradelevelNULL7000。000000C104400。000000B209500。000000C304150。000000B406500。000000C503475。555556B605760。000000B7010000。000000D808955。882353C9019333。333333E1008600。000000C11010150。000000D12rowsinset(0。00sec)where和having后面的子查询
  where或having后面,可以使用标量子查询(单行单列行子查询)列子查询(单列多行子查询)行子查询(多行多列)
  特点子查询放在小括号内。子查询一般放在条件的右侧。标量子查询,一般搭配着单行操作符使用,多行操作符、、、、、、!列子查询,一般搭配着多行操作符使用in(notin):列表中的任意一个any或者some:和子查询返回的某一个值比较,比如asom(10,20,30),a大于子查询中任意一个即可,a大于子查询中最小值即可,等同于amin(10,20,30)。all:和子查询返回的所有值比较,比如aall(10,20,30),a大于子查询中所有值,换句话说,a大于子查询中最大值即可满足查询条件,等同于amax(10,20,30);子查询的执行优先于主查询执行,因为主查询的条件用到了子查询的结果。mysql中的in、any、some、all
  in,any,some,all分别是子查询关键词之一。in:in常用于where表达式中,其作用是查询某个范围内的数据any和some一样:可以与、、、、、结合起来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的任何一个数据。all:可以与、、、、、结合是来使用,分别表示等于、大于、大于等于、小于、小于等于、不等于其中的其中的所有数据。
  下文中会经常用到这些关键字。标量子查询
  一般标量子查询,示例
  查询谁的工资比Abel的高?查询abel的工资【改查询是标量子查询】SELECTsalaryFROMemployeesWHERElastnameAbel;查询员工信息,满足salary的结果SELECTFROMemployeesaWHEREa。salary(SELECTsalaryFROMemployeesWHERElastnameAbel);多个标量子查询,示例
  返回jobid与141号员工相同,salary比143号员工多的员工、姓名、jobid和工资返回jobid与141号员工相同,salary比143号员工多的员工、姓名、jobid和工资查询141号员工的jobidSELECTjobidFROMemployeesWHEREemployeeid141;查询143好员工的salarySELECTsalaryFROMemployeesWHEREemployeeid143;查询员工的姓名、jobid、工资,要求jobidandsalarySELECTa。lastname姓名,a。jobid,a。salary工资FROMemployeesaWHEREa。jobid(SELECTjobidFROMemployeesWHEREemployeeid141)ANDa。salary(SELECTsalaryFROMemployeesWHEREemployeeid143);子查询分组函数,示例
  查询最低工资大于50号部门最低工资的部门id和其最低工资【having】查询最低工资大于50号部门最低工资的部门id和其最低工资【having】查询50号部门的最低工资SELECTmin(salary)FROMemployeesWHEREdepartmentid50;查询每个部门的最低工资SELECTmin(salary),departmentidFROMemployeesGROUPBYdepartmentid;在的基础上筛选,满足min(salary)SELECTmin(a。salary)minsalary,departmentidFROMemployeesaGROUPBYa。departmentidHAVINGmin(a。salary)(SELECTmin(salary)FROMemployeesWHEREdepartmentid50);错误的标量子查询,示例
  将上面的示例中子查询语句中的min(salary)改为salary,执行效果如下:mysqlSELECTmin(a。salary)minsalary,departmentidFROMemployeesaGROUPBYa。departmentidHAVINGmin(a。salary)(SELECTsalaryFROMemployeesWHEREdepartmentid500000);ERROR1242(21000):Subqueryreturnsmorethan1row
  错误提示:子查询返回的结果超过了1行记录。
  说明:上面的子查询只支持最多一列一行记录。列子查询
  列子查询需要搭配多行操作符使用:in(notin)、anysome、all。
  为了提升效率,最好去重一下distinct关键字。
  示例1
  返回locationid是1400或1700的部门中的所有员工姓名返回locationid是1400或1700的部门中的所有员工姓名方式1查询locationid是1400或1700的部门编号SELECTDISTINCTdepartmentidFROMdepartmentsWHERElocationidIN(1400,1700);查询员工姓名,要求部门是列表中的某一个SELECTa。lastnameFROMemployeesaWHEREa。departmentidIN(SELECTDISTINCTdepartmentidFROMdepartmentsWHERElocationidIN(1400,1700));方式2:使用any实现SELECTa。lastnameFROMemployeesaWHEREa。departmentidANY(SELECTDISTINCTdepartmentidFROMdepartmentsWHERElocationidIN(1400,1700));拓展,下面与notin等价SELECTa。lastnameFROMemployeesaWHEREa。departmentidALL(SELECTDISTINCTdepartmentidFROMdepartmentsWHERElocationidIN(1400,1700));
  示例2
  返回其他工种中比jobid为’ITPROG’工种任意工资低的员工的员工号、姓名、jobid、salary返回其他工种中比jobid为ITPROG工种任一工资低的员工的员工号、姓名、jobid、salary查询jobid为ITPROG部门任工资SELECTDISTINCTsalaryFROMemployeesWHEREjobidITPROG;查询员工号、姓名、jobid、salary,slary的任意一个SELECTlastname,employeeid,jobid,salaryFROMemployeesWHEREsalaryANY(SELECTDISTINCTsalaryFROMemployeesWHEREjobidITPROG)ANDjobid!ITPROG;或者SELECTlastname,employeeid,jobid,salaryFROMemployeesWHEREsalary(SELECTmax(salary)FROMemployeesWHEREjobidITPROG)ANDjobid!ITPROG;
  示例3
  返回其他工种中比jobid为’ITPROG’部门所有工资低的员工的员工号、姓名、jobid、salary返回其他工种中比jobid为ITPROG部门所有工资低的员工的员工号、姓名、jobid、salarySELECTlastname,employeeid,jobid,salaryFROMemployeesWHEREsalaryALL(SELECTDISTINCTsalaryFROMemployeesWHEREjobidITPROG)ANDjobid!ITPROG;或者SELECTlastname,employeeid,jobid,salaryFROMemployeesWHEREsalary(SELECTmin(salary)FROMemployeesWHEREjobidITPROG)ANDjobid!ITPROG;行子查询(结果集一行多列)
  示例
  查询员工编号最小并且工资最高的员工信息,3种方式。查询员工编号最小并且工资最高的员工信息查询最小的员工编号SELECTmin(employeeid)FROMemployees;查询最高工资SELECTmax(salary)FROMemployees;方式1:查询员工信息SELECTFROMemployeesaWHEREa。employeeid(SELECTmin(employeeid)FROMemployees)ANDsalary(SELECTmax(salary)FROMemployees);方式2SELECTFROMemployeesaWHERE(a。employeeid,a。salary)(SELECTmin(employeeid),max(salary)FROMemployees);方式3SELECTFROMemployeesaWHERE(a。employeeid,a。salary)in(SELECTmin(employeeid),max(salary)FROMemployees);
  方式1比较常见,方式2、3更简洁。exists后面(也叫做相关子查询)
  语法:exists(玩转的查询语句)。exists查询结果:1或0,exists查询的结果用来判断子查询的结果集中是否有值。一般来说,能用exists的子查询,绝对都能用in代替,所以exists用的少。和前面的查询不同,这先执行主查询,然后主查询查询的结果,在根据子查询进行过滤,子查询中涉及到主查询中用到的字段,所以叫相关子查询。
  示例1
  简单示例mysqlSELECTexists(SELECTemployeeidFROMemployeesWHEREsalary300000)ASexists返回1或者0;exists返回1或者001rowinset(0。00sec)
  示例2
  查询所有员工的部门名称exists入门案例SELECTexists(SELECTemployeeidFROMemployeesWHEREsalary300000)ASexists返回1或者0;查询所有员工部门名SELECTdepartmentnameFROMdepartmentsaWHEREexists(SELECT1FROMemployeesbWHEREa。departmentidb。departmentid);使用in实现SELECTdepartmentnameFROMdepartmentsaWHEREa。departmentidIN(SELECTdepartmentidFROMemployees);
  示例3
  查询没有员工的部门查询没有员工的部门exists实现SELECTFROMdepartmentsaWHERENOTexists(SELECT1FROMemployeesbWHEREa。departmentidb。departmentidANDb。departmentidISNOTNULL);in的方式SELECTFROMdepartmentsaWHEREa。departmentidNOTIN(SELECTdepartmentidFROMemployeesbWHEREb。departmentidISNOTNULL);
  上面脚本中有b。departmentidISNOTNULL,为什么,有大坑,向下看。NULL的大坑
  使用in的方式查询没有员工的部门,如下:SELECTFROMdepartmentsaWHEREa。departmentidNOTIN(SELECTdepartmentidFROMemployeesb);
  运行结果:mysqlSELECTFROMdepartmentsaWHEREa。departmentidNOTIN(SELECTdepartmentidFROMemployeesb);Emptyset(0。00sec)
  in的情况下,子查询中列的值为NULL的时候,外查询的结果为空。

青菜萝卜和月亮宁波市北仑区霞浦中学王炯引言:新课程在阅读目标上强化了感受性、体验性,鼓励学生在阅读文本以后提出自己的看法和疑问,作出自己的评价,说出自己的体验,鼓励学生独立判断,……九年级下册家说课稿一、教材分析《家》是语文版九年级下册第一单元的一篇议论性散文。这个单元的四篇课文蕴涵的思想涉及人生、社会、家、国等方面。其中《家》是一篇最具哲理性的散文,作者从人们熟悉的……秋天的收获教学设计课前提示:1、每一排的同学为一大组,第一个为组长。2、当你听到老师拍手的时候,请你马上停下来,无论你再做什么,面向老师认真听讲。3、现在每个同学的桌子上都有一……可能性的教学反思范文《摸球游戏》这节课是小学数学(青岛版)五年级下册,这节课的内容是让学生进一步体会事件发生的可能性是有大有小的。同时,也让学生通过猜测试验分析试验数据这一过程,经历事件发生可能性……寓言两则语文教案【学习目标】1、会认5个生字,学写12个生字。正确读写寓言、亡羊补牢等词语。2、朗读课文,能用自己的话讲讲这两则寓言故事。3、了解故事内容,结合生活实际体会故……访的组词造句1、家访造句:这些志愿人员进行家访,了解受艾滋病病毒感染的人是否状况良好,确定病人是否在坚持抗逆转录病毒治疗,并通过建立友谊和提供咨询而使人们得到心理上的支持。解释:(因……草原就是我的家教案【片段1】1。观看课件,体验民俗,《草原就是我的家》。(背景音乐:草原就是我的家)师:蒙古族地区每年七八月间都举行隆重的那达慕大会。现在让我们一起去看一看他们在干什……关于一年级上册求加法中的未知数说课稿一年级上册《求加法中的未知数》说课稿说课的内容是苏教版义务教育教科书《数学》一年级上册第6869页例11和想想做做第16题。一、说教材1、教学内容的地位、作用……小班科学活动教案木头和玻璃活动目标:1、能区分木制品和玻璃制品。2、通过观察和触摸活动,能探索木头和玻璃的不同特征。3、对探索活动感兴趣。活动准备:经验准备:幼儿能说出周围……微微的造句微微拼音【注音】:weiwei微微解释【意思】:()稍微;略微:一笑。()主单位的一万亿分之一:法拉。微微造句:1、铁路从这里开始有个微微向上的坡……关于半斤八两的造句1、报告证明政府总是明里一套暗里一套,这多少会让他们稍显尴尬,但事实上大家都半斤八两。2、半斤八两,有啥区别,我爸爸说。3、全英唱片业年收入总体5(实际上只有4。7……促织说课。(第一课时)。。重庆武隆白马中学文晓林一、教材分析1《促织》是《聊斋志异》中的一篇具有深刻社会意义的小说。它以明代皇室尚斗促织,并征之于民间,给百姓带来深重苦难为背景,通过描写主人……
秦陵兵马俑教学反思范文教学中如果想仅仅通过课文的语言材料让学生来感受中华民族的灿烂文化和古代人民的无穷智慧,似乎还有点难度。因为,秦陵兵马俑毕竟是两千多年前秦王朝的产物,离学生的生活实际太远太远,这……2019届高考语文第一轮文学常识典故复习8人事情感【贡公喜】《汉书8226;王吉传):王吉字子阳,与贡禹为友,世称‘王阳在位,贡公弹冠,言其取舍同也。庆贺他人做官。唐杜甫《奉赠韦左丞丈二十二韵》:窃效贡公喜,难甘……爱的教育经典好句精选《爱的教育》是一本日记体的小说,写的是一个小学四年级学生安利柯一个学年的生活,期间穿插着老师每月给学生讲述的ldquo;故事rdquo;,还有父母为他写的许多具有启发意义的文章……开国大典第三课时教学设计教学目标、学习典礼开始前的内容,重点体会人们当时的心情。、整体了解作者记叙开国大典的方法,初步学会场面描写的方法。教学过程一、复习导入(略)二、重……Gre六选二近义词词汇总结大全Gre六选二近义词词汇总结大全honorariumn。酬劳金,谢礼indemnificationn。赔偿,赔偿金pecuniaryadj。金钱上的,金钱的pensi……182识字5精品教案第一课时一、情境导入(出示精美课件)教师口述:一个小女孩提着花篮到花园采花,花园里盛开着12朵美丽的鲜花,你想采吗?那可要看你能不能过关。(花心中出示12个生字)你……大班美术我心中的小学的教案【步履目标】一、铺示心中马糊小门生计的想象,培育晋升马糊小学的向去以及深嗜。二、学会用线条以及颜色表达自己的设法主见。【步履豫备】图片教具一组。【步履入……如何指导低年级学生写好字中,好的作业提出表扬,指出小毛病,中等的作业提出普遍存在的问题,差一步的作业先找出局部的优点进行表扬,然后指出整体的不足,提出改正要求。让每一个学生都感觉到自己的进步,提高学生……word2000基本操作新建文档我们讲了word第一课后,有位朋友和我说用起来太麻烦了,问他怎么个麻烦法,他说,有时要打印几份文件,每打印一份就要退出一次word重来,所以特别麻烦。其实根本用不着退出word……中班学习安全意识的教案活动目标1、知道和爸爸妈妈出门应该怎样做才是安全的。2、知道如果自己走失了,应该怎样做。3、培养幼儿的安全和自我保护意识。活动准备1、歌曲〈〈逛公……假想金箍棒阅读及答案阅读文段,回答问题。《西游记》中孙悟空从东海龙王那里借了一根定海神针,又称如意金箍棒,重6250千克,可大可小,变化多端,实在是一件不可多得的宝贝兵器。那么从现代科学的观……大班语言小狐狸画春天教学设计范文活动目标:1、理解故事内容,能说出故事中角色的简单对话,知道春天是播种的季节。2、懂得做事要认真、勤劳。活动准备:1、小猴、小熊、小刺猬和小狐狸头饰。……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网