骚戴独家笔试---SQL笔试

news2025/7/14 3:52:53

SQL笔试训练

查询结果去重

两种答案

查找某个年龄段的用户信息

查找除复旦大学的用户信息

三种答案

用where过滤空值练习

三种答案

查询NULL时,不能使用比较运算符(=或者< >),需要使用IS NULL运算符或者IS NOT NULL运算符。

操作符混合运用

我这里写大括号方便区分,表示两个条件或两个条件

由于and的优先级大于or,所以可以省略括号,如果不确定可以用()来改变运算的优先级

查看学校名称中含北京的用户

考点 like

  • like '%北京%'列名包括北京的字样
  • like '北京%' 列名北京开头
  • like '%北京' 列名北京结尾

匹配串中可包含如下四种通配符

  • _:匹配任意一个字符;
  • %:匹配0个或多个字符;
  • [ ]:匹配[ ]中的任意一个字符(若要比较的字符是连续的,则可以用连字符“-”表 达 );
  • [^ ]:不匹配[ ]中的任意一个字符。

实例

查找GPA最高值

计算男生人数以及平均GPA

细节问题:根据输出示例,有两个问题需要注意

  • 表头重命名,用as语法
  • 此题要注意的是暗含条件,保留一位小数,使用ROUND()函数舍入到指定的长度或精度

分组计算练习题

id

device_id

gender

age

university

gpa

active_days_within_30

question_cnt

answer_cnt

1

2138

male

21

北京大学

3.4

7

2

12

2

3214

male

复旦大学

4.0

15

5

25

3

6543

female

20

北京大学

3.2

12

3

30

4

2315

female

23

浙江大学

3.6

5

1

2

5

5432

male

25

山东大学

3.8

20

15

70

6

2131

male

28

山东大学

3.3

15

7

13

7

4321

male

26

复旦大学

3.6

9

6

52

分组过滤练习题

id

device_id

gender

age

university

gpa

active_days_within_30

question_cnt

answer_cnt

1

2138

male

21

北京大学

3.4

7

2

12

2

3214

male

复旦大学

4.0

15

5

25

3

6543

female

20

北京大学

3.2

12

3

30

4

2315

female

23

浙江大学

3.6

5

1

2

5

5432

male

25

山东大学

3.8

20

15

70

6

2131

male

28

山东大学

3.3

15

7

13

7

4321

male

26

复旦大学

3.6

9

6

52

问题分解

  • 限定条件:平均发贴数低于5或平均回帖数小于20的学校,avg(question_cnt)<5 or avg(answer_cnt)<20,聚合函数结果作为筛选条件时,不能用where,而是用having语法,配合重命名即可;
  • 按学校输出:需要对每个学校统计其平均发贴数和平均回帖数,因此group by university,这里特别注意要对学校进行分组这个隐藏条件

分组排序练习题

id

device_id

gender

age

university

gpa

active_days_within_30

question_cnt

answer_cnt

1

2138

male

21

北京大学

3.4

7

2

12

2

3214

male

复旦大学

4.0

15

5

25

3

6543

female

20

北京大学

3.2

12

3

30

4

2315

female

23

浙江大学

3.6

5

1

2

5

5432

male

25

山东大学

3.8

20

15

70

6

2131

male

28

山东大学

3.3

15

7

13

7

4321

male

26

复旦大学

3.6

9

6

52

问题分解

  • 限定条件:无;
  • 不同大学:按学校分组 group by university
  • 平均发帖数:avg(question_cnt)
  • 升序排序:order by avg_question_cnt

浙江大学用户题目回答情况

示例:user_profile

id

device_id

gender

age

university

gpa

active_days_within_30

question_cnt

answer_cnt

1

2138

male

21

北京大学

3.4

7

2

12

2

3214

male

复旦大学

4.0

15

5

25

3

6543

female

20

北京大学

3.2

12

3

30

4

2315

female

23

浙江大学

3.6

5

1

2

5

5432

male

25

山东大学

3.8

20

15

70

6

2131

male

28

山东大学

3.3

15

7

13

7

4321

male

26

复旦大学

3.6

9

6

52

问题分解

