SELECT查询时,是根据主键排序
ORDER BY
子句(默认升序 ASC
,可省略)SELECT id, name, gender, score FROM students ORDER BY score;
DESC
ORDER BY <列名> DESC # 降序排列
SELECT id, name, gender, score FROM students ORDER BY score DESC;
SELECT id, name, gender, score FROM students ORDER BY score DESC, gender;
# 先根据分数降序,然后根据性别
WHERE
子句,那么ORDER BY
子句要放到WHERE
子句后面SELECT id, name, gender, score
FROM students
WHERE class_id = 1
ORDER BY score DESC;
查询时,如果结果集数据量很大,分页显示
可以通过LIMIT <M> OFFSET <N>
子句实现。每次显示最多 M 条,从第 N 条记录开始算
SELECT id, name, gender, score
FROM students
ORDER BY score DESC
LIMIT 3 OFFSET 0; # 每页3条记录,从第0条开始
OFFSET
超过了查询的最大数量不会报错,得到一个空集
OFFSET
是可选的,如果只写LIMIT 15
== LIMIT 15 OFFSET 0
在MySQL中,LIMIT 15 OFFSET 30
== LIMIT 30, 15
使用LIMIT <M> OFFSET <N>
分页时,随着N
越来越大,查询效率也会越来越低
SQL内置的COUNT()
函数查询行数
SELECT COUNT(*) FROM students; # 返回一个二维表 ,一行一列
共有10条记录
设置别名
SELECT COUNT(*) num FROM students;
函数 | 说明 |
---|---|
SUM | 计算某一列的合计值,该列必须为数值类型 |
AVG | 计算某一列的平均值,该列必须为数值类型 |
MAX | 计算某一列的最大值,可以对字符串排序 |
MIN | 计算某一列的最小值,可以对字符串排序 |
SELECT AVG(score) average FROM students WHERE gender = 'M';
特别注意:WHERE
没有匹配到任何行,COUNT()会返回0
,而SUM()、AVG()、MAX()和MIN()会返回 NULL
SELECT class_id, COUNT(*) num FROM students GROUP BY class_id;
使用多个列
进行分组。例如,统计各班的男女人数:
SELECT class_id, gender, COUNT(*) num FROM students
GROUP BY class_id, gender;
每个班级的平均分
SELECT class_id, AVG(score) avgsc FROM students
GROUP BY class_id ORDER BY avgsc DESC;
每个班级男生和女生的平均分
SELECT class_id, gender, AVG(score) avgsc FROM students
GROUP BY class_id, gender ORDER BY avgsc DESC;
题目:
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。 如果不存在第二高的薪水,那么查询应返回 null。
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/second-highest-salary 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题:
DISTINCT
去重,题目要求不能并列(200,200的话,第二高为NULL)# Write your MySQL query statement below
SELECT
(
SELECT DISTINCT Salary
FROM Employee ORDER BY Salary DESC
LIMIT 1 OFFSET 1
)
SecondHighestSalary
194 ms
题目: 编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。
+----+--------+
| Id | Salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。 如果不存在第 n 高的薪水,那么查询应返回 null。
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200 |
+------------------------+
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/nth-highest-salary 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题:
N-1
的值,不支持 OFFSET N-1
写法CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
set n = N-1;
RETURN (
# Write your MySQL query statement below.
SELECT DISTINCT Salary
FROM Employee ORDER BY Salary DESC
LIMIT 1 OFFSET n
);
END
246 ms
题目:
编写一个 SQL 查询,查找 Person 表中所有重复的电子邮箱。
Create table If Not Exists Person (Id int, Email varchar(255))
Truncate table Person
insert into Person (Id, Email) values ('1', 'a@b.com')
insert into Person (Id, Email) values ('2', 'c@d.com')
insert into Person (Id, Email) values ('3', 'a@b.com')
示例:
+----+---------+
| Id | Email |
+----+---------+
| 1 | a@b.com |
| 2 | c@d.com |
| 3 | a@b.com |
+----+---------+
根据以上输入,你的查询应返回以下结果:
+---------+
| Email |
+---------+
| a@b.com |
+---------+
说明:所有电子邮箱都是小写字母。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/duplicate-emails 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题:
使用 HAVING
关键字
# Write your MySQL query statement below
SELECT Email FROM Person GROUP BY Email HAVING COUNT(Email)>1;
265 ms
题目:
某城市开了一家新的电影院,吸引了很多人过来看电影。 该电影院特别注意用户体验,专门有个 LED显示板做电影推荐,上面公布着影评和相关电影描述。
作为该电影院的信息部主管,您需要编写一个 SQL查询,找出所有影片描述为非 boring (不无聊) 的并且 id 为奇数 的影片,结果请按等级 rating 排列。
例如,下表 cinema:
+---------+-----------+--------------+-----------+
| id | movie | description | rating |
+---------+-----------+--------------+-----------+
| 1 | War | great 3D | 8.9 |
| 2 | Science | fiction | 8.5 |
| 3 | irish | boring | 6.2 |
| 4 | Ice song | Fantacy | 8.6 |
| 5 | House card| Interesting| 9.1 |
+---------+-----------+--------------+-----------+
对于上面的例子,则正确的输出是为:
+---------+-----------+--------------+-----------+
| id | movie | description | rating |
+---------+-----------+--------------+-----------+
| 5 | House card| Interesting| 9.1 |
| 1 | War | great 3D | 8.9 |
+---------+-----------+--------------+-----------+
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/not-boring-movies 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题:
# Write your MySQL query statement below
SELECT * FROM cinema
WHERE description != 'boring'
AND id%2 = 1
ORDER BY rating DESC
或者用 mod(id,2) = 1
!=
也可以用<>
198 ms
题目:
某网站包含两个表,Customers 表和 Orders 表。 编写一个 SQL 查询,找出所有从不订购任何东西的客户。
Customers 表:
+----+-------+
| Id | Name |
+----+-------+
| 1 | Joe |
| 2 | Henry |
| 3 | Sam |
| 4 | Max |
+----+-------+
Orders 表:
+----+------------+
| Id | CustomerId |
+----+------------+
| 1 | 3 |
| 2 | 1 |
+----+------------+
例如给定上述表格,你的查询应返回:
+-----------+
| Customers |
+-----------+
| Henry |
| Max |
+-----------+
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/customers-who-never-order 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题:
NOT IN
关键字
# Write your MySQL query statement below
SELECT C.Name Customers
FROM Customers C
WHERE C.Id NOT IN
(
SELECT CustomerId FROM Orders
)
或者
# Write your MySQL query statement below
SELECT C.Name Customers
FROM Customers C
LEFT OUTER JOIN Orders O
ON C.Id = O.CustomerId
WHERE O.CustomerId is null
363 ms
题目:
有一个courses 表 ,有: student (学生) 和 class (课程)。
请列出所有超过或等于5名学生的课。
例如,表:
+---------+------------+
| student | class |
+---------+------------+
| A | Math |
| B | English |
| C | Math |
| D | Biology |
| E | Math |
| F | Computer |
| G | Math |
| H | Math |
| I | Math |
+---------+------------+
应该输出:
+---------+
| class |
+---------+
| Math |
+---------+
Note:
学生在每个课中不应被重复计算。(有课程中,重复出现2次A,只算一次)
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/classes-more-than-5-students 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题:
# Write your MySQL query statement below
SELECT class FROM courses GROUP BY class
HAVING COUNT(DISTINCT student) >= 5;
206 ms