转载:一位计算机专业大学生历程 
 
1965.丢失信息的雇员 写出一个查询语句,找到所有 丢失信息 的雇员id。当满足下面一个条件时,就被认为是雇员的信息丢失:
·雇员的姓名丢失了,或者
·雇员的薪水信息 丢失了
返回这些雇员的id  employee_id , 从小到大排序 。
考点 1.union与union all 
 
UNION 
UNION ALL 
 
 
重复结果 
去重 
保留 
 
排序处理 
排序 
只是合并 
 
效率处理 
低 
高 
 
 
 
2.having 
🔨在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。
HAVING 子句可以让我们筛选分组后的各组数据。
👉where 和having之后都是筛选条件 ,但是有区别的:
   ·where在group by前 , having在group by 后 
   ·聚合函数(avg、sum、max、min、count),不能作为条件放在where之后,但可以放在having之后
3.count() 
🔨是一个聚合函数,它返回符合条件行数。
4.as t 
这段的意义在于🔨起别名,每个派生表都需要有自己的别名,不起别名执行不了! 
5.group by 
字面意思:通过xxx分组
思路与代码 思路很简单:雇员的姓名丢失了或者雇员的薪水信息丢失,都会导致employee_id 在 employees 和salaries 的并集表 里面仅出现一次.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 select      employee_id  from      (     select  employee_id from  employees     union  all       select  employee_id from  salaries ) as  t group  by      employee_id having      count (employee_id) =  1  order  by      employee_id; 
 
1795. 每个产品在不同商店的价格 请你重构 Products 表,查询每个产品在不同商店的价格,使得输出的格式变为(product_id, store, price) 。如果这一产品在商店里没有出售,则不输出这一行。
输出结果表中的 顺序不作要求 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 输入: 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     | + 解释: 产品0 在store1,store2,store3的价格分别为95 ,100 ,105 。 产品1 在store1,store3的价格分别为70 ,80 。在store2无法买到。 
 
考点 
🧐行列转换
⚙
代码 
1 2 3 4 5 6 7 8 9 10 11 SELECT  product_id, 'store1'  store, store1 priceFROM  ProductsWHERE  store1 IS  NOT  NULL UNION  ALL SELECT  product_id, 'store2'  store, store2 priceFROM  ProductsWHERE  store2 IS  NOT  NULL UNION  ALL SELECT  product_id, 'store3'  store, store3 priceFROM  ProductsWHERE  store3 IS  NOT  NULL ;