1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| 表1: Person
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | PersonId | int | | FirstName | varchar | | LastName | varchar | +-------------+---------+ PersonId 是上表主键 表2: Address
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | AddressId | int | | PersonId | int | | City | varchar | | State | varchar | +-------------+---------+ AddressId 是上表主键
|
编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:
FirstName, LastName, City, State
1 2 3
| SELECT FirstName, LastName, City, State FROM Person LEFT JOIN Address on Person.PersonId = Address.PersonId;
|
数据库在连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。在使用left join
时,on
和while
条件的区别如下:
on
条件实在生成临时表时使用的条件,他不管on中的条件是否为真,都会返回左边表中的记录
where
条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join
的含义(必须返回左边表的记录了),条件不为真的就全部过滤掉。
183. 从不订购的客户
某网站包含两个表,Customers 表和 Orders 表。编写一个 SQL 查询,找出所有从不订购任何东西的客户。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| Customers 表: +----+-------+ | Id | Name | +----+-------+ | 1 | Joe | | 2 | Henry | | 3 | Sam | | 4 | Max | +----+-------+ Orders 表: +----+------------+ | Id | CustomerId | +----+------------+ | 1 | 3 | | 2 | 1 | +----+------------+ 例如给定上述表格,你的查询应返回: +-----------+ | Customers | +-----------+ | Henry | | Max | +-----------+
|
可以使用 not in
来查询不在此列表中的客户
1 2 3 4 5
| SELECT customers.name as 'Customers' FROM customers where customers.id not in ( SELECT customerid from orders );
|
196. 删除重复的电子邮箱
编写一个 SQL 查询,来删除 Person 表中所有重复的电子邮箱,重复的邮箱里只保留 Id 最小 的那个。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| +----+------------------+ | Id | Email | +----+------------------+ | 1 | john@example.com | | 2 | bob@example.com | | 3 | john@example.com | +----+------------------+ Id 是这个表的主键。 例如,在运行你的查询语句之后,上面的 Person 表应返回以下几行:
+----+------------------+ | Id | Email | +----+------------------+ | 1 | john@example.com | | 2 | bob@example.com | +----+------------------+
|
先将词表与它自身在电子邮箱列中连接起来,然后我们需要找到其他记录中具有相同电子邮件地址的更大ID。所以在``WHERE`自自居中添加一个新的条件。
1 2 3 4
| DELETE p1 FROM Person p1, Person p2 WHERE p1.Email = p2.Email AND p1.Id > p2.Id
|
197. 上升的温度
给定一个 Weather 表,编写一个 SQL 查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 Id。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| +---------+------------------+------------------+ | Id(INT) | RecordDate(DATE) | Temperature(INT) | +---------+------------------+------------------+ | 1 | 2015-01-01 | 10 | | 2 | 2015-01-02 | 25 | | 3 | 2015-01-03 | 20 | | 4 | 2015-01-04 | 30 | +---------+------------------+------------------+ 例如,根据上述给定的 Weather 表格,返回如下 Id:
+----+ | Id | +----+ | 2 | | 4 | +----+
|
DATEIFF:计算DATA时间差
1 2 3
| SELECT A.Id as "Id" FROM Weather as A, Weather as B where DATEDIFF(A.RecordDate, B.RecordDate) = 1 AND A.Temperature > B.Temperature
|