SQL刷题第九天 牛客

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

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

(以下2个表已经创建了)

CREATE TABLE employees_test(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
CREATE TABLE audit(
EMP_no INT NOT NULL,
create_date datetime NOT NULL
);

后台会判断是否创建外键约束,创建输出1,没创建输出0

创建外键语句结构:

ALTER TABLE <表名>

ADD CONSTRAINT FOREIGN KEY (<列名>)

REFERENCES <关联表>关联列

alter table audit
add constraint foreign key (emp_no)
references employees_test(id);

题二:将所有获取奖金的员工当前的薪水增加10%

现有员工获取到的奖金简表emp_bonus如下:

  • emp_no指获取到奖金的员工编号;
  • bytpe指获取到的奖金类型。
emp_nobtype
100011

有员工薪资简表salaries如下:

  • emp_no指员工编号;
  • salary指薪资;
  • from_date指该薪资的开始日期;
  • to_date指该薪资的结束日期。
emp_nosalaryfrom_dateto_date

10001

10001

85097.0

88958.0

2001-06-22

2002-06-22

2002-06-22

9999-01-01

请你写出更新语句,将所有获取奖金的员工当前的(salaries.to_date='9999-01-01')薪水增加10%。(emp_bonus里面的emp_no都是当前获奖的所有员工,不考虑获取的奖金的类型)。

以上示例更新后的结果salaries为:

emp_nosalaryfrom_dateto_date

10001

10001

85097.0

97853.8

2001-06-22

2002-06-22

2002-06-22

9999-01-01

注:只需写出更新语句,后台会执行以下SQL语句,将更新后的结果与预期结果对比:

select * from salaries;

更新数据标准格式如下:

update 表名
set 
    字段1 = 值1,
    字段2 = 值2,
    ...
where 筛选条件
update salaries as s join emp_bonus as e 
    on s.emp_no=e.emp_no
    set salary=salary*1.1
    where to_date='9999-01-01'

题三: 将employees表中的所有员工的last_name和first_name通过(\')连接起来

将employees表中的所有员工的last_name和first_name通过(')连接起来。
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
输出格式:

name
Facello'Georgi
Simmel'Bezalel
Bamford'Parto
Koblick'Chirstian
Maliniak'Kyoichi
Preusig'Anneke
Zielinski'Tzvetan
Kalloufi'Saniya
Peac'Sumant
Piveteau'Duangkaew
Sluis'Mary

 补充:

CONCAT()拼接
RTrim():去除字符串右端空格
LTrim():去除字符串左端空格
Trim():去除字符串两端的空格

SELECT concat(RTrim(last_name),"'",LTrim(first_name)) as name
from employees

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

现有strings表如下:

  • id指序列号;
  • string列中存放的是字符串,且字符串中仅包含数字、字母和逗号类型的字符。
idstring

1

2

3

10,A,B,C,D

A,B,C,D,E,F

A,11,B,C,D,E,G

请你统计每个字符串中逗号出现的次数cnt。

以上例子的输出结果如下:

idcnt

1

2

3

4

5

6

 方法:

  1. 使用length()函数获取字符串长度;用replace()函数将","替换成" "(英文逗号 替换成 空格);
  2. 逆向思维,将原字符串长度 - 替换逗号后的字符串长度(空格不算字符串)=逗号的个数;
  3. 记得列的别名
SELECT id, LENGTH(string) - LENGTH(REPLACE(string, ",", "")) AS cnt
FROM strings;

题五:获取employees中的first_name

现有employees表如下:

emp_nobirth_datefirst_namelast_namegenderhire_date
100011953-09-02GeorgiFacello   M1986-06-26 
100021964-06-02Bezalel    Simmel    F    1985-11-21
100031959-12-03Parto      Bamford   M    1986-08-28
100041954-05-01Christian  Koblick   M    1986-12-01 
100051955-01-21KyoichiMaliniakM1989-09-12
100061953-04-20AnnekePreusigF1989-06-02
100071957-05-23TzvetanZielinskiF1989-02-10
100081958-02-19SaniyaKalloufiM1994-09-15
100091952-04-19SumantPeacF1985-02-18
100101963-06-01DuangkaewPiveteauF1989-08-24
100111953-11-07MarySluisF1990-01-22

请你将employees中的first_name,并按照first_name最后两个字母升序进行输出。

以上示例数据的输出如下:

first_name
Christian  
Tzvetan
Bezalel       
Duangkaew
Georgi
Kyoichi
Anneke
Sumant
Mary
Parto      
Saniya

方法:

  1. LEFT(s,n)返回字符串 s 的前 n 个字符
  2. RIGHT(s,n)返回字符串 s 的后 n 个字符
select first_name
from employees
order by right(first_name,2)

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值