限定条件:来自浙江大学的用户,学校信息在用户画像表,答题情况在用户练习明细表,因此需要通过device_id关联两个表的数据;

  • 方法1:join两个表,用inner join,条件是on up.device_id=qpd.device_id and up.university='浙江大学'
  • 方法2:先从画像表找到浙江大学的所有学生id列表where university='浙江大学',再去练习明细表筛选出id在这个列表的记录,用where in

两种答案

统计每个学校的答过题的用户的平均答题数

问题分解

  • 限定条件:无;
  • 每个学校:按学校分组,group by university
  • 平均答题数量:在每个学校的分组内,该学校用户答题总次数除以答过题的不同用户个数 count(question_id) / count(distinct ques.device_id)
  • 这个题的难点就在这里,要知道整个结果是把两个表联合在一起然后按学校分组了的,所以这个时候question_id的数量就是每个学校用户答题总次数,而distinct ques.device_id的总数量就答过题的不同用户个数,最核心的就是要站在“整个结果是把两个表联合在一起然后按学校分组了的”这个前提下去想
  • 表连接:学校和答题信息在不同的表,需要做连接

统计每个学校各难度的用户平均刷题数

id

device_id

gender

age

university

gpa

active_days_within_30

question_cnt

answer_cnt

1

2138

male

21

北京大学

3.4

7

2

12

2

3214

male

复旦大学

4.0

15

5

25

3

6543

female

20

北京大学

3.2

12

3

30

4

2315

female

23

浙江大学

3.6

5

1

2

5

5432

male

25

山东大学

3.8

20

15

70

6

2131

male

28

山东大学

3.3

15

7

13

7

4321

male

26

复旦大学

3.6

9

6

52

题库练习明细表:question_practice_detail

id

device_id

question_id

result

1

2138

111

wrong

2

3214

112

wrong

3

3214

113

wrong

4

6534

111

right

5

2315

115

right

6

2315

116

right

7

2315

117

wrong

8

5432

117

wrong

9

5432

112

wrong

10

2131

113

right

11

5432

113

wrong

12

2315

115

right

13

2315

116

right

14

2315

117

wrong

15

5432

117

wrong

16

5432

112

wrong

17

2131

113

right

18

5432

113

wrong

19

2315

117

wrong

20

5432

117

wrong

21

5432

112

wrong

22

2131

113

right

23

5432

113

wrong

表:question_detail

id

question_id

difficult_level

1

111

hard

2

112

medium

3

113

easy

4

115

easy

5

116

medium

6

117

easy

问题分解

  • 限定条件:无;
  • 每个学校:按学校分组group by university
  • 不同难度:按难度分组group by difficult_level
  • 平均答题数:总答题数除以总人数count(ques.question_id) / count(distinct ques.device_id)
  • 由于结果需要三个表中的多列数据,因此进行关联
    注:由于计算平均答题数的数据均来源于question_practice_detail,因此在联结时候应保全该表,以该表为本体联结另外两张表,通过device_id和question_id连接。

知识点补充

在合并表格的过程中,存在几种合并方式,下面简单介绍一下这些方式(此处以两张表格的情况为例解释)

  • inner join 最终结果为在两张表格中都匹配上的数据项
  • left join 最终结果为inner join结果加上左侧表格(此处为第一张表)未匹配上的数据
  • right join 最终结果为inner join结果加上右侧表格(此处为第一张表)未匹配上的数据
  • full join 最终结果为inner join加上左侧和右侧两张表中未匹配上的数据

备注:只写一个join时默认为inner join模式

查找山东大学或者性别为男生的信息

id

device_id

gender

age

university

gpa

active_days_within_30

question_cnt

answer_cnt

1

2138

male

21

北京大学

3.4

7

2

12

2

3214

male

复旦大学

4.0

15

5

25

3

6543

female

20

北京大学

3.2

12

3

30

4

2315

female

23

浙江大学

3.6

5

1

2

5

5432

male

25

山东大学

3.8

20

15

70

6

2131

male

28

山东大学

3.3

15

7

13

7

4321

male

26

复旦大学

3.6

9

6

52

问题分解

  • 限定条件:学校为山东大学或者性别为男性的用户:university='山东大学', gender='male';
  • 分别查看&结果不去重:所以直接使用两个条件的or是不行的,直接用union也不行(因为要求不去重,而用union 会去重),要用union all,分别去查满足条件1的和满足条件2的,然后合在一起不去重

