表结构
Create table Person (PersonId int, FirstName varchar(255), LastName varchar(255))
Create table Address (AddressId int, PersonId int, City varchar(255), State varchar(255))
Truncate table Person
insert into Person (PersonId, LastName, FirstName) values ('1', 'Wang', 'Allen')
Truncate table Address
insert into Address (AddressId, PersonId, City, State) values ('1', '2', 'New York City', 'New York')
题目,编写一个 SQL 查询,满足条件:无论 person 是否有地址信息,都需要基于上述两表提供 person 的以下信息:FirstName, LastName, City, State
解题答案:
select p.FirstName, p.LastName, a.City, a.State
from Person p left join Address a
on p.PersonId = a.PersonId
涉及知识点:
1、drop、truncate和delete的用法
drop table tablename: 删除内容和定义,释放空间。本质上是把整个表去掉.以后要新增数据是不可能的,除非新增一个表。
truncate table tablename: 清空表中的所有数据,速度较快,不可回滚,其本质上是对整张表进行删除再重新创建表。
delete table tablename:逐行删除数据,每步删除都是有日志记录的,并且可以回滚数据;本质上是逐行删除表中的数据。
2、SQL的join用法
1、Inner join(简单的Join),内连接,只匹配相同的部分,即两个数据表的交集部分。
2、left join(左连接),以left join左边的表为基准,将右边的表与之匹配,右边无对应的数据显示null。
3、right join(右链接),和left join想对应,以右边的表为基准,将左边的表进行一一对应,不存在的显示null。
4、full outer join(全连接),生成两个数据表的全集。
Create table If Not Exists Employee (Id int, Salary int)
Truncate table Employee
insert into Employee (Id, Salary) values ('1', '100')
insert into Employee (Id, Salary) values ('2', '200')
insert into Employee (Id, Salary) values ('3', '300')
题目
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary)命名为SecondHighestSalary
解题答案:
select ifnull((select distinct Salary from Employee
order by Salary desc limit 1 offset 1),null) as SecondHighestSalary
涉及知识点:
1、要取出第二高的薪水值,首先对数据进行排序用 order by desc 进行降序排序;
2、由于可能存在重复值采用distinct去重;
3、显示第二高的薪水,可采用limit n offset m ,limit含义是显示前n个,offset是跳过前m个;
4、考虑特殊情况若是第二高的不存在,则会报错,需要采用ifnull(a,b)函数进行判断,ifnull(a,b)表示若存在显示a,不存在显示b的结果。
表结构
Create table If Not Exists Employee (Id int, Salary int)
Truncate table Employee
insert into Employee (Id, Salary) values ('1', '100')
insert into Employee (Id, Salary) values ('2', '200')
insert into Employee (Id, Salary) values ('3', '300')
题目
编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)
解题答案
CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
declare m INT;
set m=N-1;
RETURN (
# Write your MySQL query statement below.
select ifnull((select distinct Salary from employee order by
Salary desc limit m,1),null)
);
END
解题思路
该题与上题类似,不同的是多了个函数,其中主要涉及的知识点如下:
#1、创建函数的格式
create function function_name(para para_type) return return_type
begin
function_body
end
#2、定义变量
declare value value_type
#3、每个语句结束用“;”结尾