1965.丢失信息的雇员
表: Employees
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| employee_id | int |
| name | varchar |
+-------------+---------+
employee_id 是这个表的主键。每一行表示雇员的id 和他的姓名。
表: Salaries
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| employee_id | int |
| salary | int |
+-------------+---------+
employee_id is 这个表的主键。每一行表示雇员的id 和他的薪水。
写出一个查询语句,找到所有 雇员的 姓名 丢失了,或者雇员的 薪水信息 丢失了的雇员id。
返回这些雇员的id employee_id , 从小到大排序 。
答案解析
联表查询,全连接,但是mysql不值钱完全外连接, 所有可以有左连接和有连接拼起来
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
SELECT A.employee_id FROM employees A LEFTJOIN salaries B ON A.employee_id = B.employee_id
WHERE B.salary ISNULLUNIONSELECT B.employee_id FROM employees A RIGHTJOIN salaries B ON A.employee_id = B.employee_id
WHERE A.name ISNULLORDERBY employee_id
1795.每个产品在不同商店的价格
表:Products
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| product_id | int |
| store1 | int |
| store2 | int |
| store3 | int |
+-------------+---------+
这张表的主键是product_id(产品Id)。
每行存储了这一产品在不同商店store1, store2, store3的价格。如果这一产品在商店里没有出售,则值将为null。
请你重构 Products 表,查询每个产品在不同商店的价格,
使得输出的格式变为(product_id, store, price) 。如果这一产品在商店里没有出售,则不输出这一行。
输出结果表中的 顺序不作要求 。
输入:
Products table:
+------------+--------+--------+--------+
| product_id | store1 | store2 | store3 |
+------------+--------+--------+--------+
| 0 | 95 | 100 | 105 |
| 1 | 70 | null | 80 |
+------------+--------+--------+--------+
输出:
+------------+--------+-------+
| product_id | store | price |
+------------+--------+-------+
| 0 | store1 | 95 |
| 0 | store2 | 100 |
| 0 | store3 | 105 |
| 1 | store1 | 70 |
| 1 | store3 | 80 |
+------------+--------+-------+
答案解析
行转列用groupby,列转行用union all
union all 和 union 区别是 union all 不去重
sumif
SELECT product_id,'store1' store,store1 price
FROM products
WHERE store1 ISNOTNULLUNIONALLSELECT product_id,'store2' store,store2 price
FROM products
WHERE store2 ISNOTNULLUNIONALLSELECT product_id,'store3' store,store3 store
FROM products
WHERE store3 ISNOTNULL
608.树节点
给定一个表 tree,id 是树节点的编号, p_id 是它父节点的 id 。
+----+------+
| id | p_id |
+----+------+
| 1 | null |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
+----+------+
树中每个节点属于以下三种类型之一:
-叶子:如果这个节点没有任何孩子节点。
--根:如果这个节点是整棵树的根,即没有父节点。
--内部节点:如果这个节点既不是叶子节点也不是根节点。
写一个查询语句,输出所有节点的编号和节点的类型,并将结果按照节点编号排序。上面样例的结果为:
+----+------+
| id | Type |
+----+------+
| 1 | Root |
| 2 | Inner|
| 3 | Leaf |
| 4 | Leaf |
| 5 | Leaf |
+----+------+
答案解析
not in与null值, 如果not in 集合里有null值,那直接返回null 对应结果为false
简单的case语句的几种用法
CASEWHEN condition THEN result ELSE result ENDCASEWHEN p_id ISNULLTHEN'Root'WHEN id NOTIN(SELECT p_id FROM tree WHERE p_id ISNOTNULL)THEN'Leaf'ELSE'Inner'ENDCASE SCORE WHEN'A'THEN'优'ELSE'不及格'END
答案:
SELECT
id,CASEWHEN p_id ISNULLTHEN'Root'WHEN id NOTIN(SELECT p_id FROM tree WHERE p_id ISNOTNULL)THEN'Leaf'ELSE'Inner'ENDAS'type'FROM tree
176.第二高的薪水
Employee 表:
+-------------+------+
| Column Name | Type |
+-------------+------+
| id | int |
| salary | int |
+-------------+------+
id 是这个表的主键。
表的每一行包含员工的工资信息。
编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null 。
输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1 | 100 |
| 2 | 200 |
| 3 | 300 |
+----+--------+
输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200 |
+---------------------+
答案解析
limit 用法:
select*from tableName limit i,n
# tableName:表名# i:为查询结果的索引值(默认从0开始),当i=0时可省略i# n:为查询结果返回的数量# i与n之间使用英文逗号","隔开
关键字 distinct 去重
SELECTDISTINCT name from A
查询第二大, 先查询全部,然后去重,然后降序排序,然后获取limit获取第二个
如果上面的操作没有查到值,那就返回null, 然后给查询内容命名
SELECT IFNULL((SELECTDISTINCT salary
FROM employee
ORDERBY salary DESCLIMIT1,1),null) SecondHighestSalary
总结:
- MySQL没有全外连接,用左右连接 + union all
- 把整行的拆散为多行用union, 把多行合并成整行用 group by
- 如果not in 集合里有null值,那直接返回null 对应结果为false,不会真正判断有没有在集合里
- case 语句用法 CASE WHEN condition THEN result1 ELSE result2 END
- DISTINCT去重 SELECT DISTINCT name from A
- LIMIT 用法 取i - n,从0开始: SELECT * FROM table limit i,n
版权归原作者 ly甲烷 所有, 如有侵权,请联系我们删除。