其他分享
首页 > 其他分享> > X32专项练习部分28

X32专项练习部分28

作者:互联网

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