d.(e.) SCOTT.emp eSCOTT.dept d e.(+)=d.e.(+)>() d./
select ci.ci_id ci_id, listagg(stu.stu_name,',') stu_name
from pm_ci ci,pm_stu stu
where instr(ci.stu_ids,stu.stu_id) > 0
group by ci.ci_id
order by ci.ci_id
我和你理解一样
大于集合的最小值即可
没有说是大于集合的所有值
因为测试表数据量少,等实际工作中遇到数据庞大的表,多表查询对cpu的消耗是大于相关子查询的。
emp表在scott用户下面
select ci_id,MAX(M) from (
select ci_id,wm_concat(stu_name) over (partition by c.ci_id order by s.stu_id)m from pm_ci c,pm_stu s where instr(c.stu_ids,s.stu_id)>0)e group by e.ci_id;
多表查询分为等值查询、不等值查询、where不用等号绑定说明使用的是不等值查询。不过一般项目中使用的最多的就是等号查询。
现在的高级程序员都喜欢用命令行的方式写代码。。。
select 1 from dual where null != null;
select 1 from dual where null is null;
安利一款更好的神级编辑器:sublime text
SQL> select distinct mgr from emp where mgr is not null; MGR ---------- 7839 7782 7698 7902 7566 7788 已选择6行。
用distinct可以找到不重复记录,
select distinct mgr from emp where mgr is not null;
上面这条语句的功能可以找到所有老板。很明显King(7839)是包括在里面的,为什么select * from emp where empno not in(select mgr from emp where mgr is not null)得到的记录不包括King而只是全部非老板员工呢?那是因为对比查找的时候,King这个人并没有被排除,当用他的empno对比上面6个数据时,自然会匹配到7839(King),从而被排除。故最终结果只会输出8个非老板员工(即全部员工剪去上面6个老板员工)。
为啥我用这个会报错呢?listagg是个什么函数,没看懂
就近原则,如果子查询内有符合 ‘emp’ 的 表/集合,就采用子查询内的,所以第二条语句的emp.deptno用的是子查询内的而不是子查询外的。
1、先创建表及初始化数据
①创建及初始化学生表PM_STU
create table PM_STU(STU_ID VARCHAR2(20) NOT NULL,
STU_NAME VARCHAR2(20));
INSERT INTO PM_STU VALUES(1,'张三');
INSERT INTO PM_STU VALUES(2,'李四');
INSERT INTO PM_STU VALUES(3,'王五');
INSERT INTO PM_STU VALUES(4,'赵六');
②创建及初始化选课表PM_CI
先创建一个PM_CI1来转换成PM_CI
CREATE TABLE PM_CI1(CI_ID VARCHAR2(20) NOT NULL,
STU_IDS VARCHAR2(20));
INSERT INTO PM_CI1 VALUES(1,1);
INSERT INTO PM_CI1 VALUES(1,2);
INSERT INTO PM_CI1 VALUES(1,3);
INSERT INTO PM_CI1 VALUES(1,4);
INSERT INTO PM_CI1 VALUES(2,1);
INSERT INTO PM_CI1 VALUES(2,4);
创建PM_CI,并插入数据
CREATE TABLE PM_CI(CI_ID VARCHAR2(20) NOT NULL,
STU_IDS VARCHAR2(20));
INSERT INTO PM_CI SELECT CI_ID,WM_CONCAT(STU_IDS) FROM PM_CI1 GROUP BY CI_ID;
---先做出两张表的笛卡尔积,再根据有效的条件instr(a.STU_IDS,b.STU_ID) !=0,过滤得到每个科目对应的学生
select a.CI_ID ,b.STU_NAME
from PM_CI a,PM_STU b
where instr(a.STU_IDS,b.STU_ID) !=0;
---使用WM_CONCAT()函数,列转行
select CI_ID, WM_CONCAT(STU_NAME) SUT_NAME
from (
select a.CI_ID ,b.STU_NAME
from PM_CI a,PM_STU b
where instr(a.STU_IDS,b.STU_ID) !=0
)
group by CI_ID;