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可以自行搜索相同的列)

浙公网安备 33010602011771号