mysql刷题题后感

news/2024/10/13 12:20:14

  刷题的时候会将一些题目收藏,也会收藏错题,做完了整合一下,会有一些补充知识点。

 

函数篇(和长篇大论的查询有交集)

Q1:

查询语句select stuff('lo ina',3, 1, 've ch')结果为?love

love china

china love

china
答:stuff,删除并加入字符,STUFF(原字符, 开始位置, 删除长度, 插入字符)
从指定的起点处开始删除指定长度的字符,并在此处插入另一组字符,所以这个题的答案应该是 love china

Q2:

1.A中SQL语句查询不出列值为NULL的字段,此时需对字段为NULL的情况另外处理
2.null与任何字段相比都会返回false,为此,oracle提供了一个is null词组判断null。空字符串不是null
查询null的值:select * from student_table where name is null ;
3.查询非null的值,就需要使用is not null词组判断
A的结果只有1001,1005两条记录,<>无法对null做筛选;
C的结果只有1001,1004,1005两条记录,length无法对null做筛选;
D的结果只有1001,1005两条记录,length无法对null做筛选;
B的结果才是正确的!

 

Q3:

   解析:RANK() OVER(PRITITION xxx ORDER BYxxx)作用已经在长篇大论的查询里面讲了。以及over是窗口函数。

补充:

 

Q4:

   解析:正确答案是DF。

   主要是,score不是主键,所以score可能为空。

Q5:

delete删除数据:
delete from <表名> [where条件] 
 

Q6:

   解析:

ROUND() 函数用于把数值字段舍入为指定的小数位数;
TRUNCATE() 函数是按照小数位数进行数值截取,没有四舍五入。
  嗯,就是,D选项是2,C选项是1.9,A选项是2,B选项是2.0,所以C不行。
  也就是说TRUNCATE的参数是从左到右数,比如2.83 后面的0,其实就是不要小数位了。

Q7:

  (这一道题好难分类啊),D选项是错的,字段 = 别名 仅限 SQL Server 。

Q8:

   解析:链接:

1. drop是完全删除表,包括表结构
2. delete是删除表数据,保留表的结构,而且可以加where,只删除一行或者多行
3. truncate 只能删除表数据,会保留表结构,而且不能加where

 

 

连接篇(有一些连接题目我归到长篇大论的查询里面了)

Q1:

Mysql中表student_table(id,name,birth,sex),插入如下记录:
('1001' , '' , '2000-01-01' , '男');
('1002' , null , '2000-12-21' , '男');
('1003' , NULL , '2000-05-20' , '男');
('1004' , '张三' , '2000-08-06' , '男');
('1005' , NULL , '2001-12-01' , '女');
('1006' , '张三' , '2001-12-02' , '女');
执行
select t1.name from
(select * from student_table where sex = '女')t1
inner join
(select * from student_table where sex = '男')t2
on t1.name = t2.name;
的结果行数是()?
4
3
2
1
答:这里的连接是inner join , 内连接,就是左右外连接删掉null的行数。主表是女表,所以说至少有两行,null是不参加配对的,所以应该是1行。
这里是官方解析:inner join时只会对非NULL的记录做join,并且2边都有的才会匹配上,所以结果只有'张三',是1行,选D。

 

Q2:

 具体的解析在长篇大论的查询里面有讲啦,主表是男,所以至少4条,然后由于null是没有办法匹配的(嗯,null和任何值都是false,是比较独立的值,length和<>也不能识别null,嗯,所以有了is NULL 语句),张三那一条又只有一条匹配的,所以最多就是4条。

Q3:

(不放题目了) join 和inner join是等同的。

 

 

 

 

 

长篇大论的查询

Q1:

student_table(id,name,birth,sex),查询男生、女生人数分别最多的3个姓氏及人数。
select *
from (select sex,substr(name,1,1) AS first_name , count(*) AS c1
from student_table where length(name) >= 1 AND sex = '男'
GROUP BY first_name
ORDER BY sex , c1 desc LIMIT 3
)t1
UNION ALL
select *
from(select sex , substr(name , 1,1) AS first_name , count(*) AS c1
from student_table where length(name) >= 1 AND sex = '女'
GROUP BY first_name
ORDER BY sex , c1 desc LIMIT 3
)t2

