练习大纲:
立扣上的sql语句题
学习中的易错点和有趣的题目
总结了下常用的关键词和技巧
- SELECT: 用于选择要检索的列。
- FROM: 用于指定要查询的表。
- WHERE: 用于过滤行,只返回满足条件的行。
- GROUP BY: 用于将结果集按一列或多列分组。
- HAVING: 与GROUP BY一起使用,用于过滤分组后的结果集。
- ORDER BY: 用于对结果集进行排序。
- LIMIT: 用于限制结果集的行数。
- JOIN: 用于在多个表之间建立连接。
- LEFT JOIN (OUTER JOIN): 返回左表中所有的行,以及右表中匹配的行。如果右表中没有匹配的行,将返回NULL。
- INNER JOIN: 返回两个表中匹配的行。
- ON: 用于指定JOIN条件。
- AND, OR: 用于组合多个条件。
- DISTINCT: 用于返回唯一不同的值。
- LIKE: 用于在WHERE子句中进行模糊搜索。
- IN: 用于指定条件范围,类似于多个OR条件的缩写。
- BETWEEN: 用于指定范围。
- AS: 用于为列或表指定别名。
- ASC (升序) / DESC (降序): 用于指定排序顺序。
- NOT NULL: 用于过滤出不包含NULL值的行。
- SET: 用于更新表中的数据。
- COUNT(): 用于计算结果集中行的数量。
- SUM() / AVG() / MIN() / MAX(): 用于计算列的总和、平均值、最小值和最大值。
- GROUP_CONCAT(): 用于将组内行的值连接为一个字符串。
- if(判断条件 ,为真结果,为假结果),为真选前,为假选后。
- CASE WHEN …then…WHEN …then…:用于在查询中执行条件判断。
- UNION / UNION ALL: 用于合并两个或多个SELECT语句的结果集。UNION删除重复的行,而UNION ALL包含重复的行。
- INTERVAL 1 DAY :用于指定时间间隔,其目的是提供一种通用的方式来表示一段时间。使用 INTERVAL 语法的好处是它可以支持多种时间单位,如天、小时、分钟等。
- 求数据出现次数最多的技巧:order by count(*) desc limit 1; 统计次数并从大到小排序,只选第一条就是最大值了;
- 求数据值相加起来的合的技巧:正常就是一个sum,但当有其他前提,比如,小明在周2一共上了几次厕所这种,就需要group by name,day;做条件,懂了吧?
- ifnull:用法:ifnull(判断值,指定值),当判断的值为null时,转换为指定值,否则还是原值;
. - 力扣(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 Salaryset 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题~!