SQL 语句 增删改查、边学习边增加中..... 这一部分为select
SQL语句按照最大的类别分为
1、增加 insert
2、删除 delete https://www.cnblogs.com/kuangmeng/p/17756654.html
3、修改update https://www.cnblogs.com/kuangmeng/p/17758060.html
4、查询 select https://www.cnblogs.com/kuangmeng/p/17756425.html
这一部分为select 查询操作,以及对应的Leecode题,进行加深印象。通常 select * from 表名 ,这条SQL语句代表查询表名的所有数据。
联合两个表进行查询,本人采用的是下面SQL ,但是返回的是 Person.personId = Address.personId 的数据, 与题目中要求 Person表中的数据,如果没有在Address表中出现,city,state 字段变为null。
select firstName,lastName,city,state from Person,Address where Person.personId = Address.personId
所以采用 left join 、 on 的方式。
其中 left join :是一种连接(JOIN)操作,用于将两个或多个表根据某个相关列进行关联。LEFT JOIN会返回左表中的所有记录,以及右表中与左表匹配的记录。如果在右表中没有找到匹配的记录,则会返回NULL值。
其中 on:ON子句用于指定连接条件,即哪些列需要相等才能将两个表关联起来。
题目:给定一个表,采用别名as的形式,提取两次表中的数据。
select a.name as 'Employee' ##### 将a.name 设置别名 为Employee 符合题目要求
select a.name as 'Employee' from Employee as a,Employee as b where a.managerId = b.id and a.salary>b.salary
其中 where与and,将两个判断条件连接。
重复字段,暂时采用unique 唯一标识字段 思考再三之后,决定采用group by + count 值
count : 遍历表,找到对应字段出现的次数。
group by:若是没有 加后续条件,则按照降序排列。
having:对group by字段添加 附属条件
select email as 'Email' from Person group by email having count(email) > 1;
没有出现的用户,根据题目来说,目前的见解,只能采用 not in。
其中not in : 顾名思义 a not in b ==> 返回所有a 有b 没有的东西。
整体上,将select内置到 not in中。通过相同的字段与字段进行判断。
select name as 'Customers' from Customers where Customers.id not in ( select customerId from Orders);
题解:三角形的条件:任意两条边 > 第三边。因此采用CASE..WHEN..THEN..END 的形式。具体格式如下所示:
CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ... ELSE resultN END;
对应LeeCode的代码:
SELECT x,y,z, CASE WHEN x + y > z AND x + z > y AND y + z > x THEN 'Yes' ELSE 'No' END AS 'triangle' FROM triangle;
题解:采用 DATEDIFF(w1.recordDate,w2.recordDate) = 1,来判断 w1.recordDate - w2.recordDate = 1。
-
select:用于选择要返回的列。例如,SELECT column1, column2 FROM table;
-
from:用于指定要查询的表。例如,FROM table;
-
join:用于将两个或多个表连接起来。例如,JOIN table1 ON table1.column = table2.column;
-
on:用于指定连接条件。例如,ON table1.column = table2.column;
-
where:用于指定过滤条件。例如,WHERE table1.column = value;
# SQL 比较 自连接 select w1.id as 'Id' from Weather w1 JOIN Weather w2 on DATEDIFF(w1.recordDate,w2.recordDate) = 1 where w1.Temperature > w2.Temperature;
题解:针对 两个表,存在输出的情况为null的情况,采用 left join
对于null,采用 is null 来判断。
# 两个表 select a.name,b.bonus from Employee as a left join Bonus as b on a.empId = b.empId where b.bonus < 1000 or b.bonus is null ;
题解:找出那些 没有被 id = 2
的客户 推荐 的客户的姓名。 拟采用 != 和 is null 的方式
select name from Customer where referee_id != 2 or referee_id is null;
通过查看题解,得知 在SQL 语句中,<> 和 != 的作用一致。
题解:查找下了 最多订单 的客户的 customer_number。
解释:一个表中,customer_number 对应的 order_number 最多的个数。
采用 DESC:降序排列 、ORDER BY :由某个值进行排序 LIMIT:取值个数 。
# 题解:肯定有一个客户 是最多的 ,存在多笔订单的情况 订单个数,不是订单的和 SELECT customer_number FROM Orders GROUP BY customer_number ORDER BY count(*) DESC LIMIT 1;
题解:找出最大的 单一数字 。如果不存在 单一数字 ,则返回 null
。
解释:使用 MAX 对只有一次的num字段进行找出最大值,若是没有 则返回null
select MAX(num) as num from( select num,count(*) from MyNumbers group by num having count(num) = 1) as t;
PS:最后加上一个 as t。 如果不加会出现 Every derived table must have its own alias 。中文意思为:别名 设置。
题解:Views表 某人id 作品id 参观者id 时间,查询出所有浏览过自己文章的作者。同一人的 author_id 和 viewer_id 是相同的。
这里会出现两个重复的信息,使用 DISTINCT 关键字来从表 Views 中检索唯一元素。
SELECT DISTINCT author_id AS id FROM Views WHERE author_id = viewer_id ORDER BY id
题解:难点在于统计平均值,判断是否为所需结果,四舍五入到小数点后两位。
拟采用:AVG() 作为平均值,IF(x1,x2,x3) x1是判断条件,x2为满足条件跳转的位置 ,x3为不满足条件跳转的位置,ROUND(值,小数点后几位)
函数将结果四舍五入到小数点后两位。
# quality = rating / position # poor_query_percentage = <3 select query_name, ROUND(AVG(rating/position),2) AS quality, ROUND(SUM(IF(rating<3, 1, 0)) * 100 / COUNT(*) ,2) AS poor_query_percentage from Queries group by query_name
题解:采用正则表达式
一般来说,如果你被要求匹配一个字符串,应该最先想到写一个正则表达式模式进行匹配。
正则表达式提供各种功能,以下是一些相关功能:
^:表示一个字符串或行的开头
[a-z]:表示一个字符范围,匹配从 a 到 z 的任何字符。
[0-9]:表示一个字符范围,匹配从 0 到 9 的任何字符。
[a-zA-Z]:这个变量匹配从 a 到 z 或 A 到 Z 的任何字符。请注意,你可以在方括号内指定的字符范围的数量没有限制,您可以添加想要匹配的其他字符或范围。
[^a-z]:这个变量匹配不在 a 到 z 范围内的任何字符。请注意,字符 ^ 用来否定字符范围,它在方括号内的含义与它的方括号外表示开始的含义不同。
[a-z]*:表示一个字符范围,匹配从 a 到 z 的任何字符 0 次或多次。
[a-z]+:表示一个字符范围,匹配从 a 到 z 的任何字符 1 次或多次。
.:匹配任意一个字符。
\.:表示句点字符。请注意,反斜杠用于转义句点字符,因为句点字符在正则表达式中具有特殊含义。还要注意,在许多语言中,你需要转义反斜杠本身,因此需要使用\\.。
$:表示一个字符串或行的结尾。
# 前缀 名称是一个字符串,可以包含字母(大写或小写),数字,下划线 '_' ,点 '.' 和/或破折号 '-' 。 # 前缀名称 必须 以字母开头。 # 域 为 '@leetcode.com' 。 SELECT * FROM Users WHERE # 保存某些条件,分隔开 正则表达式 mail REGEXP '^[a-zA-Z][a-zA-Z0-9_.-]*\\@leetcode\\.com$';