解析:length是为了避免连姓名都没有。这里GROUP BY不用连接sex,是因为where已经挑出了sex的条件,所以group by就没有必要了,试想一下都是男性没必要通过sex分组啊,这里ORDER BY也加上了sex,其实可以不用加的。还有一个需要注意的,新建的表必须加一下别名。

 我这里贴一下其他的错误选项:

  one.
SELECT sex ,substr(name,1,1) as first_name ,count(*) as c1
from student_table where length(name) >=1 and sex = '男'
group by first_name order by sex ,c1 desc limit 3
union all
SELECT sex ,substr(name,1,1) as first_name ,count(*) as c1
from student_table where length(name) >=1 and sex = '女'
group by first_name order by sex ,c1 desc limit 3 ;

  解析:这选项的错误原因是order by 和 union的优先级问题,union的优先级高过order by。

     建议对比一下正确选项,记一下正确选项的union写法。

在Mysql的参考手册中,并没有对union和order by的优先级进行说明,它建议的方法是,对SQL语句加上(),这样能使SQL的语义更清晰.

  second.

SELECT sex ,substr(name,1,1) as first_name ,count(*) as c1
from student_table where length(name) >=1
group by first_name , sex order by sex ,c1 desc limit 3 ;

   解析:该题目是三条记录,男生女生的人数是不确定。

 

Q2:

 这里写一下正确选项:

SELECT player_id, device_id

FROM(SELECT * ,rank() over (partition by player_id order by event_date ) as rank_date from gamelist )t

WHERE t.rank_date=1

  解析:链接:

