mysql刷题题后感

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

  题目来源是牛客网。牛客网公司真题_免费模拟题库_企业面试|笔试真题 (nowcoder.com)

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

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

Q9:

   解析:

考察IN 与BETWEEN AND的区分 (数字型)
1.in (xx,xx,xx,...)  通常是不连续的
2.BETWEEN AND 注意是闭区间 比方说 BETWEEN 1 AND 199,是1-199,含1和199

 

Q10:

   解析:

赋予登陆权限的语句是grant usage on 数据库 to 用户,@%表示任何主机的通配符。
给数据库赋予登录权限的语句是grant usage on ... to。因此答案A、C都不正确。题目中只说secretData数据库中的某个表有绝密文件,但是对新创建的用户可拥有登录权限,而没有其他权限。并没有说只对secretData数据库,因此题目引入该数据库只是一个干扰信息,所以答案B错误,因此答案选择D

(这一道题被人骂了,被人说是垃圾文字游戏)

Q11:Alter相关

  不放题目了。

ALTER TABLE <表名> [修改选项]
{ ADD COLUMN <列名> <类型>
| CHANGE COLUMN <旧列名> <新列名> <新列类型>
| ALTER COLUMN <列名> { SET DEFAULT <默认值> | DROP DEFAULT }
| MODIFY COLUMN <列名> <类型>
| DROP COLUMN <列名>
| RENAME TO <新表名> }
 
删除字段:ALTER TABLE TEST_TABLE DROP A;
添加字段及类型:ALTER TABLE TEST_TABLE ADD B INT;
修改字段类型:ALTER TABLE TEST_TABLE MODIFY B CHAR(10);
修改字段名及类型:ALTER TABLE TEST_TABLE CHANGE B B_NEW BIGINT;
修改字段默认值:ALTER TABLE TEST_TABLE ALTER i SET DEFAULT 1000;
修改表名:ALTER TABLE TEST_TABLE RENAME TO TEST_TABLE1;
(加不加COLUMN都是可以的)

 

Q12:

 Q13:

    解析:

LACASE是将内容转换为小写,UCASE将内容转换为大写,但都只针对英文内容
CASE是条件控制语句的关键字。

Q14:

删除触发器: DROP TRIGGER
输入 : DROP TRIGGER newproduct;
      newproduct :触发器名称
Q15:

 Q16:

  关于游标,close用来关闭游标。

SQL -- 游标(详细)_sql 游标-CSDN博客

  为什么使用游标:

  • 出来 SELECT 的 WHERE 可以限制一条记录被选中外,T-SQL 没有提供查询表中单条记录的方法,但我们常常会遇到需要逐行读取记录的情况。

 

 

 

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

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是等同的。

Q4:

   解析:答案选C

 Q5:

 

 Q6:

 

 

 

 

长篇大论的查询

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 快,聚合函数不能用在where语句遇到了再记。

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中出现(在经典题里面也出现了)

 Q14:

   解析:其实就是,行转列,那么就要按照sno分组,然后用select来选出列。

 Q15:

   解析:选b,输出结果不用排序,注意。

 

Q16:

   解析:
All():对所有数据都满足条件,整个条件才成立,>=all()等价于max,<=all()等价于min;
Any:只要有一条数据满足条件,整个条件成立,>any()等价于>min,<any()等价于<max;
some的作用和Any一样(记一下,any的关系)

 

Q17:

  给一下这道题的链接:

A执行报错【1241 - Operand should contain 1 column(s)】,in的子句中只能含有1个字段,t2.*含有t2.name和t2.id这2个字段,写成t2.id才对。
B执行报错【1064 - You have an error in your SQL syntax;】,多表删除时,delete和from之间必须要写明想要删除记录的表名。
C和D的区别就是表名,一个写的原始表名,一个写的别名。当起了别名时,本条语句(不包含子语句)必须使用别名,而不能使用原名,否则报错。
正常选项:

 (有一说一,这个语句太长了,逻辑就是多表查询分别查出来id和name,然后用inner join和原表相连,inner join的使用场景注意一下。)

这个更好⬇

delete from student_table where id in 

(select maxid from 
(select  max(id) maxid  from  student_table group by name having count(name)>1) a);

 

Q18:

   解析:正确是B,A是被distinct害了。

Q19:

   选d。不选C选项是不是因为not in后面需要直接跟值而不是一个表

 

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

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视图的作用类似于筛选,自然不能新建一个表。

 

Q12:

   解析:

   索引的组织方式是B++树索引,还是Hash索引与数据库的内模式有关。

Q13:

   解析:链接:
游标是一种从包括多条数据记录的结果集中每次提取一条记录以便处理的机制,可以看做是查询结果的记录指针。A选项,游标允许定位在结果集的特定行;B选项,从结果集的当前位置检索一行或一部分行;C选项,支持对结果集中当前位置的行进行数据修改。

 Q14:

   解析:

 Q15:

   解析:

   解析:把叉乘看成叉烧了。

Q16:

   解析:主要是这道的做法,我没什么见过。

A是求和,加0时和不变,正确;
B此时只对2出现的次数做累加,对null不做次数的累加,正确;
C会对1和0出现的次数均做累加,2个结果均是所有记录的总行数,结果错误;
D是求和,加null时和不变,正确。

 Q17:

   解析:这里的C选项,被修改的应该是参照表。参照表就是设置外键的,被参照表就是键被引用的那个表

 