union 和union all的区别

  • union是合并两个查询语句的结果集,并排除重复项
  • union all是不排除重复项的(符合题目要求)

union使用前提

使用union合并两个表时,需要两个表的结果集字段完全一样;

  • 表一(SELECT device_id,gender,age,gpa );
  • 表二(SELECT device_id,gender,age,gpa);

计算25岁以上和以下的用户数量

id

device_id

gender

age

university

gpa

active_days_within_30

question_cnt

answer_cnt

1

2138

male

21

北京大学

3.4

7

2

12

2

3214

male

复旦大学

4.0

15

5

25

3

6543

female

20

北京大学

3.2

12

3

30

4

2315

female

23

浙江大学

3.6

5

1

2

5

5432

male

25

山东大学

3.8

20

15

70

6

2131

male

28

山东大学

3.3

15

7

13

7

4321

male

26

复旦大学

3.6

9

6

52

上面的一定要记得进行分组,这个地方我一开始就忘记了,然后end后面写的是第一列和第二列的别名,不过第二列还要统计总数量

查看不同年龄段的用户明细

id

device_id

gender

age

university

gpa

active_days_within_30

question_cnt

answer_cnt

1

2138

male

21

北京大学

3.4

7

2

12

2

3214

male

复旦大学

4.0

15

5

25

3

6543

female

20

北京大学

3.2

12

3

30

4

2315

female

23

浙江大学

3.6

5

1

2

5

5432

male

25

山东大学

3.8

20

15

70

6

2131

male

28

山东大学

3.3

15

7

13

7

4321

male

26

复旦大学

3.6

9

6

52

这个题目要区分上面的那个题目,上面分组了,这里没分组,我一开始就是给这个题目分组了,其实这里压根没有分组

计算用户8月每天的练题数量

.

问题分解

  • 限定条件:2021年8月,写法有很多种
    • 比如用year/month函数的year(date)=2021 and month(date)=8
    • 比如用date_format函数的date_format(date, "%Y-%m")="202108"
  • 每天:按天分组group by date
  • 题目数量:count(question_id)

计算用户的平均次日留存率

问题分解

限定条件:第二天再来。

  • 解法1:表里的数据可以看作是全部第一天来刷题了的,那么我们需要构造出第二天来了的字段,因此可以考虑用left join把第二天来了的拼起来,限定第二天来了的可以用date_add(date1, interval 1 day)=date2筛选,并用device_id限定是同一个用户。
  • 解法2:用lead函数将同一用户连续两天的记录拼接起来。先按用户分组partition by device_id,再按日期升序排序order by date,再两两拼接(最后一个默认和null拼接),即lead(date) over (partition by device_id order by date)

平均概率:

  • 解法1:可以count(date1)得到左表全部的date记录数作为分母,count(date2)得到右表关联上了的date记录数作为分子,相除即可得到平均概率
  • 解法2:检查date2和date1的日期差是不是为1,是则为1(次日留存了),否则为0(次日未留存),取avg即可得平均概率。

统计每种性别的人数

问题分解

  • 限定条件:无;
  • 每个性别:按性别分组group by gender,但是没有gender字段,需要从profile字段截取,按字符,分割后取出即可。可使用substring_index函数可以按特定字符串截取源字符串。因此,本题可以直接用substring_index(profile, ',', -1)取出性别。
    • substring_index(FIELD, sep, n)可以将字段FIELD按照sep分隔:
      • 当n大于0时取第n个分隔符(n从1开始)左边的全部内容;
      • 当n小于0时取倒数第n个分隔符(n从-1开始)右边的全部内容;
  • 多少参赛者:计数统计,count(device_id)

三种答案

用substring_index

依旧使用case和like即可简单实现

仅为两项可用if代替case,搭配like使用

提取博客URL中的用户名

问题分解

  • 限定条件:无;
  • 提取字段内信息:个人博客字段中的用户名是被字符/分隔的最后一个子串,使用substring_index函数可以按特定字符串截取源字符串 substring_index(FIELD, sep, n)可以将字段FIELD按照sep分隔: 因此,本题可以用substring_index(blog_url, '/', -1)取出用户名.
    • (1).当n大于0时取第n个分隔符(n从1开始) 左边 的全部内容;
    • (2).当n小于0时取 倒数第-n个 分隔符(n从-1开始) 右边 的全部内容;

