由于题目要求:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:,所以应该用LEFT JOIN 才会返回table A 有 而 table B 无(值为Null)的行
select p.FirstName, p.LastName, a.City, a.State from Person p left join Address a on p.PersonId = a.PersonId;即:输出某列中第二大的数字
知识点: 1.limit子句可以被用于强制select语句返回指定记录数 2.limit接受一个或两个整型参数 3.第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目 4.初始记录行的偏移量是0(不是1) 5.为了与pgsql兼容,MySQL也支持语法 limit # offset # 6.limit子句位于order by子句之后 select distinct 可以保证元素不重复order by column 默认是升序排序,若需为降序,应为 order by column desc方法一: 将该column的值降序(order by column desc),再限制(limit)从第1行后开始,仅输出1行(limit 1,1)
select distinct Salary SecondHighestSalary from Employee order by Salary desc limit 1,1但是,当不存在第二高元素值时,上述并不返回null,与题目意思不符。 修正:
select (select distinct Salary from Employee order by Salary desc limit 1,1) as SecondHighestSalary±—±------±-------±----------+ | Id | Name | Salary | ManagerId | ±—±------±-------±----------+ | 1 | Joe | 70000 | 3 | | 2 | Henry | 80000 | 4 | | 3 | Sam | 60000 | NULL | | 4 | Max | 90000 | NULL | ±—±------±-------±----------+
分析: 数据库按照一行一行的模式对table进行扫描。现在目的是,对当前扫描的object,比较object.Salary 与 object.ManagerId 对应的Salary。如何保证,我第二次扫描的是上一次扫描的object.ManagerId呢?用实例对象e来指向。
错误的想法:
select Email from Person.Personnel where Email = any(select Email from Person.Personnel); 1)any()表示若有任何一个满足就返回 eg: elect * from student where 班级=’01’ and age > any (select age from student where 班级=’02’); 就是说,查询出01班中,年龄大于 02班任意一个 的 同学2) 如果没有any() 会报错:Subquery returns more than 1 row正确做法:
select Email from Person group by Email having count(Email) > 1 1 )GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组2 )GROUP BY必须得配合聚合函数来用,分组之后你可以计数(COUNT),求和(SUM),求平均数(AVG)等。