• mysql经典面试题


    数据库优化:
    这个优化法则归纳为5个层次:
    1、 减少数据访问(减少磁盘访问)
    2、 返回更少数据(减少网络传输或磁盘访问)
    3、 减少交互次数(减少网络传输)
    4、 减少服务器CPU开销(减少CPU及内存开销)
    5、 利用更多资源(增加资源)

    我们一般在什么字段上建索引?
    这是一个非常复杂的话题,需要对业务及数据充分分析后再能得出结果。主键及外键通常都要有索引,其它需要建索引的字段应满足以下条件:
    1、字段出现在查询条件中,并且查询条件可以使用索引;
    2、语句执行频率高,一天会有几千次以上;
    3、通过字段条件可筛选的记录集很小,那数据筛选比例是多少才适合?
    这个没有固定值,需要根据表数据量来评估,以下是经验公式,可用于快速评估:
    小表(记录数小于10000行的表):筛选比例<10%;
    大表:(筛选返回记录数)<(表总记录数*单条记录长度)/10000/16
    单条记录长度≈字段平均内容长度之和+字段数*2

    -- 当前时间
    select CURTIME();
    -- 当前日期
    select NOW();
    -- 查询当天数据
    select * from 表名 where TO_DAYS(时间字段)=TO_DAYS(NOW());
    -- 查询本周的数据
    SELECT * FROM 表名 WHERE YEARWE--EK(date_format(时间字段,'%Y-%m-%d')) = YEARWEEK(now());
    -- 最近7天
    SELECT * FROM 表名 where date_sub(curdate(), INTERVAL 7 DAY) <= date (时间字段);
    -- 查询本月的数据
    select * from 表名 where DATE_FORMAT(时间字段,'%Y%m') =DATE_FORMAT(CURDATE(),'%Y%m');
    -- 上一月
    SELECT * FROM 表名 WHERE PERIOD_DIFF( date_format( now( ) , '%Y%m' ) , date_format( 时间字段名, '%Y%m' ) ) =1

    /*-----------------------------------------第一大题--------------------------------------------------*/

    S(SO,SN,SD,SA) 学号,学员姓名,所属单位,学员年龄

    C(CO,CN)课程编号,课程名称

    SC_1(SO,CO,G)学号,所选修的课程编号,学习成绩

    /*1 查询选修课程名为‘税收基础的学员学号和姓名’*/
    --方法一:连接查询

    SELECT s.SO,s.SN FROM S s,C c,sc_1 sc
    where c.CN='税收基础'
    and s.so=sc.SO and sc.co=c.CO;

    --方法二:嵌套查询
    SELECT so,sn from s
    where so in(
    SELECT so from sc_1 where co in (
    SELECT co from c where cn='税收基础'
    )
    )

    /*2 查询选修课程编号为‘c002’学员姓名和所属单位’*/
    --方法一:连接查询
    SELECT s.SN,s.SD from s s,c c,sc_1 sc
    where c.co='c002'
    and c.co=sc.CO and s.so=sc.so;

    --方法二:嵌套查询
    SELECT sn,sd from s
    where so in(
    SELECT so from sc_1 where co IN (
    SELECT co from c
    where co='c002'
    )
    )

    /*3 查询不选修课程编号为‘c005的学员姓名跟所属单位’*/
    SELECT sn,sd from s
    where so not IN
    (select so from sc_1 WHERE co='C005');

    /*4 查询选修全部课程学员姓名和所属单位’*/
    SELECT sn,sd from s
    where so in
    (
    SELECT so from sc_1
    GROUP BY so
    HAVING COUNT(co)=(SELECT COUNT(co) FROM c)
    );

    /*5 查询选修了课程的学员人数*/
    SELECT COUNT(DISTINCT so) as 选修课程人数 from sc_1;

    /*6 查新选修课程大于5门的学员姓名跟所属单位*/
    SELECT sn,sd from s
    where so IN
    (SELECT so from sc_1
    GROUP BY so
    HAVING COUNT(so)>5
    );

    /*-----------------------------------------第二大题--------------------------------------------------*/

    S(SNO,SNAME)学生关系,SNO学号,SNAME姓名

    C(CNO,CHAME,CTEACHER)课程关系,CNO课程号,CHAME课程名,任课老师

    SC(SNO,CNO,SCGRADE)选课关系,SCGRADE成绩

    /*第一题 找出没有选修过李明老师的课程的所有学生*/
    SELECT s.sname FROM student s
    where sno not IN
    (SELECT DISTINCT(sc1.cno) from class c,sc sc1,student s
    where c.cno=sc1.cno and sc1.sno=s.sno
    and c.cteacher='李明'
    );


    /*第二题 列出有两门以上不及格课程的学生姓名跟平均成绩*/
    select s.sname as 学生姓名,avg(ssc.scgrade) as 平均成绩 from student s
    ,sc ssc,(select sno from sc
    where scgrade<60
    GROUP BY sno
    HAVING COUNT((cno)>=2)) a
    where s.sno=a.sno and ssc.sno=a.sno
    GROUP BY s.sno,s.sname;


    /*第三题 列出既学过1号课程又学过2号课程的学生姓名*/
    Select s.sno,s.sname FROM student s
    where s.sno in
    (
    Select sc2.sno FROM sc sc2,class c2 Where sc2.cno=c2.cno AND c2.cno IN('1','2')
    GROUP BY sc2.sno
    HAVING COUNT(DISTINCT c2.cno)=2
    );

    /*第四题 列出1号课成绩比2号该门课成绩高的所有学生学号*/
    SELECT sc1.sno as 学生编号 from sc sc1,sc sc2 where
    sc1.cno='1'
    and sc2.cno='2'
    and sc1.sno=sc2.sno
    and sc1.scgrade>sc2.scgrade;

    /*第五 列出1号课成绩比2号同学课成绩高的所有学生学号以及1号跟2号课成绩*/

    SELECT sc1.sno as 学生编号,sc1.scgrade as 语文成绩,sc2.scgrade as 数学成绩 from sc sc1,sc sc2 where
    sc1.cno='1'
    and sc2.cno='2'
    and sc1.sno=sc2.sno
    and sc1.scgrade>sc2.scgrade

  • 相关阅读:
    80.共享内存实现进程通信
    79.cgi硬盘查询个人信息
    78.pipe多管道云端,客户端通信
    77.邮槽通信
    76.CGI编码
    strnpy函数
    POJ 1258 Agri-Net(Prim算法)
    0X7FFFFFFF,0X80000000
    Visual C++中min()和max()函数的使用
    POJ 2421 Constructing Roads(Kruskal算法)
  • 原文地址:https://www.cnblogs.com/lwh-note/p/8921924.html
Copyright © 2020-2023  润新知