截取出年龄

查找后多列排序

排序的顺序是完全按照规定执行的,如 order by 字段1,字段2 只有在排序的时候,字段1具多个相同的数据后,才会再按照字段2排序。 如果字段1是唯一的,则不会按照字段2去排序。

查找后降序排列

找出每个学校GPA最低的同学

id

device_id

gender

age

university

gpa

active_days_within_30

question_cnt

answer_cnt

1

2138

male

21

北京大学

3.4

7

2

12

2

3214

male

复旦大学

4.0

15

5

25

3

6543

female

20

北京大学

3.2

12

3

30

4

2315

female

23

浙江大学

3.6

5

1

2

5

5432

male

25

山东大学

3.8

20

15

70

6

2131

male

28

山东大学

3.3

15

7

13

7

4321

male

26

复旦大学

3.6

9

6

52

问题分解

限定条件:gpa最低,看似min(gpa),但是要留意,是每个学校里的最低,不是全局最低。min(gpa)的时候对应同学的ID丢了,直接干是拿不到最低gpa对应的同学ID的;SELECT device_id,university,min(gpa) FROM user_profile GROUP BY university; 因为学校与学生是一对多的关系,如果仅用min求出gpa最低的学生,查询结果中的id与学生不一定是对应的关系,因此此方法错误。

可以看到北京大学gpa的最低值是3.2对应的id是6543,第一种查出来的id是2138,很明显第一种是错的

两种思路

  • 第一种方式是用group by把学校分组,然后计算得到每个学校最低gpa,再去找这个学校里和这个gpa相等的同学ID。注意这样如果最低gpa对应多个同学,都会输出,题目没有明确此种情况,心理明白就行。
  • 第二种方式是利用窗口函数,先按学校分组计算排序gpa,得到最低gpa的记录在用子查询语法拿到需要的列即可。此题中rou_number可以得到排序后的位序,取位序为1即可得到最小值(升序时)。

三种答案

统计复旦用户8月练题情况


device_id

gender

age

university

gpa

active_days_within_30

1

2138

male

21

北京大学

3.4

7

2

3214

male

复旦大学

4.0

15

3

6543

female

20

北京大学

3.2

12

4

2315

female

23

浙江大学

3.6

5

5

5432

male

25

山东大学

3.8

20

6

2131

male

28

山东大学

3.3

15

7

4321

female

26

复旦大学

3.6

9

问题分解

  • 限定条件:需要是复旦大学的(来自表user_profile.university),8月份练习情况(来自表question_practice_detail.date)
  • 从date中取month:用month函数即可;
  • 总题目:count(question_id)
  • 正确的题目数:sum(if(qpd.result='right', 1, 0))
  • 按列聚合:需要输出每个用户的统计结果,因此加上group by up.device_id

细节问题

  • 8月份没有答题的用户输出形式:题目要求『对于在8月份没有练习过的用户,答题数结果返回0』因此明确使用left join即可,即输出up表中复旦大学的所有用户,如果8月没有练习记录,输出0就好了,这个实现是通过sum(if(qpd.result='right', 1, 0))来实现的,只有result不是right,那就都是0,无论是答错了还是没有答都是0
  • 表头:as语法重命名后两列就好

这里一开始我是先把两张表连接起来(用inner join),再用where去筛选。但是本题目是要求找出复旦大学中所有用户8月份的答题情况,复旦大学的用户中,有可能存在8月份没有答题的用户。若先把两张表连起来再用where筛选限定条件,那么运行结果会把属于复旦大学但是没有答题的用户剔除了,不符合本题要求。

我们要的结果是:复旦大学所有用户8月的作答情况,包含没有作答过的。

浙大不同难度题目的正确率

id

device_id

gender

age

university

gpa

active_days_within_30

question_cnt

answer_cnt

1

2138

male

21

北京大学

3.4

7

2

12

2

3214

male

复旦大学

4

15

5

25

3

6543

female

20

北京大学

3.2

12

3

30

4

2315

female

23

浙江大学

3.6

5

1

2

5

5432

male

25

山东大学

3.8

20

15

70

6

2131

male

28

山东大学

3.3

15

7

13

7

4321

female

26

复旦大学

3.6

9

6

52

查找最晚入职员工的所有信息

