select employee_name from employees
where 子句
select employee_name from employees where employee_age>25
select e.employee,s.salary from employees e,salary s where e.employee_id=s.employee_id;
该语句的数据源有2个数据表employees和salary
select distinct e.employee,s.salary from employees e,salary s where e.employee_id=s.employee_id;
select e.employee_id,e.employee_name,sum(s.salary) total_salary from employees e,salary s where e.employee_id=s.employee_id group by e.employee_id,e.employee_name;
对于数据源按列employee_id和employee_name进行分组
select e.employee_id,e.employee_name,sum(s.salary) total_salary from employees e,salary s where e.employee_id=s.employee_id group by e.employee_id,e.employee_name having (sum(s.salary))>10000
筛选工资总额大于10000的记录
select distinct e.employee,s.salary from employees e,salary s where e.employee_id=s.employee_id order by s.salary desc;
desc表示由高到低降序排列
select e.employee_name,sum(s.salary) total_salary from employees e,salary s where e.employee_id=s.employee_id group by e.employee_name order by total_salary desc
同时存在order by和group by时先执行 group by
根据哪一列分组就distinct哪列,否则会报错
select * from employees where employee_id in (select employee_id from salary);
create table tmp_user_objects as select * from user_objects where 1<>1;
子语句select * from user_objects where 1<>1;获得的是一个空结果集;利用改结果集创建数据表时,将创建一个空的数据表
insert into tmp_user_objects select * from user_objects where object_type='table';
select * from user_objects where object_type=’table’将这个查询的所有记录插入表tmp_user_objects
联合语句是指对于多个查询的结果集进行集合操作,运行结果仍然是一个记录集合
union还是合并2个结果集的所有记录并去重复
select student_id,student_name form a_student union select student_id,student_name from b_student
注意:union运算的2个结果集必须有完全相同的列数,并且各列具有相同的数据类型
union all和union都是并集运算,但union all不去重复,因此比union效率高,因此一旦确定2个结果集不会有重复数据时,应使用union all
select student_name from a_student intersect select student_name from b_student
minus是集合间的减法运算,返回第一个集合中存在,而第二个集合中不存在的记录
select student_name from a_student minus select student_name from b_student
在混合运算时这4种运算的优先级是相同的,因此按照资左至右的顺序执行
当然可以用括号进行优先级的调整
select student_name from a_student intersect(select student_name from a_student union all select student_name from b_student)
select employee_id,e.employee_name,s.month,s.salary from employees e natural join salary s
自然连接时不能给公共列指定限定词,比如employee_id(2个表都含有这个列),不是公共列的可以指定限定词,也可以不指定
自然连接实际自动指定了搜寻条件,首先,自然连接列必须同名,另外所有同名列都作为搜寻条件比如where t1.column=t2.column,如果2个表不存在同名列,其效果相当于笛卡尔积
自然连接强制使用公共列作为搜寻条件,因此不常用,但内连接可以自行制定连接列和连接条件
select employee_id,e.employee_name,s.month,s.salary from employees e inner join salary s on e.employee_id=s.employee_id;
默认情况下Oracle的连接为内连接,因此 inner可以省略,使用Join代替inner Join。多表查询时,尽量使用内连接
外连接总是以一个数据源为基础,将另外一个数据源与之进行条件匹配。即使条件不匹配,基础数据源中的数据总是出现在结果集中。
select employee_id,e.employee_name,s.month,s.salary from employees e left join salary s on e.employee_id=s.employee_id;
左连接
select employee_id,e.employee_name,s.month,s.salary from employees e right join salary s on e.employee_id=s.employee_id;
右连接
外连接简略写法
select employee_id,e.employee_name,s.month,s.salary from employees e salary s where e.employee_id=s.employee_id(+);
where e.employee_id=s.employee_id(+)表示salary为附属表employees为基础表
完全连接实际是一个左连接和一个右连接的组合,即先左连接,再右连接,再去重复
select employee_id,e.employee_name,s.month,s.salary from employees e full join salary s on e.employee_id=s.employee_id;
语法:select 列1,列2… from 表名 start with 开始条件 connect by 递归条件
start with 指定查询的起点,即从哪些记录开始查询;connect by指定递归条件,以获得下一条记录
select market_id,market_name from market start with market_name='亚洲' connect by prior market_id=parent_market_id;
start with market_name=’亚洲’指定查询的起点,connect by prior market_id=parent_market_id;前一条记录的market_id等于下一条记录的parent_market_id
connect by 遵循深度优先的搜索策略
sys_connect_by_path()对起始至当前记录之间的结果进行聚合操作,该操作仅限于串联字符串,语法:
sys_connect_by_path(列明,分隔符)
select market_id,market_name,sys_connect_by_path(market_name,'/') market_path from market start with market_name='北京' connect_by prior parent_market_id=market_id
其中market_path列的值为/北京/中国/亚洲
bin_to_num()函数,将二进制数转换为数值型
select bin_to_num(1,0,1) a,bin_to_num(1,0) b from dual
或者
select sum(data) from (select substr('101',rownum,1)* power(2,length('101')-rownum) data from dual connect by rownum <= length('101'))
表dual仅有1条记录x。但是当connect by rownum <= length(‘101’))获取下一条记录时,仍会获得x,直至获得记录总数=3(二进制101的位数)。针对每次获得的记录,Oracle依次计算各位置对应的实际数字(利用2的乘方运算)。最后求和便是最终的结果。
十进制转二进制实际是不停的除以2获取余数的过程,最后的余数应该是倒序的。
select replace(reverse(max(sys_connect_by_path(mod(floor(156/power(2,rownum-1)),2),'/'))),'/','') data form dual connect by floor(156/power(2,rownum-1))>1 order by rownum desc
其中connect by floor(156/power(2,rownum-1))>1 用于获取下一条记录。条件是以2为底数、以当前rownum-1为指数的乘方结果仍小于156,然后综合利用sys_connect_by_path()、max()、reverse()函数获得最终的二进制数据