mysql交集和并集 sql 交集_mysql交集和并集


1、题目描述:create view emp_v as select * from employees where emp_no >10005;

如何获取emp_v和employees有相同的数据?


mysql交集和并集 sql 交集_SQL_02


解题思路:我是想到直接利用视图概念,创建的这个虚拟表emp_v包含employees着empno>10005的所有的信息,所有这两者相同的数据也就是emp_no的所有信息。但是看解析有使用 INTERSECT 关键字求 employees 和 emp_v 的交集,这是个知识盲点。


题目答案


知识点扩展:SQL中的"减(MINUS)"、“交(INTERSECT)”、“并(UNION ALL)"

(1) 这个类似于集合中的两个集合间进行相减、取交集、取并集等。SQL1 和SQL2两个查询,MINUS是从第一个查询结果减去第二个查询结果,如果有相交部分就减去相交部分;否则和第一个查询结果没有区别. INTERSECT是两个查询结果的交集,UNION ALL是两个查询的并集;


mysql交集和并集 sql 交集_sqlite_03


(2)在使用这三个关键字时要求字段类型和顺序要相同(名称可以不同)

(3)不能排序,如果非要加上排序则可以在集合运算后外面再套一个查询,然后再使用排序

2、将所有获取奖金的员工当前的薪水增加10%。


mysql交集和并集 sql 交集_SQL_04


题目解析:将所有获奖员工的当前薪水增加10%,应该想到这道题需要使用update 关键字更新salaries表。具体代码思路是:先将获奖员工的e.emp_no找出来与工资表建立内连接,然后再使用update进行更新表,但是这里有个疑问:为什么将salsry(1+0.1)中的0.1换成10%后就报错?是因为sqlite能识别小数不能识别分数吗?【求大佬赐教...】

题目答案:


UPDATE salaries set salary = salary*(1+0.1)
where emp_no in 
(select s.emp_no from salaries as s
inner join  emp_bonus as e  
on e.emp_no = s.emp_no
and s.to_date = '9999-01-01')


3、题目描述:针对库中的所有表生成select count(*)对应的SQL语句


mysql交集和并集 sql 交集_SQL_05


题目解析:emmm... 又是知识盲区,不知道sqlite_master的存在.. 本题是使用sqlite_master 来获取所有表的名字给name字段,并使用|| 将字符串连接起来


题目答案:select "select count(*) from " || name || ";" as cnts
from sqlite_master where type = 'table'


知识点扩展:SQLITE_MASTER

(1)作用:SQLite数据库中一个特殊的名叫 SQLITE_MASTER 上执行一个SELECT查询以获得所有表的索引。每一个 SQLite 数据库都有一个叫 SQLITEMASTER 的表, 它定义数据库的模式,即在sqlite_master 表上执行一个select可以获取所有表的索引!!!

(2)语法:


SELECT name FROM sqlite_master 
WHERE type=’table’ 
ORDER BY name;


sqlite_master 中可以获得所有表的索引,其中sqlite_master 表中的字段 name 是所有表的名字,字段 type 永远是 'table'。对于索引,type 等于 ‘index’, name 则是索引的名字,tbl_name 是该索引所属的表的名字!

详细使用参考:sqlite的系统表sqlite_master_数据库_一个人有了信仰,不管成不成功,至少不会迷茫。-CSDN博客

4、题目描述:按照dept_no进行汇总,属于同一个部门的emp_no按照逗号进行连接,结果给出dept_no以及连接出的结果employees


mysql交集和并集 sql 交集_mysql交集和并集_06


题目解析:此题又是知识盲点---不知道sqlite中的聚合函数使用,,看大佬们的解析才知道group_concat(x[,y]) 这个函数的存在。group_concat(X,[,y]),X表示需要连接的列名,split表示连接的分隔符,默认为逗号;在这里group_concat()聚合函数需要结合group by一起来使用,通过group by 来指定dept_no进行分组,各组的emp_no使用逗号进行连接 .


select dept_no, group_concat(emp_no) as employees
from dept_emp 
group by dept_no


知识点扩展SQLite 聚合函数中的 group_concat(x[,y])

(1)作用:该函数返回一个字符串,该字符串将会连接所有非NULL的x值。该函数的y参数将作为每个x值之间的分隔符,如果在调用时忽略该参数,在连接时将使用缺省分隔符","。再有就是各个字符串之间的连接顺序是不确定的。

(2)使用注意事项:在使用时需要和group by 一起使用

---记于2020/4/11