刷题的时候会将一些题目收藏,也会收藏错题,做完了整合一下,会有一些补充知识点。
函数篇(和长篇大论的查询有交集)
Q1:
查询语句select stuff('lo ina',3, 1, 've ch')结果为?love
love china
china love
china
答:stuff,删除并加入字符,STUFF(原字符, 开始位置, 删除长度, 插入字符)
从指定的起点处开始删除指定长度的字符,并在此处插入另一组字符,所以这个题的答案应该是 love china
Q2:
查询null的值:select * from student_table where name is null ;
3.查询非null的值,就需要使用is not null词组判断
Q3:
解析:RANK() OVER(PRITITION xxx ORDER BYxxx)作用已经在长篇大论的查询里面讲了。以及over是窗口函数。
补充:
Q4:
解析:正确答案是DF。
主要是,score不是主键,所以score可能为空。
Q5:
Q6:
解析:
Q7:
(这一道题好难分类啊),D选项是错的,字段 = 别名 仅限 SQL Server 。
Q8:
解析:链接:
连接篇(有一些连接题目我归到长篇大论的查询里面了)
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 就是对那列进行分组,对每一列的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:
解析:
题目那个更像是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:
表employee:
+-----+-----------+
| eno | ename |
+-----+-----------+
| 1 | 小李 |
| 2 | 小王 |
| 3 | 小刚 |
| 4 | 小虎 |
+----+------------+
解析:评论区解析
(那个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)
(其实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:
解析:链接:
Q8:
解析: 先执行的是where,分组函数是在分组后(即group by)后才能起作用,所以where中的分组函数会报错!其实很多时候要么是语句语法问题,或者语句逻辑问题,要不是语句的优先级问题。
Q9:
解析:(同样觉得评论很好)
Q10:
解析:
Q11:
解析:视图是一个虚拟表,c错误,只是相当于临时表,对其中所引用的基础表来说,MySQL视图的作用类似于筛选,自然不能新建一个表。
PS:
明天再更新,收藏太多了,接下来只会发一下知识点和错题,时不时就点收藏的毛病,现在才写了三分之一。