SQL-基础知识练习

多表连接

1.Left Join :返回左表的所有记录,即使右表没有符合条件的记录,缺失值用NULL代替。
在这里插入图片描述
这个结果就是返回了左表的所有记录,右表中缺失的值用NULL代替。如果采用WHERE条件,则只返回personID为2的这行记录。

从不订购的客户

方法一:
1.采用左连接将左表的记录全部输出,右表中没有的为NULL
2.采用WHERE子句将CustomerId 为NULL的挑出来,就是从未订购的客户

SELECT Name AS  Customers  FROM Customers C
LEFT JOIN Orders O
ON O.CustomerId = C.ID 
WHERE O.CustomerId IS NULL

方法二:NOT IN

SELECT Customers.Name AS  Customers  FROM Customers
WHERE Customers.Id NOT IN 
(
    SELECT CustomerId FROM Orders
)

表自连接

如果要比较一个表里的某个列内的值,则考虑自连接
求收入比经理多的员工
如下图结果
在这里插入图片描述
方法一:
1.首先采用两个表的方式产生笛卡尔积结果集,即n*n个记录
2.然后用where子句筛选满足条件的记录
3.要产生如图的结果,则我们需要只取name列,并重命名
方法二:
1.采用表自连接的方式
2.当id=managerid时,就可以比较薪水高低了

select a.name as Employee from employee a
JOIN employee b
ON a.id=b.managerID AND a.salary>b.salary

查找重复的邮箱
方法一:
1.采用表自连接的方式,通过两个条件可筛选出重复值(会显示a表的两条重复值)
2.采用DISTINCT关键字,只显示唯一的重复值

select DISTINCT P1.Email FROM Person P1
JOIN Person P2
ON P1.Id != P2.Id AND P1.Email = P2.Email

方法二:
1.采用GROUP BY对Email列进行排序
2.采用HAVING和聚合函数将邮箱数目大于1的筛选出来

SELECT Email FROM Person 
GROUP BY Email
HAVING count(Email)>1

删除重复的电子邮箱
#删除 所有重复的电子邮件,只保留一个id最小的唯一电子邮件

delete p1 from Person p1,Person p2
where p1.email = p2.email and p1.id > p2.id;

上述语句表示从p1表中删除满足条件的行;
注意:建议在使用update和delete语句之前先用select语句进行验证;

1.采用表自连接,将p1中的记录和p2中的记录逐一比对,满足p1.email = p2.email的取出来

select * from Person p1,Person p2
where p1.email = p2.email;

在这里插入图片描述

2.满足 p1.id > p2.id的取出来

select * from Person p1,Person p2
where p1.email = p2.email and p1.id > p2.id;

在这里插入图片描述
3.删除

delete p1 from Person p1,Person p2
where p1.email = p2.email and p1.id > p2.id;

查找与之前(昨天的)日期相比温度更高的所有日期的 id

select W1.id from Weather W1,Weather W2
where datediff(W1.recordDate,W2.recordDate) = 1
and W1.Temperature > W2.Temperature

1.表自连接

select W1.id from Weather W1,Weather W2
where datediff(W1.recordDate,W2.recordDate) = 1

(过程)
在这里插入图片描述

2.where子句
在这里插入图片描述
只想要id列,则只取id列。

每位玩家 第一次登陆平台的日期
id相同的为同一玩家,即求id相同时的最小日期

select player_id,min(event_date) as first_login from Activity a
group by player_id
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值