where子句
案例:顯示工資低于5000的員工信息
select * from briup_emp where sal<5000;
案例:查詢?nèi)肼殨r間在2014-01-01之后的員工信息
select * from briup_emp where startdate>'2014-01-01'
案例:查詢工資在3000到5000之間的用工信息
select * from briup_emp where sal>3000 and sal<5000;
like子句(模糊查詢)
通配符:%:0到N個字符? ? _:一個字符
案例:查詢員工表中所有張姓的同事信息。
? ? ? ? ? ?select * from briup_emp where ename like '張%' ;
? ? ? ? ? ?查詢名字第三個字母是a的員工的姓名和工資申尤。
? ? ? ? ? ?select ename胶逢,sal from briup_emp where ename like '__a%';
? ? ? ? ? ?查詢名字中倒數(shù)第三個字母是a的員工的姓名和工資初坠。
? ? ? ? ? ?select ename,sal from briup_emp where ename like '%a__';
in子句
案例:查詢1號部門和二號部門的所有員工信息碟刺。
? ? ? ? ? ?select * from briup_emp where deptno in(1,2) ;
? ? ? ? ? ?select ename,deptno from briup_emp where deptno=1 or deptno=2;
is null子句
案例:查詢獎金為空的員工信息。
? ? ? ? ? ?select * from briup_emp where comm is null ;
? ? ? ? ? ?查詢獎金不為空的員工信息占哟。
? ? ? ? ? ?select * from briup_emp where comm is not null ;
and or子句
案例:查詢工資大于5000或獎金大于500且名字里有A這個字符的員工信息谬哀。
? ? ? ? ? ?select ename,sal,comm from briup_emp where (sal>5000 or comm>500) and ename like '%a%';
order by子句
案例:查詢所有員工的工資并且從低到高排序惹恃。
? ? ? ? ? ?select ename夭谤,sal from briup_emp order by sal;
? ? ? ? ? ?查詢所有員工的工資并且從高到低排序。
? ? ? ? ? ?select ename巫糙,sal from briup_emp order by sal;
? ? ? ? ? ?查詢所有員工的信息朗儒,按照部門編號的升序,工資的降序参淹。
? ? ? ? ? ?select ename醉锄,sal,deptno from briup_emp order by deptno承二,sal desc;
? ? ? ? ? ?將所有員工的年工資做降序排列榆鼠。
? ? ? ? ? ?select ename,sal*12 年工資 from briup_emp order by 年工資 desc;
數(shù)據(jù)的分組函數(shù)(組函數(shù))
max min avg sum count
問題:求員工表中最大工資和最小工資;
select max(sal),min(sal) from briup_emp;
問題:求員工表中最大工資的員工信息亥鸠;
select * from briup_empwhere sal=max(sal);? error;
where子句后不能使用分組函數(shù)
select * from briup_emp where sal=(select max(sal) from briup_emp);
?問題:查詢員工的平均工資
select avg(sal) from briup_emp;
問題:顯示一共有多少個員工
select count(empno) from briup_emp;
問題:查詢工資低于平均工資的員工的信息
select ename,sal from briup_emp where sal<(select avg(sal) from briup_emp);
distinct關(guān)鍵字
select count(distinct deptno) from briup_emp;
group by子句: 對查詢結(jié)果進行分組統(tǒng)計妆够,如果在select后面使用group by子句,就可以將行劃分為較小的組负蚊,一旦使用分組后select操作的對象就變成了分組后的數(shù)據(jù)神妹,
問題:查詢每個部門的平均工資
select deptno,avg(sal)from briup_emp group by deptno;?? 抽象成---->
select a,c,函數(shù)(b) from tablename group by a,c;
注意:在select列表所有未包含在組函數(shù)中的列都應(yīng)該包含在group by子句中。
問題:查詢每個部門編號的最高工資和最低工資家妆;
select deptno,max(sal),min(sal) from briup_emp group by deptno;
問題:查詢每個工種的最高工資和最低工資鸵荠;
select job,max(sal),min(sal) from briup_emp group by job;
having子句:對分組查詢的結(jié)果做限制
問題:查詢平均工資大于3000的部門編號
select deptno,avg(sal) from briup_emp group by deptno having avg(sal)>3000 order by deptno;
總結(jié):
1、在select列表所有未包含在組函數(shù)中的列都應(yīng)該包含在group
by子句中伤极。
2蛹找、組函數(shù)只能在select、having哨坪、order by中使用庸疾。
3、group by —>
having—>order by
where和having區(qū)別:(都是去設(shè)置限定條件)
where后面不能跟分組函數(shù) 当编,having
一號部門的平均工資(有些情況下可以通用)
where:select avg(sal) from briup_emp where deptno=1;
having:select avg(sal) from briup_emp group by deptno having deptno=1;
多表查詢(從多張表中查數(shù)據(jù)届慈,根據(jù)需求分析出要得到的數(shù)據(jù)來自于多張表)
問題:每個員工的姓名和工資和部門名稱。
select t1.ename,t1.sal,t2.dname from briup_emp t1,briup_dept t2 where t1.deptno=t2.deptno;
笛卡爾集
如果在進行多表查詢的時候不指定連接條件忿偷,就會導(dǎo)致將一個表中單的所有行都連接在另一個表的所有行上金顿,成為笛卡爾積,如果一個表中有5000條數(shù)據(jù)鲤桥,另一個表中有10條數(shù)據(jù)揍拆,將返回50000行。
為了避免笛卡爾積芜壁,需要在where中加入有效的連接條件礁凡。
等值連接(連接條件中為等號)
問題:每個員工的姓名和工資和部門名稱高氮。
select t1.ename,t1.sal,t2.dname from briup_emp t1,briup_dept t2 where t1.deptno=t2.deptno;
不等值連接(連接條件中不為等號)
問題:查看每個員工的姓名和工資和工資等級。
select t1.ename,t1.sal,t2.grade? from briup_emp t1,briup_salgrade t2 wheret1.sal>=t2.losal and t1.sal<=t2.hisal;
等價于
select t1.ename,t1.sal,t2.grade? from briup_emp t1,briup_salgrade t2 wheret1.sal between t2.losal and t2.hisal ;必須是大值在前小值在后
外連接(通過外連接顷牌,吧對于連接條件不成立的記錄剪芍,依然包括在最后的結(jié)果中)
問題:統(tǒng)計每個部門的員工數(shù)(要求你顯示部門號,部門名字窟蓝,人數(shù))
?select t2.deptno部門號,t2.dname 部門名字,count(t1.empno) 部門人數(shù) from briup_emp
t1,briup_dept t2 where t1.deptno=t2.deptno group by t2.deptno,t2.dname;
左外連接:當(dāng)條件不成立是罪裹,等號左邊的數(shù)據(jù)依然要被包含。
右外連接:當(dāng)條件不成立是运挫,等號右邊的數(shù)據(jù)依然要被包含状共。
?select t2.deptno部門號,t2.dname 部門名字,count(t1.empno) 部門人數(shù) from briup_emp
t1,briup_dept t2 where t1.deptno(+)=t2.deptno group by t2.deptno,t2.dname;
自連接(將一張表通過別名視為多張表)
問題:查詢員工的姓名及其領(lǐng)導(dǎo)的姓名。
? ? ? ? ? ?select worker.ename,boss.ename from briup_emp worker,briup_emp boss where worker.mgr=boss.empno;
? ? ? ? ? 顯示上級領(lǐng)導(dǎo)是Larry的員工姓名(先查詢所有員工及其領(lǐng)導(dǎo)的姓名谁帕,再查出領(lǐng)導(dǎo)是Larry的員工)峡继。
? ? ? ? ? select worker.ename,boss.ename from briup_emp worker,briup_emp boss where worker.mgr=boss.empno and boss.ename='Larry';
如果員工表中有一萬條數(shù)據(jù),自連接就會產(chǎn)生一億條數(shù)據(jù)匈挖,所以自連接不適合操作大表碾牌。
層次查詢:可以替代自連接,本質(zhì)上是一個單表查詢儡循。
select level,ename,mgr from briup_emp connect by prior empno=mgr start with mgr is null;
(level:偽列舶吗,代表層次深度)
子查詢(嵌套查詢):即一個select中嵌套了另外一個或者多個select
問題:查詢和Smith在同一個部門的所有員工的姓名和部門號。
? ? ? ? ? ?select ename,deptno from briup_emp where deptno=(select deptno from briup_emp where ename='Smith');
應(yīng)用場景:
1择膝、當(dāng)一條語句需要依賴另一臺查詢語句的結(jié)果的時候誓琼,
單行子查詢:只返回一行數(shù)據(jù)的子查詢。
多行子查詢:返回多行數(shù)據(jù)的子查詢肴捉。
問題:查詢和部門1的工作相同的員工的姓名腹侣、工作和工資。
? ? ? ? ? ?select ename,job,sal from briup_emp where job in(select distinct job from briup_emp where deptno=1);
? ? ? ? ? ?查詢比部門1的員工的工資低的員工的姓名和工資齿穗。
? ? ? ? ? ?select ename,sal from briup_emp where sal<all(select sal from briup_emp where deptno=1;
? ? ? ? ? ?查詢比部門1的任意員工的工資高的員工的姓名和工資筐带。
? ? ? ? ? ?select ename,sal from briup_emp where sal>any(select sal from briup_emp where deptno=1;
? ? ? ? ? ?查詢和Smith相同部門相同工作的員工的信息。
? ? ? ? ? ?select ename,job,deptno from briup_emp where deptno=(select deptno from briup_emp where ename='Smith') and job=(select job from briup_emp where ename='Smith');
? ? ? ? ? ?select ename,job,deptno from briup_emp where (job,deptno)=(select job,deptno from briup_emp where ename='Smith');
? ? ? ? ? ?查詢和Smith相同部門缤灵、工作、領(lǐng)導(dǎo)蓝晒、工資的員工的信息腮出。
? ? ? ? ? ?select ename,job,deptno from briup_emp where (job,deptno)=(select job,deptno from briup_emp where ename='Smith');