兩表沒有任何關(guān)聯(lián)時(shí)會(huì)產(chǎn)生迪卡爾機(jī):
select first_name , name from s_emp , s_dept;
等值連接:
練習(xí)一:查看員工的姓名和員工部門號(hào):(要考慮到表中實(shí)際數(shù)據(jù)中空值的影響)
select first_name , name from s_emp, s_dept where s_emp.dept_id=s_dept.id;
練習(xí)二:每個(gè)員工所在的部門和部門所在的地區(qū)
select first_name , name from s_emp, s_dept, s_region where s_emp.dept_id=s_dept.id and s_dept.region_id=s_region.id;
非等值連接
練習(xí)三:查出每個(gè)員工和每個(gè)員工的工資級(jí)別)
select a.ename , a.sal, b.grade from emp a , salgrade b where a.sal between b.losal and b.hisal;
select a.ename , a.sal, b.grade from emp a , salgrade b where a.sal>=b.losal and a.sal<=b.hisal;
自連接:
select first_name , manager_id from s_emp;
練習(xí)四:查出所有員工的部門領(lǐng)導(dǎo)的名稱:( 這種sql會(huì)少一條記錄,總經(jīng)理沒有被配置上)
select e.first_name , m.first_name from s_emp e , s_emp m where e.manager_id=m.id;7fg
外連接:(防止空值時(shí),用(+)的一方會(huì)模擬一條記錄配置另一方)這就稱為外連接,一個(gè)記錄都不能少;
select e.first_name , m.first_name from s_emp e , s_emp m where e.manager_id=m.id(+);
練習(xí)五:查看員工分部的部門:
select distinct(deptno) from emp ;
找出沒有員工的部門:(很經(jīng)典的一個(gè)例子,用外連接來解決的標(biāo)準(zhǔn)做法,這是一種方式,用子查詢也可以實(shí)現(xiàn))
第一步:
select e.deptno , d.deptno from emp e , dept d where e.deptno(+)=d.deptno;
第二步:(!L_=N
select e.deptno , d.deptno from emp e , dept d where e.deptno(+)=d.deptno and e.deptno is null;
練習(xí)六:查詢員工有多少人有提成:
select count( commission_pct ) from s_emp ;
select sum(commission_pct)/ count(*) from s_emp;
練習(xí)七:員工分部在多少個(gè)不同的部門:
select count(dept_id) from s_emp;
select count(distinct dept_id) from s_emp;
練習(xí)八:求各個(gè)部門的平均工資:
select dept_id , avg(salary) aa from s_emp group by dept_id order by aa ;
select dept_id , avg(salary) aa from s_emp group by dept_id ;
//體會(huì)下句sql
select region_id , count(*) from s_dept ****此句會(huì)有錯(cuò),請(qǐng)多體會(huì)********
select max(region_id) , count(*) from s_dept; (強(qiáng)制語法上可以正確,但是不能保證結(jié)果也會(huì)正確)
練習(xí)九:求各個(gè)部門不同工種的平均工資:
select dept_id , title, avg(salary) from s_emp group by dept_id , title ;
練習(xí)十:查詢哪些部門的平均工資比2000高:
select dept_id, avg(salary) aa from s_emp group by (dept_id) having avg(salary)>2000;
練習(xí)十一:除了42部門以外的部門的平均工資:
select dept_id , avg(salary) from s_emp group by (dept_id ) having dept_id!=42;
select dept_id , avg(salary) from s_emp where dept_id!=42 group by (dept_id ) ;(此種sql效率要高,先過濾再計(jì)算)
練習(xí)十二:求各個(gè)部門的平均工資:
//****這問題很經(jīng)典,為了過 oracle sql 語法關(guān)而寫max(d.name)
select max(d.name) , avg(e.salary) , max(r.name) from s_emp e, s_dept d , s_region r where e.dept_id = d.id and
d.region_id=r.id group by d.id ;
關(guān)于子查詢: Subqueries
練習(xí)十三:找出所有員工中,工資最低的那個(gè)員工:( 利用子查詢 )
select first_name, salary from s_emp where salary = ( select min(salary) from s_emp) ;
//這樣寫會(huì)出錯(cuò)姓名和工資不一致
select max(first_name), min(salary) from s_emp;
練習(xí)十四:查詢誰跟Smith的工種一樣:
select last_name from s_emp where last_name='Smith';
//下種寫法可能還存在bug,沒有考慮到數(shù)據(jù)的全面性,有潛在性問題
select last_name , title from s_emp where title =( select title from s_emp where last_name='Smith' )and
last_name <> 'Smith' ;
//這種寫法才考慮的比較全面
select last_name , title from s_emp where title in ( select title from s_emp where last_name='Smith' ) and
last_name <> 'Smith' ;
使用子查詢時(shí)應(yīng)注意: 單行子查詢返回多個(gè)結(jié)果時(shí)會(huì)有錯(cuò)誤 single-row subquery returns more than one value(
練習(xí)十五:查出哪些員工的工資比平均工資低:
select * from s_emp where salary < ( select avg(salary) from s_emp) ;
哪些部門的平均工資比32部門的平均工資要低:
第一步先查出各個(gè)部門的平均工資:
select min(avg(salary ) ) from s_emp group by dept_id;
第二步再查出哪個(gè)部門的工資是最低的:
select dept_id, avg(salary) from s_emp group by dept_id having avg(salary) = (select min(avg(salary) ) from
s_emp group by dept_id ) ;
練習(xí)十六:哪個(gè)部門里沒有員工(用子查詢的方式來實(shí)現(xiàn)):
select deptno from dept where deptno not in ( select deptno from emp );
posted on 2007-03-20 12:48
sunny 閱讀(430)
評(píng)論(0) 編輯 收藏