2024年10月mysql面试题测试(15个 MySQL 基础面试题,DBA 们准备好了吗)
⑴mysql面试题测试(个MySQL基础面试题,DBA们准备好了吗
⑵个MySQL基础面试题,DBA们准备好了吗
⑶问题:你如何确定MySQL是否处于运行状态?答案:在Debian上运行命令servicemysqlstatus,然后看输出即可。在RedHat或者centos上运行命令servicemysqldstatus,然后看看输出即可。问题:如何开启或停止MySQL服务?答案:运行命令servicemysqldstart开启服务;运行命令servicemysqldstop停止服务。问题:如何通过Shell登入MySQL?答案:运行命令mysql-u用户名-p登陆密码问题:如何列出所有数据库?答案:运行命令showdatabases;问题:如何切换到某个数据库并在上面工作?答案:(运行命令usedatabase_name;(进入名为database_name的数据库。问题:如何列出某个数据库内所有表?答案:在当前数据库运行命令showtables;问题:如何获取表内所有Field对象的名称和类型?答案:运行命令describe表名;简写为desc表名;问题:如何删除表?答案:运行命令droptable表名;问题:如何删除数据库?答案:运行命令dropdatabase数据库名;问题:如何查看表内所有数据?答案:运行命令select*from表名;问题:如何从表(比如oc_users中获取一个field对象(比如uid的所有数据?答案:运行命令selectuidfromoc_users;问题:假设你有一个名为‘xyz’的表,它存在多个字段,如‘createtime’和‘engine’,名为engine的字段由‘Memoty’和‘MyIsam’两种数值组成。如何只列出‘createtime’和‘engine’这两列,并且engine的值为‘MyIsam’?答案:运行命令selectcreate_time,enginefromxyzwhereengine=“MyIsam”;问题:如何列出表‘xrt’内name域值为‘tecmint’,web_address域值为‘tecmint.’的所有数据?答案:运行命令select*fromxrtwherename=“tecmint”andweb_address=“tecmint.”;问题:如何列出表‘xrt’内name域值不为‘tecmint’,web_address域值为‘tecmint.’的所有数据?答案:运行命令select*fromxrtwherename!=“tecmint”andweb_address=“tecmint.”;问题:如何知道表内行数?答案:运行命令selectcount(*)from表名;
⑷Mysql-道经典面试题
⑸有个表S(学生表),C(课程表,SC(学生选课表S(SNO,SNAME代表(学号,姓名C(O,AME,CTEACHER代表(课号,课名,教师SC(SNO,O,SCGRADE代表(学号,课号,成绩问题:,找出没选过“黎明”老师的所有学生姓名。,列出门以上(含门不及格学生姓名及平均成绩。,即学过号课程又学过号课所有学生的姓名。
⑹【MySQL】个经典面试题
⑺开放性问题:据说是腾讯的
⑻关于mysql面试题
⑼数据表加个字段,userid用来记录正在处理的人,进入php页面时,写入该字段。处理完成时,或未处理直接退出时,清空userid记录。其他人进入php页面时判断userid是否为空,不为空则禁止进入。lock和unlockmysql》LOCKTABLESreal_tableWRITE,insert_tableWRITE;mysql》INSERTINTOreal_tableSELECT*FROMinsert_table;mysql》TRUNCATETABLEinsert_table;mysql》UNLOCKTABLES;mysql_insert_id()得到插入的idselectlast_insert_id()
⑽MySQL面试题(无答案版中高级必看
⑾mysql记录存储:mysql的数据是怎么组织的、页内记录的维护(顺序保证/插入策略/页内查询、MySQL内存管理(页面管理、页面淘汰、LRU:全表扫描对内存有什么影响?如何避免热数据被淘汰?没有空闲页怎么办?、InnoDB加锁的过程是如何实现的?常见锁问题有那些?、MV是什么?如何实现多版本控制?如何解决写冲突?、回滚日志Undolog如何实现多版本控制与保证事务的原子性?、undolog如何清理,为何InnoDBselectcount(*)?这么慢?、重做日志Redolog如何实现事务持久性?、InnoDB行级锁、间隙锁、表级锁如何实现的?、InnoDB加锁过程如何实现的?、海量数据下主键如何设计?、聚集索引、二级索引与联合索引具备哪些特点?、在进行索引优化时应该注意哪些问题/、MySQL如何进行库表的优雅设计?、如何实现数据备份之延时库部署、MySQL如何高效实现数据冗余部署、MySQL高可用方案有哪些
⑿个MySQL基础面试题,DBA们准备好了吗
⒀「春招系列」MySQL面试核心问(附答案
⒁篇幅所限本文只写了MySQL题,像其他的Redis,SSM框架,算法,计网等技术栈的面试题后面会持续更新,个人整理的余道面试八股文会放在文末给大家白嫖,最近有面试需要刷题的同学可以直接翻到文末领取。
⒂如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果使用非自增主键(如果身份证号或学号等,由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZETABLE(optimizetable来重建表并优化填充页面。
⒃Server层按顺序执行sql的步骤为:
⒄可以分为服务层和存储引擎层两部分,其中:
⒅服务层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
⒆存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL..版本开始成为了默认的存储引擎。
⒇Drop、Delete、Truncate都表示删除,但是三者有一些差别:
⒈Delete用来删除表的全部或者一部分数据行,执行Delete之后,用户需要提交(mmit)或者回滚(rollback)来执行删除或者撤销删除,会触发这个表上所有的delete触发器。
⒉Truncate删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器,TRUNCATE比Delete更快,占用的空间更小。
⒊Drop命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的DML触发器也不会被触发,这个命令也不能回滚。
⒋因此,在不再需要一张表的时候,用Drop;在想删除部分数据行时候,用Delete;在保留表而删除所有数据的时候用Truncate。
⒌隔离级别脏读不可重复读幻影读READ-UNMITTED未提交读READ-MITTED提交读REPEATABLE-READ重复读SERIALIZABLE可串行化读
⒍MySQLInnoDB存储引擎的默认支持的隔离级别是REPEATABLE-READ(可重读
⒎这里需要注意的是:与SQL标准不同的地方在于InnoDB存储引擎在REPEATABLE-READ(可重读事务隔离级别下使用的是Next-KeyLock锁算法,因此可以避免幻读的产生,这与其他数据库系统(如SQLServer)是不同的。所以说InnoDB存储引擎的默认支持的隔离级别是REPEATABLE-READ(可重读已经可以完全保证事务的隔离性要求,即达到了SQL标准的SERIALIZABLE(可串行化)隔离级别。
⒏因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-MITTED(读取提交内容):,但是你要知道的是InnoDB存储引擎默认使用REPEATABLE-READ(可重读并不会有任何性能损失。
⒐InnoDB存储引擎在分布式事务的情况下一般会用到SERIALIZABLE(可串行化)隔离级别。
⒑主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。
⒒文件与数据库都是需要较大的存储,也就是说,它们都不可能全部存储在内存中,故需要存储到磁盘上。而所谓索引,则为了数据的快速定位与查找,那么索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数,因此B+树相比B树更为合适。数据库系统巧妙利用了局部性原理与磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入,而红黑树这种结构,高度明显要深的多,并且由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性。
⒓最重要的是,B+树还有一个最大的好处:方便扫库。
⒔B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便,而B树不支持,这是数据库选用B+树的最主要原因。
⒕B+树查找效率更加稳定,B树有可能在中间节点找到数据,稳定性不够。
⒖B+tree的磁盘读写代价更低:B+tree的内部结点并没有指向关键字具体信息的指针(红色部分),因此其内部结点相对B树更小。如果把所有同一内部结点的关键字存放在同一块盘中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多,相对来说IO读写次数也就降低了;
⒗B+tree的查询效率更加稳定:由于内部结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引,所以,任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;
⒘视图是一种虚拟的表,通常是有一个表或者多个表的行或列的子集,具有和物理表相同的功能游标是对查询出来的结果集作为一个单元来有效的处理。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。
⒙而在MySQL中,恢复机制是通过回滚日志(undolog实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后在对数据库中的对应行进行写入。当事务已经被提交之后,就无法再次回滚了。
⒚回滚日志作用:)能够在发生错误或者用户执行ROLLBACK时提供回滚相关的信息)在整个系统发生崩溃、数据库进程直接被杀死后,当用户再次启动数据库进程时,还能够立刻通过查询回滚日志将之前未完成的事务进行回滚,这也就需要回滚日志必须先于数据持久化到磁盘上,是我们需要先写日志后写数据库的主要原因。
⒛数据库并发会带来脏读、幻读、丢弃更改、不可重复读这四个常见问题,其中:
脏读:在第一个修改事务和读取事务进行的时候,读取事务读到的数据为,这是修改之后的数据,但是之后该事务满足一致性等特性而做了回滚操作,那么读取事务得到的结果就是脏数据了。
幻读:一般是T在某个范围内进行修改操作(增加或者删除,而T读取该范围导致读到的数据是修改之间的了,强调范围。
丢弃修改:两个写事务TT同时对A=进行递增操作,结果T覆盖T,导致最终结果是而不是,事务被覆盖
不可重复读:T读取一个数据,然后T对该数据做了修改。如果T再次读取这个数据,此时读取的结果和第一次读取的结果不同。
第一个事务首先读取var变量为,接着准备更新为的时,并未提交,第二个事务已经读取var为,此时第一个事务做了回滚。最终第二个事务读取的var和数据库的var不一样。
T读取某个范围的数据,T在这个范围内插入新的数据,T再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。
T和T两个事务都对一个数据进行修改,T先修改,T随后修改,T的修改覆盖了T的修改。例如:事务读取某表中的数据A=,事务也读取A=,事务修改A=A+,事务也修改A=A+,最终结果A=,事务的修改被丢失。
T读取一个数据,T对该数据做了修改。如果T再次读取这个数据,此时读取的结果和第一次读取的结果不同。
悲观锁,先获取锁,再进行业务操作,一般就是利用类似SELECT…FORUPDATE这样的语句,对数据加锁,避免其他事务意外修改数据。当数据库执行SELECT…FORUPDATE时会获取被select中的数据行的行锁,selectforupdate获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。
乐观锁,先进行业务操作,只在最后实际更新数据时进行检查数据是否被更新过。Java并发包中的AtomicFieldUpdater类似,也是利用CAS机制,并不会对数据加锁,而是通过对比数据的时间戳或者版本号,来实现乐观锁需要的版本判断。
分库与分表的目的在于,减小数据库的单库单表负担,提高查询性能,缩短查询时间。
通过分表,可以减少数据库的单表负担,将压力分散到不同的表上,同时因为不同的表上的数据量少了,起到提高查询性能,缩短查询时间的作用,此外,可以很大的缓解表锁的问题。分表策略可以归纳为垂直拆分和水平拆分:
水平分表:取模分表就属于随机分表,而时间维度分表则属于连续分表。如何设计好垂直拆分,我的建议:将不常用的字段单独拆分到另外一张扩展表.将大文本的字段单独拆分到另外一张扩展表,将不经常修改的字段放在同一张表中,将经常改变的字段放在另一张表中。对于海量用户场景,可以考虑取模分表,数据相对比较均匀,不容易出现热点和并发访问的瓶颈。
库内分表,仅仅是解决了单表数据过大的问题,但并没有把单表的数据分散到不同的物理机上,因此并不能减轻MySQL服务器的压力,仍然存在同一个物理机上的资源竞争和瓶颈,包括CPU、内存、磁盘IO、网络带宽等。
分库与分表带来的分布式困境与应对之策数据迁移与扩容问题----一般做法是通过程序先读出数据,然后按照指定的分表策略再将数据写入到各个分表中。分页与排序问题----需要在不同的分表中将数据进行排序并返回,并将不同分表返回的结果集进行汇总和再次排序,最后再返回给用户。
不可重复读的重点是修改,幻读的重点在于新增或者删除。
视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图可以简化复杂的sql操作,隐藏具体的细节,保护数据;视图创建后,可以使用与表相同的方式利用它们。
视图不能被索引,也不能有关联的触发器或默认值,如果视图本身内有orderby则对视图再次orderby将被覆盖。
创建视图:createviewxxxasxxxx
对于某些视图比如未使用联结子查询分组聚集函数DistinctUnion等,是可以对其更新的,对视图的更新将对基表进行更新;但是视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新。
B+tree的磁盘读写代价更低,B+tree的查询效率更加稳定数据库索引采用B+树而不是B树的主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。
在最频繁使用的、用以缩小查询范围的字段,需要排序的字段上建立索引。不宜:对于查询中很少涉及的列或者重复值比较多的列对于一些特殊的数据类型,不宜建立索引,比如文本字段(text等。
如果一个索引包含(或者说覆盖所有需要查询的字段的值,我们就称之为“覆盖索引”。
我们知道在InnoDB存储引擎中,如果不是主键索引,叶子节点存储的是主键+列值。最终还是要“回表”,也就是要通过主键再查找一次,这样就会比较慢。覆盖索引就是把要查询出的列和索引是对应的,不做回表操作!
学号姓名性别年龄系别专业李辉男计算机软件开发张明男计算机软件开发王小玉女物理力学李淑华女生物动物学赵静男化学食品化学赵静女生物植物学
主键为候选键的子集,候选键为超键的子集,而外键的确定是相对于主键的。
sql面试题题(mysql版
--插入学生表测试数据insertintoStudentvalues(’’,’赵雷’,’--’,’男’);insertintoStudentvalues(’’,’钱电’,’--’,’男’);insertintoStudentvalues(’’,’孙风’,’--’,’男’);insertintoStudentvalues(’’,’李云’,’--’,’男’);insertintoStudentvalues(’’,’周梅’,’--’,’女’);insertintoStudentvalues(’’,’吴兰’,’--’,’女’);insertintoStudentvalues(’’,’郑竹’,’--’,’女’);insertintoStudentvalues(’’,’王菊’,’--’,’女’);--课程表测试数据insertintoCoursevalues(’’,’语文’,’’);insertintoCoursevalues(’’,’数学’,’’);insertintoCoursevalues(’’,’英语’,’’);--教师表测试数据insertintoTeachervalues(’’,’张三’);insertintoTeachervalues(’’,’李四’);insertintoTeachervalues(’’,’王五’);--成绩表测试数据insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);insertintoScorevalues(’’,’’,);
--、查询““课程比““课程成绩高的学生的信息及课程分数selectc.*,a.s_scoreas课程score,b.s_scoreas课程scorefromscorea,scorebleftjoinstudentconb.s_id=c.s_idwherea.s_id=b.s_idanda.c_id=’’andb.c_id=’’anda.s_score》b.s_score;
--、查询““课程比““课程成绩低的学生的信息及课程分数selecta.*,b.s_scoreas课程,c.s_scoreas课程fromstudentajoinscorebona.s_id=b.s_idandb.c_id=’’leftjoinscoreconb.s_id=c.s_idandc.c_id=’’whereb.s_score《c.s_score;
--、查询平均成绩大于等于分的同学的学生编号和学生姓名和平均成绩selecta.s_id,a.s_name,round(avg(b.s_score),)as平均成绩fromstudentajoinscorebona.s_id=b.s_idgroupbyb.s_idhaving平均成绩》=;备注:round里,round是四舍五入函数,代表保留位小数
--、查询平均成绩小于分的同学的学生编号和学生姓名和平均成绩--(包括有成绩的和无成绩的)selectb.,round(avg(a.s_score),)as平均成绩fromstudentbleftjoinscoreaonb.s_id=a.s_idgroupbya.s_idhaving平均成绩《unionselectb.,as平衡成绩fromstudentbwhereb.s_idnotin(selects_idfromscore);
--、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩selecta.s_id,a.s_name,count(b.c_id)as选课总数,sum(b.s_score)as总分fromstudentaleftjoinscorebona.s_id=b.s_idgroupbys_id;
--、查询“李“姓老师的数量selectcount(*)as李姓老师数量fromteacherwheret_namelike’李%’;
--、查询学过“张三“老师授课的同学的信息selecta.*fromstudentajoinscorebona.s_id=b.s_idwhereb.c_idin(selectc.c_idfromcoursecjointeacherdonc.t_id=d.t_idwhered.t_name=’张三’);
--、查询没学过“张三“老师授课的同学的信息selecta.*fromstudentaleftjoinscorebona.s_id=b.s_idwherea.s_idnotin(selects_idfromscorewherec_id=(selectc_idfromcoursewheret_id=(selectt_idfromteacherwheret_name=’张三’)))groupbya.s_id;
--、查询学过编号为““并且也学过编号为““的课程的同学的信息select*fromstudentwheres_idin(selecta.s_idfromscoreajoinscorebona.s_id=b.s_idwherea.c_id=’’andb.c_id=’’);
--、查询学过编号为““但是没有学过编号为““的课程的同学的信息select*fromstudentwheres_idin(selects_idfromscorewherec_id=’’)ands_idnotin(selects_idfromscorewherec_id=’’);
--、查询没有学全所有课程的同学的信息select*fromstudentwheres_idnotin(selects_idfromscoregroupbys_idhavingcount(c_id)=);
--、查询至少有一门课与学号为““的同学所学相同的同学的信息selectdistincta.*fromstudentaleftjoinscorebona.s_id=b.s_idwhereb.c_idin(selectc_idfromscorewheres_id=’’)anda.s_id!=’’;注意:distinct是去重的
--、查询和““号的同学学习的课程完全相同的其他同学的信息select*fromstudentwheres_idin(selects_idfromscoregroupbys_idhavingcount(c_id)=(selectcount(c_id)fromscorewheres_id=’’)ands_idnotin(selects_idfromscorewherec_idnotin(selectc_idfromscorewheres_id=’’))ands_id!=’’);
--、查询没学过“张三“老师讲授的任一门课程的学生姓名selects_namefromstudentwheres_idnotin(selects_idfromscorewherec_idin(selectc_idfromcoursewheret_idin(selectt_idfromteacherwheret_name=’张三’)));
--、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩selecta.s_id,b.s_name,round(avg(a.s_score),)as平均成绩fromscorealeftjoinstudentbona.s_id=b.s_idwheres_score《groupbys_idhavingcount()》=;或者试试selecta.s_id,b.s_name,round(avg(a.s_score),)as平均成绩fromscorealeftjoinstudentbona.s_id=b.s_idwherea.s_score《groupbya.s_idhavingcount(*)》=;
--、检索““课程分数小于,按分数降序排列的学生信息selecta.*,b.c_id,b.s_scorefromstudentaleftjoinscorebona.s_id=b.s_idwhereb.c_id=’’andb.s_score《orderbyb.s_scoredesc;
--、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩selecta.s_name,sum(casewhenb.c_id=’’thens_scoreelsenullend)as语文,sum(casewhenb.c_id=’’thens_scoreelsenullend)as数学,sum(casewhenb.c_id=’’thens_scoreelsenullend)as英语,round(avg(s_score),)as平均成绩fromstudentaleftjoinscorebona.s_id=b.s_idgroupbya.s_nameorderby平均成绩desc;
--.查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率--及格为》=,中等为:-,优良为:-,优秀为:》=selectb.c_id,b.c_name,max(a.s_score)as最高分,min(a.s_score)as最低分,round(avg(a.s_score),)as平均分,round(sum(casewhena.s_score》=thenelseend)/count(s_id),)as及格率,round(sum(casewhena.s_score》=anda.s_score《thenelseend)/count(s_id),)as中等率,round(sum(casewhena.s_score》=anda.s_score《thenelseend)/count(s_id),)as优良率,round(sum(casewhena.s_score》=thenelseend)/count(s_id),)as优秀率fromscorealeftjoincoursebona.c_id=b.c_idgroupbyb.c_id;
--、按各科成绩进行排序,并显示排名第一种:setpre_c_id:=’’;setrank:=;selecttb.s_id,tb.c_id,tb.s_score,tb.排名from(select*,(casewhentb.c_id=pre_c_idthenrank:=rank+elserank:=end)as排名,(casewhenpre_c_id=tb.c_idthenpre_c_idelsepre_c_id:=tb.c_idend)aspre_c_idfrom(select*fromscoreorderbyc_id,s_scoredesc)tb)tb;
如果看不懂用第二种方法:SELECTa.c_id,a.s_id,a.s_score,COUNT(b.s_score)+AS排名FROMscoreaLEFTJOINscorebONa.s_score《b.s_scoreANDa.c_id=b.c_idGROUPBYa.c_id,a.s_id,a.s_scoreORDERBYa.c_id,排名,a.s_idASC
--、查询学生的总成绩并进行排名setrank:=;select*,(rank:=rank+)asrankfrom(selects_id,sum(s_score)as总成绩fromscoregroupbys_idorderby总成绩desc)tb;
--、查询不同老师所教不同课程平均分从高到低显示selecta.c_id,d.t_name,round(avg(a.s_score))as平均分fromscorealeftjoinstudentbona.s_id=b.s_idleftjoincoursecona.c_id=c.c_idleftjointeacherdonc.t_id=d.t_idgroupbya.c_idorderby平均分desc;
--、查询所有课程的成绩第名到第名的学生信息及该课程成绩setpre_c_id:=’’;setrank:=;selectb.s_name,tb.s_id,tb.c_id,tb.s_score,tb.排名from(select*,(casewhentb.c_id=pre_c_idthenrank:=rank+elserank:=end)as排名,(casewhenpre_c_id=tb.c_idthenpre_c_idelsepre_c_id:=tb.c_idend)aspre_c_idfrom(select*fromscoreorderbyc_id,s_scoredesc)tb)tbjoinstudentbontb.s_id=b.s_idwhere排名=or排名=;
--、统计各科成绩各分数段人数:课程编号,课程名称,及所占百分比selectb.c_id,b.c_name,sum(casewhena.s_score》=thenelseend)as-,concat(round(sum(casewhena.s_score》=thenelseend)/count(),),’%’)as百分比,sum(casewhena.s_score《anda.s_score》=thenelseend)as-,concat(round(sum(casewhena.s_score《anda.s_score》=thenelseend)/count(),),’%’)as百分比,sum(casewhena.s_score《anda.s_score》=thenelseend)as-,concat(round(sum(casewhena.s_score《anda.s_score》=thenelseend)/count(),),’%’)as百分比,sum(casewhena.s_score《anda.s_score》=thenelseend)as-,concat(round(sum(casewhena.s_score《anda.s_score》=thenelseend)/count(),),’%’)as百分比fromscorealeftjoincoursebona.c_id=b.c_idgroupbyb.c_id;
--、查询学生平均成绩及其名次selecttb.*,(rank:=rank+)asrankfrom(selects_id,round(avg(s_score),)as平均成绩fromscoregroupbys_idorderby平均成绩desc)tb,(selectrank:=)b;
--、查询各科成绩前三名的记录setpre_c_id:=’’;setrank:=;selectb.s_name,tb.s_id,tb.c_id,tb.s_score,tb.排名from(select*,(casewhentb.c_id=pre_c_idthenrank:=rank+elserank:=end)as排名,(casewhenpre_c_id=tb.c_idthenpre_c_idelsepre_c_id:=tb.c_idend)aspre_c_idfrom(select*fromscoreorderbyc_id,s_scoredesc)tb)tbjoinstudentbontb.s_id=b.s_idwhere排名《;
--、查询每门课程被选修的学生数selectc_id,count(s_id)as选修人数fromscoregroupbyc_id;
--、查询出只有两门课程的全部学生的学号和姓名selecta.s_id,b.s_namefromscorealeftjoinstudentbona.s_id=b.s_idgroupbys_idhavingcount(*)=;
--、查询男生、女生人数selectsum(cases_sexwhen’男’thenelseend)as男生人数,sum(cases_sexwhen’女’thenelseend)as女生人数fromstudent;
--、查询名字中含有“风“字的学生信息select*fromstudentwheres_namelike’%风%’;
--、查询同名同性学生名单,并统计同名人数--略,不想写
--、查询年出生的学生名单select*fromstudentwheres_birthlike’%’;
--、查询每门课程的平均成绩,结果按平均成绩降序排列,平均成绩相同时,按课程编号升序排列selectc_id,round(avg(s_score),)as平均成绩fromscoregroupbyc_idorderby平均成绩desc,c_idasc;
--、查询平均成绩大于等于的所有学生的学号、姓名和平均成绩selecta.s_id,b.s_name,round(avg(s_score),)as平均成绩fromscorealeftjoinstudentbona.s_id=b.s_idgroupbya.s_idhaving平均成绩》=;
--、查询课程名称为“数学“,且分数低于的学生姓名和分数selectb.s_name,a.s_scorefromscorealeftjoinstudentbona.s_id=b.s_idwherea.c_id=(selectc_idfromcoursewherec_name=’数学’)anda.s_score《;
--、查询所有学生的课程及分数情况;selectb.s_name,sum(casewhena.c_id=’’thena.s_scoreelsenullend)as语文,sum(casewhena.c_id=’’thena.s_scoreelsenullend)as数学,sum(casewhena.c_id=’’thena.s_scoreelsenullend)as英语fromscorearightjoinstudentbona.s_id=b.s_idgroupbyb.s_name
--、查询任何一门课程成绩在分以上的姓名、课程名称和分数;selectb.s_name,sum(casewhena.c_id=’’thena.s_scoreelsenullend)as语文,sum(casewhena.c_id=’’thena.s_scoreelsenullend)as数学,sum(casewhena.c_id=’’thena.s_scoreelsenullend)as英语fromscorearightjoinstudentbona.s_id=b.s_idgroupbyb.s_namehaving语文》=or数学》=or英语》=;
--、查询不及格的课程selecta.s_id,a.c_id,b.c_name,a.s_scorefromscorealeftjoincoursebona.c_id=b.c_idwherea.s_score《;
--、查询课程编号为且课程成绩在分以上的学生的学号和姓名;selecta.s_id,b.s_namefromscorealeftjoinstudentbona.s_id=b.s_idwherea.c_id=’’anda.s_score》=;
--、求每门课程的学生人数selectc_id,count(*)as学生人数fromscoregroupbyc_id;
--、查询选修“张三“老师所授课程的学生中,成绩最高的学生信息及其成绩selecta.*,b.c_id,max(b.s_score)as最高成绩fromstudentarightjoinscorebona.s_id=b.s_idgroupbyb.c_idhavingb.c_id=(selectc_idfromcoursewheret_id=(selectt_idfromteacherwheret_name=’张三’));
--、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩--(这题我搞不清题目是什么意思,是指查找学生个体参加了的所有课程的成绩各不相同的那个学生信息呢?还是所有课程之间做对比呢,我更倾向于理解为前者
--理解为前者的写法select*from(select*fromscoregroupbys_id,s_score)tbgroupbys_idhavingcount(*)=;
--理解为后者的写法selectdistincta.s_id,a.c_id,b.s_scorefromscorea,scorebwherea.c_id!=b.c_idanda.s_score=b.s_score;
--、查询每门课程成绩最好的前两名setpre_c_id:=’’;setrank:=;selecttb.s_id,tb.c_id,tb.s_scorefrom(select*,(casewhentb.c_id=pre_c_idthenrank:=rank+elserank:=end)as排名,(casewhenpre_c_id=tb.c_idthenpre_c_idelsepre_c_id:=tb.c_idend)aspre_c_idfrom(select*fromscoreorderbyc_id,s_scoredesc)tb)tbjoinstudentbontb.s_id=b.s_idwhere排名《;
--、统计每门课程的学生选修人数(超过人的课程才统计。要求输出课程号和选修人数,查询结果按人数降序排列,若人相同,按课程号升序排列selectc_id,count(*)as选修人数fromscoregroupbyc_idhaving选修人数》orderby选修人数desc,c_idasc;
--、检索至少选修两门课程的学生学号selects_idfromscoregroupbys_idhavingcount(*)》=;
--、查询选修了全部课程的学生信息select*fromstudentwheres_idin(selects_idfromscoregroupbys_idhavingcount(*)=)
--、查询各学生的年龄selects_name,(date_format(now(),’%Y’)-date_format(s_birth,’%Y’)+(CASEwhendate_format(now(),’%m%d’)》=date_format(s_birth,’%m%d’)thenelseend))asagefromstudent
--、查询本周过生日的学生---(实现得并不完全,因为例如出生月日为‘-’在每一年可能会输入不同周select*fromstudentwhereweek(date_format(s_birth,’%m%d’))=week(date_format(now(),’%m%d’));
--、查询下周过生日的学生select*fromstudentwhereweek(date_format(s_birth,’%m%d’))=week(date_format(date_add(now(),interval-dayofweek(now())+day),’%m%d’));
--、查询本月过生日的学生select*fromstudentwheredate_format(s_birth,’%m’)=date_format(now(),’%m’)
--、查询下月过生日的学生select*fromstudentwheredate_format(s_birth,’%m’)=date_format(date_add(now(),intervalmonth),’%m’)
个MySQL基础面试题,DBA们准备好了吗
非常简单的:SELECT`class`,SUM(CASEWHENscore》=THENELSEEND),SUM(CASEWHENscore》=THENELSEEND)FROMtbGROUPBY主要是考试GROUPBY分组统计,CASEWHENTHENELSEEND分情形功能,这个是非常典型的应用,几乎所有的数据库都支持上面的语句。