SQL学习笔记
0、select * from tab; //查询当前用户下有多少张表
1、Select LastName,FirstName from persons; //查找Persons表中LastName、FirstName两列的信息。
2、select * from emp where comm is NOT NULL; //查询emp表中获得奖金的雇员。
3、select * from emp where comm is NULL; //查询emp表中没有奖金的雇员。
4、select * from emp where comm >150; //查询emp表中奖金大于150的雇员。
5、select * from emp where sal>1500 and comm is not null; //工资大于1500且获得奖金的雇员。
6、select * from emp where not (sal>1500 and comm is not null);//查询整体工资大于1500同时不能获得奖金的雇员。注释:在词句中not()表示对括号的的条件取反。
7、条件筛选关键词between、and用法,between 最小值 and 最大值;select * from emp where sal between 1500 and 3000; //查询工资大于1500小于3000的雇员。
8、select * from emp where hiredate between '1-1月 -81' and '31-12月 -81'; //查询在1981.1.1到1981.12.31雇佣的雇员
9、select * from emp where ename='SMITH'; //查询姓名为SMITH的雇员信息。注意:在查询的时候,姓名必须与数据库中保持一致。
10、select * from emp where empno in(7369,7499,7521); //此句考察in的用法,查询编号为7369,7499,7521雇员的信息
11、select * from emp where job IN('CLERK','SALESMAN'); //查询职位是CLERK和SALESMAN雇员的信息。此句考察in关键字
12、select * from emp where ename like 'M%'; //查询以姓名以M开头的雇员,此句考察like模糊匹配关键字
13、select * from emp order by sal ASC; //查询雇员工资由少到多排序,此句考察order by 的用法.ASC表示升序排列,升序为默认排列方式,asc可以不写
14、select * from emp order by sal desc; ///查询雇员工资由多到少排序,DESC表示降序排列
15、select * from emp where ename=UPPER('smith'); //此句考察upper()函数,此函数的功能是将字符串转为大写。
16、select * from emp where job='CLERK' order by sal; //查询工作为CLERK(文员)雇员并且按薪水升序排列
17、select substr('hello',2)from dual; //此句考察substr()函数,结果输出为:ello
18、select substr('hello',1,4)from dual; //截取1至4中间的字符串部分,输出结果为:hell
19、select sysdate from dual; //sysdate显示当前日期
20、select ENAME,EMPNO,ROUND((SYSDATE-HIREDATE)/7) FROM EMP; //求出雇员入职到现在工作了多少个星期
21、select ename,empno,To_CHAR(hiredate,'yyyy') y,
To_CHAR(hiredate,'mm') m,
To_CHAR(hiredate,'dd') d
from emp; //此句考察TO_CHAR()函数,让日期以年、月、日分开的形式显示。输出结果如下
22、select to_date('20171119','yyyy-mm-dd') from dual; //此句考察to_date()函数,to_date()函数可以把字符串数字转换成日期的格式。
23、select * from emp where deptno=30; //查出部门编号为30的所有雇员
24、select ename,empno,deptno from emp where job=upper(‘clerk’); //列出工作为CLERK的雇员的姓名、工号、部门编号。
25、select * from emp where comm>sal; //找出佣金大于薪金的雇员
26、select * from emp where comm>sal*0.6; //找出佣金大于薪金60%的雇员
27、select * from emp
where (deptno=10 and job=upper('manager'))
or (deptno=20 and job=upper('clerk')); //查出部门10中所有经理和部门20中所有文员。
28、select * from emp
where (deptno=10 and job=upper('manager'))
or (deptno=20 and job=upper('clerk'))
or (job not in('MANAGER','CLERK') and sal>=2000); //出部门10中所有经理和部门20中所有文员,既不是经理又不是文员且工资大于2000的雇员。
29、select distinct job from emp where comm is not null; //找出收取佣金的不同工作。
30、select *from emp where (comm is null or comm<100); //找出不收取佣金或者收取佣金小于100的雇员。
31、select *from emp where last_day(hiredate)-2=hiredate; //找出每月倒数第3天入职的雇员。
32、select *from emp where (months_between(sysdate,hiredate)/12)>12; //找出入职年限大于12年的所有雇员
33、select initcap(ename) from emp; //以首字母显示所有雇员的姓名
34、select ename from emp where length(ename)=5 ; //显示姓名长度为5的雇员姓名
35、select ename from emp where ename not like '%R%' ; //查找雇员姓名不带R字母的姓名。
36、select substr(ename,0,3) from emp ; //截取所有雇员姓名的前三个字母。
37、select replace(ename,'A','a') from emp ; //显示所有雇员姓名其姓名含有A的用a替换。
38、select ename,hiredate from emp where (months_between(sysdate,hiredate)/12)>10;//显示工作年限大于10的员工的姓名和入职日期。
39、select * from emp order by hiredate; //按员工入职年限由降序排列。
40、select ename,job,sal from emp order by job DESC,sal; //显示雇员的姓名、工作、薪水排序,若薪水相同则按工作排序。
41、select ename,to_char(hiredate,'yyyy') year,to_char(hiredate,'mm') monthsfrom emporder by year,months ; //显示所有雇员的姓名,按年、月排序,若年相同,则按月升序排列。
42、select ename, round(sal/30)from emp; //显示月份为30天的员工日新。
43、select * from emp where to_char(hiredate,'mm')=2; //查出2月入职的所有雇员
44、select ename,round(sysdate-hiredate) from emp; //显示所有雇员入职的天数。
45、select * from emp where ename like '%A%'; //显示姓名中含有字母A的雇员
46、select ename,trunc(months_between(sysdate,hiredate)/12)year from emp; //显示雇员工作了多少年
47、查询语句总结
SELECT {DISTINCT} *| 查询列1 别名1,查询列2 别名2,.....
from 表名称 别名
{where条件(s)}
{order by 排序字段 asc|desc,排序字段 asc|desc,....}
48、单行函数:
to_char()函数、日期函数、nvl()、decode()
49、多表查询:两张以上的表查联合查询称为多表查询。
50、SELECT COUNT(*)FROM EMP; //此句考察count()函数,查询emp表有多少条数据
51、在使用多表查询的时候会出现笛卡尔积,两张表的数据会交互出现,比如emp表和dept两张表,emp有14行数据,dept有4行数据,两张一起查询会出现14*4=56行数据。
52、如何去掉笛卡尔积,找出两张表中有相关联的列或相同的列。
多表关联查询:
53、SELECT e.ename,e.empno,d.deptno,d.dname,d.loc FROM emp e,dept d where e.deptno=d.deptno; //查找雇员的姓名、编号(二者位于emp表中),所在部门编号、部门名称、部门位置(三者位于dept表中)。语句中的e代表emp别名,d代表dept别名。
54、SELECT e.ename,e.job,m.ename
from emp e ,emp m
where e.mgr=m.empno; //此句是查出每个雇员的姓名、工作以及雇员的上级领导,此句中用到了本表(EMP)关联(EMP)本表查询,分别用e和m代表emp表。此句中的难点是e.mgr=m.empno;
55、select e.ename,e.sal,d.dname,s.grade,m.ename,m.sal,ms.grade
from
emp e,dept d,salgrade s,emp m,salgrade ms
where
e.deptno=d.deptno and e.sal between s.losal and s.hisal
and
e.mgr=m.empno and m.sal between ms.losal and ms.hisal; //查询每个雇员的姓名、工资、部门名称,工资在公司的等级(salgrade),及其领导的姓名及工资所在公司的排名。
55、select e.ename,e.sal,d.dname,
decode(s.grade,1,'5d',2,'4d',3,'3d',4,'2d',5,'1d'),s.grade,m.ename,
decode(ms.grade,1,'5d',2,'4d',3,'3d',4,'2d',5,'1d'),m.sal,ms.grade
from
emp e,dept d,salgrade s,emp m,salgrade ms
where
e.deptno=d.deptno and e.sal between s.losal and s.hisal
and
e.mgr=m.empno and m.sal between ms.losal and ms.hisal; //在54语句的基础上增加了工资等级,用到了decode()函数。
56、多表查询的左连接、右连接。在表emp与表dept做联合查询的时候,emp表中并没有40部门的雇员,因此40部门在查询中并未显示出来,但40部门在dept中是有的,如何让dept表中的40部门显示出来呢?(就是多张表做联合查询时,有一个数据在做联合查询的表中不全都有,而又需要让这个数据显示出来的意思)。这就要用到左、右连接。所谓左、右连接,就是在去除笛卡尔积的等式某一边加上加号(+),
57、select e.empno,e.job,d.loc,d.dname,d.deptno
from emp e,dept d
where e.deptno(+)=d.deptno; //此就用到了右连接,
58、怎么区分是左连接还是右连接呢?e.deptno(+)=d.deptno,此为右连接,(+)在等号左边,以右边的表为准),e.deptno=d.deptno(+),此为左连接,与右连接相反。
59、左、右连接在开发中的应用。
60、select * from emp cross join dept; //此句考察交叉连接语法,cross join 是1999的sal版本语法,用于交叉连接查询产生笛卡尔积。
61、select * from emp natural join dept; //本句考察SQL1999版本中的natural join 语法,自然连接。
组函数及分组统计:
62、当我们要得出每一组的平均年龄、身高、平均薪水时就要用到分组函数。在sql中经常用到的分组函数有:max()、min()、avg()、sum()、count()。
63、select min(sal) from emp; //找出最低工资
64、select max(sal) from emp; //找出最高工资
65、select sum(sal) from emp where deptno=20; //求出20部门员工的工资总和
66、select avg(sal) from emp; //求出emp表中的雇员平均工资。
67、select deptno,count(empno) from emp group by deptno; //求出每个部门的雇员人数。
68、select deptno,avg(sal) from emp group by deptno; //求出每个部门的平均工资
69、分组函数使用记得和分组关键字group by 联合使用,分组函数,使用时就要记得分组。
70、where 后面不能跟分组函数。
71、select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
//求出平均薪水大于2000的部门编号和平均薪水。
72、select job,sum(sal)su from emp
where job<>'SALESMAN'group by job
having sum(sal)>5000 order by su desc; //求出非销售员的月工资总和,并且要求按降序显示出总工资大于5000的工作和总工资。
子查询:
73、子查定义;在一个查询的内部还包括另外一个查询,则此查询为子查询
74、所有的子查询必须在()里面编写子查询代码,子查询在操作中分为三类:第一类是单列子查询,返回的结果是一列的一个内容,在开发中出现的几率最高;第二类是单行子查询,返回多个列,有可能是一条完整的记录;第三类是多行子查询,返回多条记录。
75、select * from emp where sal>(select sal from emp where empno=7654)and job=(select job from emp where empno=7788); //查出工资大于编号为7654的员工且从事的工作与编号为7788的相同。
76、select * from emp where sal=(select min(sal) from emp); //查出最低工资雇员的信息。