Rank()函数:为结果集分区中每一行分配一个排名,行等级由一加上前面的等级指定。
RANK() OVER(
        PARTITION BY 表达式      ##将结果集划分为分区
        ORDER BY 表达式 [ASC|DESC] ##对分区内的进行排序
这里是图示:
全部输出的话:

 单纯将rank输出的话:

   可以看出来,RANK () OVER 就是对那列进行分组,对每一列的event_date排序,然后按从上到下的顺序标等级(rank),讲到这里就应该懂了。

Q3:

 很熟悉对吧,这个专项练习就喜欢考这个。

  full join,在mysql(至少版本8之前包括版本8)都是不支持full join,所以替代语句是left join + right join (语句的实现中间还要加一个union all),接下来是正确选项:

select t1.*,t2.*
from (
select * from student_table where sex = '男' ) t1
left join
(select * from student_table where sex = '女')t2
on t1.name = t2.name
union all
select t1.*,t2.*
from (
select * from student_table where sex = '男' ) t1
right join
(select * from student_table where sex = '女')t2
on t1.name = t2.name
where t1.name is null ;

  同样的,这里也要先select * ,然后加上括号(原因前几题讲过)。

  下面的链接本来是想借一下图的,但是发现写的很好,建议去看下面的链接。

借了一下该链接的数据:MySQL: 图解 inner join、left join、right join、full outer join、union、union all的区别_mysql中union和inner join区别-CSDN博客

 left join: 

   其实就是和left join连着的表是主表,所以直接将表的左边换成主表(也就是说至少是主表的行数),有关系的将右表的相关记录连上,如果没有的就记上null。

right join:

  和left joiin 类似的,嗯,比如说table b RIGHT JOIN table a,其实就可以转换成table a LEFT JOIN table b。然后就和left join 一样了。

   看,只是位置不一样,但是主表是一样的。

full join:

   我们看一下结果,前四行是a left join b,后四行原本是a right join b,然后删去了几行重复的,在下面的例子就是删掉了重复的| 1 | Pirate | 2 | Pirate |和| 3 | Ninja | 4 | Ninja |

所以right join那里要选择null的。

+------+-----------+------+--------+
| id | name | id | name |
+------+-----------+------+--------+
| 1 | Pirate | 2 | Pirate |
| 2 | Monkey | NULL | NULL |
| 3 | Ninja | 4 | Ninja |
| 4 | Spaghetti | NULL | NULL |

| NULL | NULL | 1 | Rutabaga |
| 1 | Pirate | 2 | Pirate |
| NULL | NULL | 3 | Darth Vade |
| 3 | Ninja | 4 | Ninja |
+------+--------+------+------------+

  inner join:

   inner join就是两者都有的记录。

我本以为我学会了,我就不会错了,但是之后我还是载了,因为我不看题目(真的吗)

哦对了,full outer join 和full join 是一样的。

  

Q4:

  收藏的题目,额,应该是想要记录一个点。

   这里是使用min,然后记录一下错误选项:

SELECT player_id, min(event_date) as first_login FROM gameList WHERE min(event_date) GROUP BY player_id

  这个就是语法错误,我想要记录的是各个语句的书写顺序。

  书写顺序:

  select[distinct]
  from
  join(如left join)
  on
  where
  group by
  having
  union
  order by
  limit

  执行顺序:  

  from
  on
  join
  where
  group by
  having
  select
  distinct
  union
  order by

  (对,没错,order by比select 后,选出条件后的表然后再排序,好像是这么一个逻辑,但是也可以先order ,不过这样的数据可能会处理得多。当然这个顺序不要硬记,记几个就可以了,比如order 比 select 慢,union 比 order by 快,遇到了再记。

Q5:

   解析:

MySQL 中使用 REGEXP 来操作正则表达式的匹配。

其中
  • ^ 该符号表示匹配输入字符串的开始位置;
  • $表示匹配输入字符串的末尾位置;
  • [...] 表示匹配所包含的任意一个字符;
  • [^...]表示不能匹配括号内的任意单个字符;
  • x|y 这条竖线表示匹配x 或匹配y。

  所以这道题选c。

Q6:

   解析:

注意MySQL的存储过程和sql server写法不一样。
由题目知道student表中的数据列名为Stu_ID,因此排除C;
变量名定义为s_no,因此排除D;
A和B的差异在于定义s_no时是否有AS,在MySQL中AS是可省略的,因此AB均正确
  上面的官方解析讲了跟没有讲似的。这是推荐参考的链接:存储过程_w3cschool 是mysql的

   题目那个更像是sql server 的格式:  详细实例全面解析SQL存储过程-SQL 教程-w3cschool

   先记一下,之后要写的话写熟悉就行了。

Q7:

 (这种收藏就是为了自己写一遍,很简单的,逻辑是成绩表和学号表的sno联系好找到cid,然后找cid在sno 为1909 的学生选的课程,这样子就是至少)

 

Q8:

 (写这种的时候,真的好痛苦)

创建视图 语句如下 create view 视图名 as select * from 表名 where 条件

先说一下,这一道题选B,B是错的,因为where语句语法不对。

A和C的选项,一个是表示qcontent(题目内容),一个是qcid(题目id),然后都是创建视图的语句,很简单。

D选项
首先select语句中,view_teacher通过as起了别名question_2,所以在select时是找不到view_teacher.tname和view_teacher.v_tid的,因此会报错“Unknown column 'view_teacher.tname' in 'field list'”;其次,在create view语句中,question_2这个别名是找不到的,因此会报错“Table 'test_db.question_2' doesn't exist”。

这一个选项可以看成是先select然后再create(仔细看,select有分号),当然你要是问我为什么要这么做,我只能说我也没见过,不应该是这种写法,select是选出列形成一张表,但是create view确实从view_teacher(question_2)中create,没有逻辑啊。

  

Q9:

   解析:看了官方解析很久,看不太懂突然想了一下有评论区啊。

 (屏蔽的那个是DEFAULT)

Q10:

   解析:alter是改类名的,update是改数据的,在前面还是后面的题讲过,update是数据操纵语言,ALTER确实数据定义语言。

正确的UPDATE更新语法为:

UPDATE table_name SET field1 = new-value1, field2 = new-value2 [WHERE Clause];

所以D选项才是正确的;

A错在没有添加WHERE指定筛选行,所以会更新全部数据!

B错在更新多列数据的间隔符号是逗号,不是AND语句;(注意,这里是逗号,不是AND)

C错在REPLACE函数虽然可以批量修改数据,但是REPLACE的正确语法应该是:

REPLACE INTO tab_name(field1, field2...) VALUES (value1, value2)...;(和INSERT 是同语法)

因此此题用不到REPLACE批量修改的方法。

 

Q11:

已知员工表如下图所示,员工编号依次递增,现需改变相邻员工的编号,当员工总人数为奇数是,不需要改变最后一个员工的编号。下列SQL语句不正确的是()

表employee:

+-----+-----------+

| eno | ename |

+-----+-----------+

| 1 | 小李 |

| 2 | 小王 |

| 3 | 小刚 |

| 4 | 小虎 |

+----+------------+

   解析:评论区解析

首先理解什么叫做改变相邻员工编号:
比如  | 1 | 小李 |   | 2 | 小王 |  | 3 | 小刚 |  | 4 | 小虎 |更改后就是 | 2 | 小李 |   | 1 | 小王 |  | 4 | 小刚 |  | 3 | 小虎 |
所以,如果原来的eno 是偶数,应该减1;(如果原来的eno是奇数,而且不是最后一个员工的话,应该加1;如果原来的eno 是奇数而且是最后一个,eno不改变)
其次是流程控制函数IF()。IF(expr1,expr2,expr3)  如果expr1为真,则返回expr2,否则返回expr3
 eno=(SELECT COUNT(DISTINCT eno) FROM employee) 就是eno 恰好等于员工人数(而员工编号其实没有重复的,所以distinct 意义不大)的情况

   (那个row_NUMBER()有讲过。这个解释是真的好,所以搬过来了)

 

Q12:

   解析:DATEDIFF(d1,d2),计算日期 d1->d2 之间相隔的天数,d1-d2,负值说明前一个日期比后一个小,所以D的意思就是d2是前一天,d1是后一天,d1的kilometer小于d2的了

DATE_ADD()函数
1、定义:函数向日期添加指定的时间间隔。
2、语法:DATE_ADD(date,INTERVAL expr type)

date 参数是合法的日期表达式。
expr 参数是希望添加的时间间隔。

  (其实c选项也是错的)

 

Q13:

   其实就是希望可以写一下,D选项其实也是对的,官方出的答案是C。

  case语句可以在select中出现(在经典题里面也出现了)

 

 

数据库原理篇:(原理嘛,记一下)

Q1:

   官方解析:
数据控制语言DCL,主要用于对用户权限的授权和回收;A选项,DDL主要的命令有CREATE、ALTER、DROP等,大多在建立表时使用;B选项,DML包括SELECT、UPDATE等,对数据库里的数据进行操作;D选项,数据库事务包括COMMIT、ROLLBACK等,主要用于对事务的提交、回收和设置保存点。

补充:DDL , 数据定义语言。DML,数据操纵语言。TCL,事务控制语言,TCL包括COMMIT(提交)命令、ROLLBACK(回滚)命令、SAVEPOINT(保存点)命令:

 

Q2:

下列关于视图的相关概念描述不正确的是()
    • 视图可以解决检索数据时一个表中得不到一个实体所有信息的问题

    • 视图是一种数据库对象,是从数据库的表或其他视图中导出的基表

    • 若基表的数据发生变化,则变化也会自动反映到视图中

    • 数据库存储的是视图的定义,不存放视图对应的数据

解析:视图是虚拟表,视图所引用的表被称为视图的基表。这里选的是B

补充知识点:数据库中为什么要建立视图,它有什么好处?-CSDN博客

只是为了查询某一个信息然后去建立一个和其他表数据高度冗余的表,是不好的,所以就选需要视图。

创建视图的语句:创建视图 语句如下 create view 视图名 as select * from 表名 where 条件

比如:CREATE VIEW view_s AS SELECT * FROM STU WHERE 性别='男'

 

Q3:

 解析是没有什么用的,要看评论区大哥。

 

Q4:

A选项,不能定义一个check约束后,立即在同一个批处理中使用;C选项,Create default,Create rule,Create trigger,Create procedure,Create view等语句同一个批处理中只能提交一个;D选项,不能把规则和默认值绑定到表字段或自定义字段上之后,立即在同一个批处理中使用。

所以B选项正确。

 

Q5:

A选项,结果集为一个值,一般使用=、<、>等运算符;C选项,结果类似于一张虚拟表,父查询中只能使用EXISTS或NOT EXISTS;D选项,通常是利用UNION、EXCEPT、INTERSECT集合运算符实现两个表之间的数据查询。

Q6:

   解析:学生书店图书,是三个实体,实体个数大于两个时为多元联系

   (那个,可能有点没啥关系,一个班级多个学生,是多对一)

Q7:

   解析:链接:

sp_helpindex:查看表中的索引信息,
sp_help:查看有关数据库对象的摘要信息,
sp_helpdb:查看指定数据库或全部数据库信息,
sp_helptext:查看存储过程、视图、触发器等文本信息

Q8:

  解析: 先执行的是where,分组函数是在分组后(即group by)后才能起作用,所以where中的分组函数会报错!其实很多时候要么是语句语法问题,或者语句逻辑问题,要不是语句的优先级问题。

Q9:

   解析:(同样觉得评论很好)

 Q10:

   解析:

 Q11:

   解析:视图是一个虚拟表,c错误,只是相当于临时表,对其中所引用的基础表来说,MySQL视图的作用类似于筛选,自然不能新建一个表。

 

 

 

 

  PS:

    明天再更新,收藏太多了,接下来只会发一下知识点和错题,时不时就点收藏的毛病,现在才写了三分之一。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/26999.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

软件设计师:UML

UML基本概念UML(Unified Modeling Language,统一建模语言) UML词汇表包含3种构造块:事物、关系、图 事物结构事物:静态部分,如类、接口、用例等 行为事物:动态部分,如交互、状态机、活动 分组事物:包Package 注释事物:注释关系 UML中有4种关系:依赖、关联、泛化、实现…

linux13-用户,用户组

linux13-用户,用户组需要root权限执行 group add 创建用户组 # 查看含有关键词catcats66的组, 不存在 getent group | catcats66# 添加用户组catcats66 sudo groupadd catcats66 # 查询到含有关键词catcats66的组 getent group | catcats66groupdel 删除用户组 # 删除用户组 gr…

【VMware vSAN】如何删除虚拟机存储策略中的vSAN默认存储策略。

登录vSphere Client,展开左上角设置-策略和配置文件-虚拟机存储策略,可以查看系统默认创建的虚拟机存储策略。这些存储策略由系统自动生成,其中有一部分存储策略仅用于vSAN数据存储,作为vSAN 默认存储策略以应用于,当在部署虚拟机时未进行自定义存储策略时所默认分配的策略…

探索软件设计的九大核心架构模式

在当今迅速发展的软件开发领域,设计出卓越的软件系统是每一位程序员的追求。软件架构扮演着至关重要的角色,决定了系统的可维护性、可扩展性和性能。本文将深入探讨九大核心架构模式,揭示它们在软件设计中的美妙之处,以及在实际应用中的最佳实践。 分层架构(Layered Archi…

特征重要性评估的随机森林算法与Python实现(三)

特征重要性评估(Variable importance measure, or Feature importance evaluation,VIM)用来计算样本特征的重要性,定量地描述特征对分类或者回归的贡献程度。随机森林(Random Forest)作为一种强大的机器学习算法,在特征重要性评估方面具有显著优势。特征重要新评估是随机森…

社会网络分析及其Python实现

社会网络分析(Social Network Analysis, SNA)在人类学、心理学、社会学、数学以及统计学等领域中发展起来,是综合运用图论、数学模型来研究社会行动者之间的关系或通过这些关系流动的各种有形或无形的东西,如信息、资源等,近年来逐渐成为一种热门的社会科学研究方法。社会…

IDA动态调试解RC4

IDA动态调试解RC4 本篇博客所有内容,均学习于无名侠大佬在bilibili的视频:https://www.bilibili.com/video/BV1WQ4y1X7TY LazyIDA熊猫版:https://github.com/P4nda0s/LazyIDA 实验文件下载:https://github.com/P4nda0s/SycRevLearn有一些算法的加密与解密是相同的算法过程,…

[CISCN 2022 华东北] duck

[CISCN 2022 华东北] duck UAF|leak_libc|leak_heap_base|指针加密|unsortedbin|one_gadget [*] /home/bamuwe/duck/pwnArch: amd64-64-littleRELRO: Full RELROStack: Canary foundNX: NX enabledPIE: PIE enabled$ checksec ./pwn/home/ubuntu/glibc/gl…