立扣上的sql语句题
学习中的易错点和有趣的题目
总结了下常用的关键词和技巧
. - 力扣(LeetCode)
表: Users
+----------------+---------+
| Column Name | Type |
+----------------+---------+
| user_id | int |
| name | varchar |
+----------------+---------+
user_id 是该表的主键(具有唯一值的列)。
该表包含用户的 ID 和名字。名字仅由小写和大写字符组成。
编写解决方案,修复名字,使得只有第一个字符是大写的,其余都是小写的。
返回按 user_id
排序的结果表。
思路:需要把name字段内容分开分析,分为首字母和剩余部分,首字母用upper方法大写,其余字母用lower方法小写,用concat方法拼接,而upper中需要用left(name,1)表示name的第一个字母,用right(name,length(name-1))表示name除第一个字母外的其余字母,完整拼接如下:
concat(upper(left(name,1)),lower(right(name,length(name)-1)))as name
完整语句如下:
select user_id,
concat(upper(left(name,1)),lower(right(name,length(name)-1)))as name
from Users
order by user_id;
难点:知道concat,upper,left,right关键字的用法;
从中也能发现sql学习是建立在熟练使用关键字的基础上的!
有意思的题目:
Salary
表:
+-------------+----------+
| Column Name | Type |
+-------------+----------+
| id | int |
| name | varchar |
| sex | ENUM |
| salary | int |
+-------------+----------+
id 是这个表的主键(具有唯一值的列)。
sex 这一列的值是 ENUM 类型,只能从 ('m', 'f') 中取。
本表包含公司雇员的信息。
请你编写一个解决方案来交换所有的 'f'
和 'm'
(即,将所有 'f'
变为 'm'
,反之亦然),仅使用 单个 update 语句 ,且不产生中间临时表。
熟练一眼就能看出答案,但如果不知道if这个关键字就会很麻烦
update Salary
set sex=if(sex='f','m','f');
607. 销售员 - 力扣(LeetCode)
这个挺好玩
可以直接多个join…on-把表都连接起来,再用not in查询不在范围内的,即
select name from SalesPerson where name not in
(select SalesPerson.name as name from SalesPerson
join Orders on Orders.sales_id=SalesPerson.sales_id
join Company on Company.com_id=Orders.com_id
where Company.name='RED')
也可以用多个where,select一步步查询,即
select name from SalesPerson where sales_id not in
(select sales_id from orders where com_id in
(select com_id from company where name='RED'));
这些只是写了30多道题总结的,只后会更新关键字,直到刷完100题~!