ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

X32专项练习部分28

2021-11-29 21:34:22  阅读:191  来源: 互联网

标签:X32 itemid 练习 28 score SELECT where id select


X32专项练习部分28

多表查询和表连接例题

/*
    有两张表,如下图所示
    表A(仅列出部分数据作参考)
    Order_id        User_id  Add_time
    11701245001     10000    1498882474
    11701245002     10001    1498882475
    表B(仅列出部分数据作参考)
    id  Order_id       goods_id  price
    1   11701245001    1001      10
    2   11701245001    1002      20
    3   11701245002    1001      10
    问:用SQL查询 购买过goods_id 为1001的用户user_id

    正确答案:BCD

    select user_id from A where order_id = (select order_id from B where goods_id = '1001')

    select a.user_id from A a,B b where a.order_id=b.order_id and b.goods_id='1001'

    select user_id from A where order_id in (select order_id from B where goods_id = '1001')

    select A.user_id from A left join B on A.order_id=B.order_id where B.goods_id='1001'

    返回多个结果的子查询,外层where不能用"=",需要用in

    B选项使用了多表查询,分别为2张表起别名

    D选项使用左连接
    左连接,返回左边表中所有记录和右边表中链接字段相等的记录

    这道题D选项明显不严谨,on只限制了右表的哪些数据需要和左表合并
    相比于内连接,D选项where语句过滤出去的数据较多
    所以不如用内连接
    on作为限制条件,where进行筛选过滤
     */

统计表数据忽略null值的情况

/*
    表结构如下

    CREATE TABLE `score` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `sno` int(11) NOT NULL,
      `cno` tinyint(4) NOT NULL,
      `score` tinyint(4) DEFAULT NULL,
      PRIMARY KEY (`id`)
    );

        以下查询语句结果一定相等的是()
        A.SELECT sum(score) / count(*) FROM score WHERE cno = 2;

        B.SELECT sum(score) / count(id) FROM score WHERE cno = 2;

        C.SELECT sum(score) / count(sno) FROM score WHERE cno = 2;

        D.SELECT sum(score) / count(score) FROM score WHERE cno = 2;

        E.SELECT sum(score) / count(1) FROM score WHERE cno = 2;

        F.SELECT avg(score) FROM score WHERE cno = 2;

    正确答案:
    D,F 查询结果一样
    A,B,C,E 查询结果一样

    下面插入几条数据
    id  sno  cno  score
    01  11   99   88
    02  12   96   64
    03  13   92   66
    04  14   90   null
    05  15   68   70

    所有的统计函数都会忽略空值(null)。
    A:统计所有学生的平均分,就算成绩为空的学生,最后计算count(*)时也作为分母基数
        计算得到所有学生的平均分
    B:与A一样,因为id主键非空,count(id)所得分母基数是所有学生
    C:与B一样,非空属性sno,计算的结果也是所有学生的平均分
    D:由于score字段的值可能是空,空值在统计时忽略
        所以count(score)和sum(score)统计的只是score不为空的学生
        计算得到的平均分也只是有成绩的学生的平均分,无法计算所有学生的平均分
    E:count(1)与count(*)一样,不会忽略null值,本质是计算行数
    F:avg(score)会忽略空值
        故计算结果为有成绩的学生的平均分
     */

对SQL基本语言的了解

/*
    SQL中,下面对于数据定义语言DDL描述正确的是()
        正确答案: D
        DDL关心的是数据库中的数据
        联盟链
        控制对数据库的访问
        定义数据库的结构

    DDL(Data Definition Language): 数据定义语言
        用来定义数据库对象:数据库,表,列等; 关键字:create,drop, alter等;
    DML(Data Manipulation Language): 数据操作语言
        用来对数据库中的表进行增删改操作; 关键字:insert,delete,update等;
    DQL(Data Query Language): 数据查询语言
        用来查询数据库中表的记录(数据); 关键字:select, where等
    DCL(Data Control Language): 数据控制语言
        用来定义数据库的访问控制权限和安全级别,及创建用户;关键字: grant, revoke等
     */

DATEDIFF函数的使用

/*
    请取出 BORROW表中日期(RDATE字段)为当天的所有记录?(RDATE字段为datetime型,包含日期与时间)。SQL语句实现正确的是:(      )
        正确答案: A
        select * from BORROW where datediff(dd,RDATE,getdate())=0
        select * from BORROW where RDATE=getdate()
        select * from BORROW where RDATE-getdate()=0
        select * from BORROW where RDATE > getdate()
     */

在这里插入图片描述

