数据库操作

数据库操作


气温上升

给你一个叫Weather的表,列出气温比前一天高的行的id,例如:

  • Given:
Id(INT)Date(DATE)Temperature(INT)
12015-01-0110
22015-01-0225
32015-01-0320
42015-01-0430
  • return:
Id
2
4
SELECT a.id
FROM Weather as a, Weather as b
WHERE DATEDIFF(a.date, b.date) = 1 
      AND a.temperature > b.temperature

知识点:自联结,聚集函数DATEDIFF(date1, date2),当需要比较同列的值时,往往需要用到自联结(表自己和自己联结),为了消除二义性需要为表设置别名(AS)

Rising Temperature


找出薪水比经理高的雇员

例如:1(Joe)的经理是3(Sam),且Joe的薪水比Sam高
表名为Employee

IdNameSalaryManagerId
1Joe700003
2Henry800004
3Sam60000NULL
4Max90000NULL

返回:

Employee
Joe

解1:

SELECT e1.Name as Employee
FROM Employee as e1, Employee as e2
WHERE e1.ManagerId = e2.Id AND e1.Salary > e2.Salary

解2:

SELECT e1.Name as Employee
FROM Employee as e1 INNER JOIN Employee as e2
ON e1.ManagerId = e2.Id AND e1.Salary > e2.Salary

知识点:别名,等值联结/内部联结。内部联结中,被联结两表中的行都能在另一个表里找到关联行。

Employees Earning More Than Their Managers


重复的Email

例如:
表名为Person

IdEmail
1a@b.com
2c@d.com
3a@b.com

返回

Email
a@b.com

表Person中a@b.com出现了2次。

SELECT Email
FROM Person
GROUP BY Email
HAVING COUNT(*) > 1

知识点:分组数据(GROUP BY… HAVING),将表中各行按Email分组,并统计各组的行数COUNT(*),组内的过滤需用HAVING而不是WHERE

Duplicate Emails


二表合并

表名Person

Column NameType
PersonIdint
FirstNamevarchar
LastNamevarchar

表名Address

Column NameType
AddressIdint
PersonIdint
Cityvarchar
Statevarchar

将表Person和表Address合并显示为

FirstNameLastNameCityState

不论合并后,表中的人是否有地址

SELECT p.FirstName, p.LastName, a.City, a.State
FROM Person as p LEFT OUTER JOIN Address as a
ON p.PersonId = a.PersonId

知识点:外部联结(LEFT/RIGHT OUTER JOIN … ON)。注意表Person中出现的人不一定也在表Address中出现,需使用外部联结才能包含没有关联行的行,这里的LEFT表示结果包含左表(LEFT关键字左边的表Person)所有的行。

Combine Two Tables


没有订单的用户

Table: Customers.

IdName
1Joe
2Henry
3Sam
4Max

Table: Orders.

IdCustomerId
13
21

由上面连个表返回

Customers
Henry
Max

表联结不写表名\表别名不行,且别名是区分大小写的,判断是否存在可以用

  • WHERE field IS NULL
SELECT c.Name AS Customers
FROM Customers AS c 
LEFT JOIN Orders AS o 
ON c.Id = o.CustomerId
WHERE o.CustomerId IS NULL
  • WHERE field NOT IN table
SELECT c.Name AS Customers
FROM Customers AS c
WHERE c.Id NOT IN (SELECT o.CustomerId 
                   FROM Orders AS o)
  • WHERE NOT EXISTS
SELECT c.Name AS Customers
from Customers AS c
WHERE NOT EXISTS (SELECT 1 
                  FROM Orders AS o 
                  WHERE c.Id = o.CustomerId)

Customers Who Never Order

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值