情定少林寺全集,成人mm小游戏,炼金手札
要查询的数据分布在多张表中(分布咋一张表,数据太多会造成冗余,而且分布在多张表有利于增删改查)。
****s_dept——系统自带的部门表
里面有三项信息:ID NAME REGION_ID
select * from s_dept;
****s_region——系统自带的地区表
里面有两项信息:ID NAME
select * from s_region;
select id, name, region_id from s_dept, s_region;
两张表里有同名的字段,会出现混淆
再加上表名代表信息来源于哪个表,这样就会出现笛卡尔积
select s_dept, id, s_dept, name, region_id, s_region, name from s_dept, s_region
输出了60条数据,本来不可能有这么多数据的,这说明产生了笛卡尔积。
这时应该使用连接条件,避免笛卡尔积:
select s_dept.id,s_dept.nam,region_id,s_region.name from s_dept,s_region where region_id=s_region.id/*连接条件*/ ; col name for a15;(调整格式)
select s_emp.id, first_name, name from s_emp, s_dept where dept_id=s_dept.id;
select s_emp.id, first_name.name from s_emp e, s_dept d where dept_id=d.id;
起了别名后就只能用别名,不然会报错!
select e.id, first_name.name from s_emp e, s_dept d where dept_id=d.id;
select first_name, d.name, r.name from s_emp e, s_dept d, s_region where e.dept_id=d.id and d.region_id=r.id;
***salgrade 工资级别表
GRADE 工资级别(1~5个级别)
LOSAL 级别的低工资
HISAL 级别的高工资
select * from salgrade;
select e.id, e.salary, s.grade from s_emp e, salgrade s where e.salary between s.losal and hisal;
或者:
select e.id, e.salary, s.grade from s_emp e, salgrade s where salary>=losal and salary<=hisal;
按id排个序:
select e.id, e.salary, s.grade from s_emp e.salgrade s where salary>=losal and salary<=hisal order by id;
一张表中有两层或两层以上业务含义的数据,要找出其中一层数据就逻辑上把一张表当成两张表使用。
例如:
s_emp员工表有两层业务含义的数据:
领导是员工
有些员工是领导,有些员工是普通员工,但都在一张表里
select m.id, m.first_name from s_emp e, s_emp m where e.manager_id=m.id;
把一张表当成两张表用.
但是这样会有重复的,因为一个领导可能管了几个人.
所以要进行排重.
select distinct m.id, m.first_name from s_emp e, s_emp m where e.manager_id=m.id;
select distinct m.id, m.first_name from s_emp e, s_emp m where e.manager_id!=m.id;
。。。。。。
这样输出了所有的,是不正确的,所以它的对立面不是这样简单的作法。所以要引入外连接。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Oracle字符串函数length、upper、lower、initcap、 concat、instr、replace
网友评论