知识点

  • ORDER BY 根据指定的列对结果集进行排序,默认按照升序,降序 ORDER BY DESC
  • LIMIT(m, n) 从第 m + 1 行开始取 n 条记录
  • 最晚员工自然是 hire_data,最晚可以用排序 ORDER BY DESC 降序来得到,然后是获取第一条记录,这样理论上是有 bug 的,因为 hire_data 可能有多个相同的记录.
  • select * from employees order by hire_date desc limit 0,1 所以这样写不严谨

查找入职员工时间排名倒数第三的员工所有信息

注意事项

  • where ...in...和limit是不能一起用的,非要一起用就要做一定的修改,可以用where ...=...代替
  • 若存在多人(如3人)同时在最晚的一天入职的情形,必须要考虑去重(使用distinct或者group by),distinct和group by的执行顺序都在limit前面,因为多个人最后一天入职的话那limit 2,1得到的只是降序后的第三条数据,而不是时间排名倒数第三的数据,其中时间排名倒数第一的就占了多条记录
  • LIMIT(m, n) 从第 m + 1 行开始取 n 条记录

查找当前薪水详情以及部门编号dept_no

这里我一开始是用的左外连接,要仔细看输出结果来决定用什么连接!

查找薪水记录超过15条的员工号emp_no以及其对应的记录次数t

有一个薪水表,salaries简况如下:

emp_no

salary

from_date

to_date

10001

60117

1986-06-26

1987-06-26

10001

62102

1987-06-26

1988-06-25

10001

66074

1988-06-25

1989-06-25

10001

66596

1989-06-25

1990-06-25

10001

66961

1990-06-25

1991-06-25

10001

71046

1991-06-25

1992-06-24

10001

74333

1992-06-24

1993-06-24

10001

75286

1993-06-24

1994-06-24

10001

75994

1994-06-24

1995-06-24

10001

76884

1995-06-24

1996-06-23

10001

80013

1996-06-23

1997-06-23

10001

81025

1997-06-23

1998-06-23

10001

81097

1998-06-23

1999-06-23

10001

84917

1999-06-23

2000-06-22

10001

85112

2000-06-22

2001-06-22

10001

85097

2001-06-22

2002-06-22

10002

72527

1996-08-03

1997-08-03

注意事项

  • 由于是用到了聚合函数count,所以不能用where,应该用having
  • 在一个查询中,HAVING 子句必须放在 GROUP BY 子句之后,必须放在 ORDER BY 子句之前

查找employees表emp_no与last_name的员工信息

推荐使用方法2,因为效率更高,其中逆序就是降序

  • 查询奇数的一般方法:字段名 &(位运算) 1
  • 查询偶数的一般方法:emp_no=(emp_no>>1<<1)

但是,以上的一般方法,针对的是字段全是数字的情况,如果对于身份证这种中间隐藏了一部分的,奇数无法使用,所以更好的方法是使用正则化表达式
正则化表达式
^aa:以aa开头
aa$:以aa结尾
.:匹配任何字符
[abc]:[字符集合],包含中括号内的字符
[^abc]或[!abc]:[字符集合],不包含中括号内的字符
a|b|c:匹配a或b或c,如(中|美)国
:匹配前面的子表达式0次或者多次。如,zo能匹配’z’以及’zoo’。*等价于{0,}
+:匹配前面的子表达式1次或者多次。如,’zo+’能匹配’zo’,但不能匹配’z’。+等价于{1,}
{n}:n是一个非负整数,匹配前面的子表达式2次。如,o{2} 能匹配’food’中的两个o,但不能匹配’Bob’中的o
{n, m}:m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。

对所有员工的薪水按照salary降序进行1-N的排名

窗口函数

获取所有员工当前的manager

这个答案感觉不太好理解

统计各个部门的工资记录数

这里选择用departments表(中间表)来连接其他两个表,我之前以为必须要和其他两个表有共同字段的表才可以作这个中间表,如果都是用的内连接(inner join)那无论用哪个表作中间表连接其他的表都可以

为什么dept_name 不属于聚合键,依然可以直接多表连接?
根据我查找的资料官方解释是:当group by 后面跟上主键或者不为空唯一索引时,查询是有效的,因为此时的每一笔数据都具有唯一性。

Mysql官方网站对此的描述链接:MySQL :: MySQL 5.7 Reference Manual :: 12.20.3 MySQL Handling of GROUP BY

