多表连接
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