多表查询的复杂操作

/*
    大学生春季运动会的数据库,保存了比赛信息的三个表如下:

    运动员 sporter(运动员编号 sporterid,姓名name,性别 sex,所属系号 department)
    项目 item(项目编号 itemid,名称 itemname,比赛地点 location)
    成绩 grade(运动员编号 id,项目编号 itemid,积分 mark)
    temp (项目id iid,单个项目最高分)

    用SQL语句完成在“体育馆”(比赛地点)进行比赛的各项目名称及其冠军的姓名,正确的是:

        SELECT i.itemname,s.name FROM grade g,
          (SELECT itemid iid,MAX(mark) max FROM grade WHERE itemid IN
          (SELECT itemid FROM item WHERE location='体育馆') GROUP BY itemid) temp,
          item i,
          sporter s
        WHERE g.itemid=temp.iid AND
            g.mark=temp.max AND
            temp.iid=i.itemid AND
            s.sporterid=g.sporterid;

    注意:
    积分最多的是冠军
    要求查找的是各项目的冠军
    
    1,首先找出在“体育馆”中进行的比赛项目id;
    SELECT itemid
    FROM item
    WHERE location='体育馆'

    2,然后在成绩表中根据项目id进行分组后找出单个项目最高分;
    SELECT itemid iid,MAX(mark) max 
    FROM grade 
    WHERE itemid IN (SELECT itemid FROM item WHERE location='体育馆')
    GROUP BY itemid

    3,接下来将上面含有项目id和项目最高分信息的表与另外三张表连接;
    grade g, (上面含有项目最高分信息的表) temp, item i,sporter s 
    WHERE g.itemid=temp.iid 
    AND g.mark=temp.max 
    AND temp.iid=i.itemid 
    AND s.sporterid=g.sporterid

    4,最后按要求从连接后的表中选出项目名称和冠军姓名。
    SELECT i.itemname,s.name 
    FROM (以上连接后的表)
     */

在这里插入图片描述

行转列输出记录

在这里插入图片描述

	/*
    错误答案C:没达到行转列的目的
    select sno,
        case when class='english' then score else 0 end ,
        case when class='math' then score else 0 end
    from sc
    where class in('english','math')
    结果:一个学生最终会出现两条记录(英语和数学)
    每条记录都是满足当前class条件的那门课程成绩正常,其余课程成绩为0
    张三 80 0
    张三 0 79
    王五 60 0
    王五 0 88

    修改为:
    select sno,
    	sum(case when class='english' then score else 0 end ) as english,
    	sum(case when class='math' then score else 0 end) as math
    from sc
    where class in('english','math')
    group by sno; -- 关键在这里

    正确答案D:
    select sno,
    	sum(if(class='english',score,0)) as english,
    	sum(if(class='math',score,0) ) as math
    from sc
    where class in('english','math')
    group by sno
    如果科目为English为真,English成绩+score,否则+0
    结果:
    张三 80 79
    王五 60 88
     */

平衡二叉查找树的判断

/*
    下列各树形结构中,哪些是平衡二叉查找树

       	      4
             / \
            3   5
           /     \
          2       8
         /         \
        1           9

        	  7
             / \
            2   8
           / \
          1   4
             / \
            3   5

    	       5
             /   \
            2     8
           / \   /
          1   4 7
             /
            3

     		    7
              /   \
             2     8
            / \   /
           1   4 6
              /
             3

    正确答案:第3个(C)
    二叉平衡查找树:
    左子树中所有节点的值小于根的值,右子树中的所有节点的值大于根的值
    左右子树的高度之差的绝对值为0或1

    A选项,以结点3为例,它的左子树高度为2,右子树高度为0,差的绝对值为2,违反第2条
    B选项,以结点7为例,它的左子树高度为3,右子树高度为1,差的绝对值为2,违反第2条
    D选项,以结点7为例,它的右子树中有结点6,6<7,违反第1条
    
    A选项具有迷惑性,需要引起注意
     */

二分法查找查找不存在元素比较次数

/*
    一个长度为32的有序表,若采用二分查找一个不存在的元素
    则比较次数最多是()
        正确答案: C
        4
        5
        6
        7

    可以把长度为32的有序表看成二叉树
    建成一个完全二叉树,32个元素的树高度为6
    也就是最坏情况下
    查找元素正好是第6层的叶子节点
    比较次数就是6次
     */

总目录

标签:X32,itemid,练习,28,score,SELECT,where,id,select
来源: https://blog.csdn.net/m0_54608045/article/details/121577312

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有