dept_no是departments表的主键,所以以上代码的结果具有唯一性。也就是说depat_name是对应dept_no的。

获取所有非manager员工当前的薪水情况

思路:先找到所有非manager员工emp_no,再内连接工资表和部门表即可

使用join查询方式找出没有分类的电影id以及名称

两种答案

推荐第一种,第二种答案的子查询即使不内连接也是可以的,但是题目要求用join连接

将employees表的所有员工的last_name和first_name拼接起来作为Name

注意这里连接符号要用双引号引起来,不是单引号

创建一个actor表,包含如下列信息

批量插入数据

如果插入的字段和表的字段都是完全一样就可以用上面的写法,不一样就用下面的写法

批量插入数据,不使用replace操作

mysql中常用的三种插入数据的语句

  • insert into表示插入数据,数据库会检查主键,如果出现重复会报错;
  • replace into表示插入替换数据,需求表中有PrimaryKey或者unique索引,如果数据库已经存在数据,则用新数据替换,如果没有数据效果则和insert into一样;
  • insert ignore表示,如果中已经存在相同的记录,则忽略当前新数据;

创建一个actor_name表

MYSQL创建数据表的三种方法

  • 常规创建
    create table if not exists 目标表
  • 复制表格
    create 目标表 like 来源表
  • 将table1的部分拿来创建table2

create table if not exists 要创建表的表名 (select 字段名 from 表名 where 条件)

对first_name创建唯一索引uniq_idx_firstname

MySQL中给字段创建四种不同类型索引的基本语法

针对actor表创建视图actor_name_view

注意上面的as不能丢

针对上面的salaries表emp_no字段创建索引idx_emp_no

注意这里创建表的时候已经创建了索引

在last_update后面新增加一列名字为create_date

构造一个触发器audit_log

上面的audit里的emp_no就是employees_test的id

在MySQL中,创建触发器语法如下
CREATE TRIGGER trigger_name
trigger_time trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt
其中:

  • trigger_name:标识触发器名称,用户自行指定;
  • trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
  • trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
  • tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
  • trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句,每条语句结束要分号结尾。

【NEW 与 OLD 详解】
MySQL 中定义了 NEW 和 OLD,用来表示
触发器的所在表中,触发了触发器的那一行数据,具体地:

  • 在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
  • 在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
  • 在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
    使用方法: NEW.columnName (columnName 为相应数据表某一列名)

删除emp_no重复的记录,只保留最小的id对应的记录

这里把 select min(id) from titles_test group by emp_no得出的表重命名为titles_test2那就不是原表了,所以就可以删除了

注意:mysql不允许在子查询的同时删除原表数据,所以下面的写法是错误的!

将所有to_date为9999-01-01的全部更新为NULL

基本的数据更新语法

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

将id=5以及emp_no=10001的行数据替换成id=5以及emp_no=10005

本题考查的是replace函数,其中包含三个参数

  • 第一个参数为该字段的名称
  • 第二参数为该字段的需要被修改值
  • 第三个参数为该字段修改后的值

如果不强制使用replace函数,那还有下面的方式

使用insert

使用replace into

将titles_test表名修改为titles_2017

alter table titles_test rename to titles_2017

1. 修改表名
    alter table 表名 rename to 新的表名;
2. 修改表的字符集
    alter table 表名 character set 字符集名称;
3. 添加一列
    alter table 表名 add 列名 数据类型;
4. 修改列名称 类型
    alter table 表名 change 列名 新列别 新数据类型;
    alter table 表名 modify 列名 新数据类型;
5. 删除列
    alter table 表名 drop 列名;
  • ALTER TABLE 表名 ADD 列名/索引/主键/外键等;
  • ALTER TABLE 表名 DROP 列名/索引/主键/外键等;
  • ALTER TABLE 表名 ALTER 仅用来改变某列的默认值;
  • ALTER TABLE 表名 RENAME 列名/索引名 TO 新的列名/新索引名;
  • ALTER TABLE 表名 RENAME TO/AS 新表名;
  • ALTER TABLE 表名 MODIFY 列的定义但不改变列名;
  • ALTER TABLE 表名 CHANGE 列名和定义都可以改变

在audit表上创建外键约束,其emp_no对应employees_test表的主键id