Q18:

   解析:

 Q19:

   解析:

having是在分组后过滤,where在分组前过滤,不冲突,可以同时使用,BE错;
having是用来过滤的,group by是限定分组,D错;
select语句中没有聚合函数的使用时也可以用having,F错

   这个记一下(恼

Q20:

 

  解析:意思大概就是,最好不要直接框定视图的定义,不要用order,不要用join,不要用distinct这些表示特定意思的。

Q21:

   解析:选D

Q22:

   索引除了快没有其他的作用,数据库利用各种各样的快速定位技术,能够大大提高查询效率。特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍。

关于非聚集索引:聚集索引与非聚集索引的总结 - {-)大傻逼 - 博客园 (cnblogs.com)

聚集(clustered)索引,也叫聚簇索引。

定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。

单单从定义来看是不是显得有点抽象,打个比方,一个表就像是我们以前用的新华字典,聚集索引就像是拼音目录,而每个字存放的页码就是我们的数据物理地址,我们如果要查询一个“哇”字,我们只需要查询“哇”字对应在新华字典拼音目录对应的页码,就可以查询到对应的“哇”字所在的位置,而拼音目录对应的A-Z的字顺序,和新华字典实际存储的字的顺序A-Z也是一样的,

非聚集(unclustered)索引。

定义:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。

其实按照定义,除了聚集索引以外的索引都是非聚集索引,只是人们想细分一下非聚集索引,分成普通索引,唯一索引,全文索引。如果非要把非聚集索引类比成现实生活中的东西,那么非聚集索引就像新华字典的偏旁字典,他结构顺序与实际存放顺序不一定一致。

Q23

 数据库管理系统对并发事务不同的调度可能会产生不同的结果,比如两个事务T1和T2,先执行T1或者先执行T2产生的结果可能是不一样的。由于串行调度没有事务间的相互干扰,所以串行调度是正确的。另外,执行结果等价于串行调度的调度也是正确的,称为可串行化调度。

 Q24:

 Q25:

   解析:

   系统函数就是系统函数,日期函数之类的。

 Q26:

隔离级别中,
读已授权解决脏读问题,在数据读取时添加共享锁,执行完语句后释放锁,数据写入时添加排它锁,事务提交后释放锁
可重复读解决不可重复读问题,在数据读取时添加共享锁,事务提交后释放锁,数据写入时添加排它锁,事务提交后释放锁

Q27:

   选d

 

Q28:

   解析:
1:处理效率:drop>trustcate>delete

2:删除范围:drop删除整个表(结构和数据一起删除);trustcate删除全部记录,但不删除表结构;delete只删除数据
3:高水位线:delete不影响自增ID值,高水线保持原位置不动;trustcate会将高水线复位,自增ID变为1。
 

Q29:

   解析:写一下union all 和union 的区别。

Q30:

   解析:答案有问题,iracle是支持values的,mysql都支持。

 

Q31:

read uncommited  读未提交,一个事务可以读取另一个未提交事务的数据,会出现脏读
read commited  读提交,一个事务只能等另一个事务提交后再进行读取数据,解决脏读,会出现不可重复读
repeatable read 重复读,事务开启将不再允许其他事务执行update操作,解决不可重复读,会出现幻读
Serializable 序列化,事务串行化按顺序执行,解决幻读,但消耗大、效率低。
  • 可串行化SERIALIZABLE:加锁后,如果发现其他用户正在对表进行操作,则本用户操作会被延迟(不能并行),直到对方COMMIT。如果等待时间过长,本用户会判超时,此次操作不会被执行
mysql数据库默认开启重复读隔离级别
大多数数据库默认开启读提交隔离级别
 

Q32:(懒得放题)

现实中实体是可区分的,即它们具有唯一标识性,关系模型中以主键来唯一标识元组,即可以唯一标识学生实体
Q33:

@@ERROR:返回执行的上一个 Transact-SQLTransact-SQL 语句的错误号。
@@IDENTITY:返回自增id。
@@ROWCOUNT:返回受上一个SQL语句影响的行数。
@@MAX_CONNECTIONS:返回最大用户连接数。
 

Q33:

关于ddl和dcl和dml和tcl,之前说过了。
(1)数据定义(SQL DDL)用于定义SQL模式、基本表、视图和索引的创建和撤消操作。
(2)数据操纵(SQL DML)数据操纵分成数据查询和数据更新两类。数据更新又分成插入、删除、和修改三种操作。
(3)数据控制(DCL)包括对基本表和视图的授权,完整性规则的描述,事务控制等内容。
(4)嵌入式SQL的使用规定(TCL)涉及到SQL语句嵌入在宿主语言程序中使用的规则。
 
 
 

 

 

最后:

  写完了,太好了。

 

参考链接:

   聚集索引与非聚集索引的总结 - {-)大傻逼 - 博客园 (cnblogs.com)

  SQL -- 游标(详细)_sql 游标-CSDN博客

  数据库中为什么要建立视图,它有什么好处?-CSDN博客  

  MySQL: 图解 inner join、left join、right join、full outer join、union、union all的区别_mysql中union和inner join区别-CSDN博客

posted @ 2024-05-03 01:43  程序计算机人  阅读(67)  评论(0)    收藏  举报