justdo-it  

1、Employee 表包含所有员工,包括他们的经理。每个员工都有一个 Id,此外还有一列对应的经理 Id。

+----+-------+--------+-----------+
| Id | Name  | Salary | ManagerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | NULL      |
| 4  | Max   | 90000  | NULL      |
+----+-------+--------+-----------+

Employee 表中,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工。在上面的表格中,Joe 是唯一一个收入超过他经理的员工。

+----------+
| Employee |
+----------+
| Joe      |
+----------+

解法一:SELECT e1.Name Employee FROM Employee e1, Employee e2 WHERE e1.ManagerId = e2.Id AND e1.Salary > e2.Salary;
解法二:SELECT e1.Name Employee FROM Employee e1 JOIN Employee e2 ON e1.ManagerId = e2.Id WHERE e1.Salary > e2.Salary;
注意:将结果的header name重命名为Employee.


2、编写一个 SQL查询 来查找名为 Person 的表中的所有重复电子邮件。

示例:

+----+---------+
| Id | Email   |
+----+---------+
| 1  | a@b.com |
| 2  | c@d.com |
| 3  | a@b.com |
+----+---------+

根据以上输入,您的查询应返回以下结果:

+---------+
| Email   |
+---------+
| a@b.com |
+---------+

注意事项: 所有电子邮件都是小写字母。

解法一:SELECT Email FROM Person GROUP BY Email HAVING COUNT(*) > 1;

解法二:SELECT DISTINCT p1.Email FROM Person p1 JOIN Person p2 ON p1.Email = p2.Email WHERE p1.Id <> p2.Id;

 

3、组合两表

 

表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


解法一:SELECT Person.FirstName, Person.LastName, Address.City, Address.State FROM Person LEFT JOIN Address ON Person.PersonId = Address.PersonId;
解法二:SELECT Person.FirstName, Person.LastName, Address.City, Address.State FROM Person LEFT JOIN Address USING(PersonId);
(在使用Left Join时,我们也可以使用关键Using来声明我们相用哪个列名来进行联合:)
解法三:SELECT Person.FirstName, Person.LastName, Address.City, Address.State FROM Person NATURAL LEFT JOIN Address;
(我们可以加上Natural关键字,这样我们就不用声明具体的列,MySQL可以自行搜索相同的列)



 

 

 



posted on 2018-02-27 18:13  justdo-it  阅读(188)  评论(0)    收藏  举报