由于题目要求其emp_no对应employees_test表的主键id,所以才有下面的references employees_test(id)

创建外键语句结构

ALTER TABLE <表名>

ADD CONSTRAINT FOREIGN KEY (<列名>)

REFERENCES <关联表>(关联列)

查找字符串中逗号出现的次数

解析:把逗号去掉前后到长度差就是逗号到数目,LENGTH(replace(string, ',','')这个是去掉逗号的长度,不是把字符串中的逗号替换成空格

获取employees中的first_name

RIGHT函数它能返回从最右边开始指定长度的字符串。同理LEFT函数就是返回从最左边开始的指定长度字符串

按照dept_no进行汇总

聚合函数group_concat(X,Y),其中X是要连接的字段,Y是连接时用的符号,可省略,默认为逗号。此函数必须与GROUP BY配合使用。

此题以dept_no作为分组,将每个分组中不同的emp_no用逗号连接起来(即可省略Y)

平均工资

使用聚合函数,不用子查询,COUNT(1) 代表所有数据长度, -2 代表减去最大最小值的两个长

出现三次以上相同积分的情况

刷题通过的题目排名

找到每个人的任务

老是左右连接不知道用哪个,主要是没有彻底弄懂,A表左连接B表那么B表独有的字段可能会为null,A表右连接B表那么A表独有的字段可能会为null

牛客每个人最近的登录日期(二)

牛客每个人最近的登录日期(四)


                

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

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

相关文章

力扣 792. 匹配子序列的单词数

题目 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 。 字符串的 子序列 是从原始字符串中生成的新字符串&#xff0c;可以从中删去一些字符(可以是none)&#xff0c;而不改变其余字符的相对顺序。 例如&#xff0c; “ace” 是 “abcde” 的子序…

java spring引用外部jar包并使用

spring引用外部jar包并使用1、将jar包放到src/main/resources/lib2、编辑pom.xml文件build下面加入resources&#xff0c;不加话的打包会找不到资源3、project structure中引入该lib1、将jar包放到src/main/resources/lib 2、编辑pom.xml文件 打开pom文件&#xff0c;找到相应…

计算机网络基本知识

计算机网络基本知识 计算机网络定义&#xff1a;是一个将分散的、具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。 1.1计算机网络在信息时代作用 1.2因特网概述 1.2.1网络、互联网、因特网 网…

DeepLab V1学习笔记

DeepLab V1摘要相关的工作遇到的问题和解决的方法信号下采样空间不变性(spatial insensitivity/invariance)论文的优点(贡献)网络的模型空洞卷积CRF多尺度预测模型总结实验结果Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs论文地址 : D…

[附源码]java毕业设计乒乓球俱乐部管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【光学】基于Matlab模拟干涉条纹图

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

亿级万物互联新时代的物联网消息中间件EMQX调研

简介 最近去某餐厅吃饭&#xff0c;进门时智能门自动打开房门同时来一句"欢迎光临"&#xff0c;然后伸手到门口的洗手台&#xff0c;水管无接触自动出水&#xff0c;端起菜盘走向台子选择自己喜欢的菜品&#xff0c;最后将菜盘放在智能结账机上&#xff0c;智能结账…

代码随想录算法训练营第三天|LeetCode 203.移除链表元素 、707.设计链表 、206.反转链表

LeetCode 203.移除链表元素 题目链接&#xff1a;203.移除链表元素 链表的定义&#xff1a; // 单链表 struct ListNode {int val; // 节点上存储的元素ListNode *next; // 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数 };ListNode(i…

数据结构实验教程-第一套

1&#xff0e;在平衡二叉树中插入一个结点后造成了不平衡&#xff0c;设最低的不平衡结点为A&#xff0c;并已知A的左孩子的平衡因子为1&#xff0c;右孩子的平衡因子为0&#xff0c;则应作_型调整以使其平衡。 A.LL B.LR C.RL D.RR答案为a&#xff0c;错选了c。 平衡因子 左子…

model.py篇

model.py篇 目录如下&#xff1a; 引言找LeNet5网络结构书写代码测试结果函数解释 引言 卷积主要用于特征的提取&#xff0c;而model.py则是为了从输入信息中筛选出我们需要的信息。 我们在阅读完论文后&#xff0c;对我们需要的模型进行搭建&#xff0c;下以LeNet5的model…

子域名访问计数(哈希表、字符串、索引)

力扣地址&#xff1a;力扣 网站域名 "discuss.leetcode.com" 由多个子域名组成。顶级域名为 "com" &#xff0c;二级域名为 "leetcode.com" &#xff0c;最低一级为 "discuss.leetcode.com" 。当访问域名 "discuss.leetcode.com&…

【Struts2】idea快速搭建struts2框架

文章目录什么是SSH框架&#xff1f;Struts2框架1、struts2的环境搭建1.1 创建web项目&#xff08;maven&#xff09;&#xff0c;导入struts2核心jar包1.2 配置web.xml&#xff08;过滤器&#xff09;&#xff0c;是struts2的入口&#xff0c;先进入1.3 创建核心配置文件struts…

力扣(LeetCode)13. 罗马数字转整数(C++)

模拟 罗马数字和掰手指数数的区别在于&#xff0c;IV/IXIV/IXIV/IX 这类倒着数数的&#xff0c;和阿拉伯数字最大的区别在于 555 的 10k10^k10k 倍 k∈Nk\isin Nk∈N &#xff0c;需要被表示出来。所以除了记录 I/X/C/MI/X/C/MI/X/C/M ——1/10/100/10001/10/100/10001/10/100…

五种IO模型

文章目录什么是IO操作系统的IO五种IO模型阻塞IO非阻塞IO多路转接IO(复用IO)信号驱动IO异步IO同步异步什么是IO IO,即input/output,IO模型即输入输出模型,而比较常见且听说的便是磁盘IO,网络IO. 按照冯诺依曼结构的来看,假设我们把运算器、控制器、存储器三个设备看做一个整体…

Kruskal算法求最小生成树

输入样例&#xff1a; 4 5 1 2 1 1 3 2 1 4 3 2 3 2 3 4 4输出样例&#xff1a; 6适用于稀疏图&#xff0c;快&#xff1b; 实现步骤&#xff1a; 1.将所有边将权重从小到大排序&#xff1b;sort&#xff1b;O&#xff08;mlogm&#xff09; 2.枚举每条边a,b&#xff1b;权…

RabbitMQ的 AMQP协议都是些什么内容呢

之前也讲述过关于 RabbitMQ 的相关内容&#xff0c;比如他们的配置&#xff0c;以及 RabbitMQ 整合 SpringBoot 使用&#xff0c;而且自己使用过之后&#xff0c;就会在自己的简历上面写上自己使用 RabbitMQ 实现了什么功能&#xff0c;但是这就会导致&#xff0c;有些面试官就…

QPainter、QPen 、QBrush(概念)

Qt中的三大绘画类&#xff1a; QPainter :进行绘画QPaintDevice :提供画图设备&#xff0c;是一个二维的抽象&#xff08;是所有可绘制对象的基类&#xff09;QPaintEngine :提供了画家用于绘制到不同类型的设备上的界面QPainter(画家) QPainter 提供高度优化的功能来完成 GUI …

Presto 聚合中groupBy分组的实现

一.前言 本文只要探索在Presto中groupby是怎么实现的。在Preso中&#xff0c;groupby的分组主要通过对数据Hash的数值比较进行分组&#xff0c;其中有2种情况&#xff0c;一直是仅有一个groupby字段而且字段是Bigint类型的&#xff0c;此场景下会使用BigintGroupByHash来实现分…

Spring boot使用ProGuard实现代码混淆

目录参考一、 ProGuard简介二、混淆配置要点三、快速开始方案一 配置文件新增proguard.cfg配置插件打包方案二 pom中定义配置参考 Spring boot使用ProGuard实现代码混淆 SpringBoot 玩一玩代码混淆&#xff0c;防止反编译代码泄露 代码混淆常见于安卓的apk安装文件, 服务端的…

11月千言最新评测推荐,覆盖中文对话、视频语义理解、可信AI等前沿方向

千言数据集是百度联合中国计算机学会、中国中文信息学会共同发起的数据共建计划&#xff0c;千言针对每个自然语言处理问题&#xff0c;均收集和整理多个开源数据集&#xff0c;进行统一的处理并提供统一的测评方式&#xff0c;帮助加速模型的研发。截至目前&#xff0c;千言评…