【网学网提醒】:网学会员为广大网友收集整理了,SQL学习脚本,希望对大家有所帮助!
selectjobfromemp;
--distinct剔除重复列
selectdistinctjobfromemp;
--在消除重复列时,如果要同时查询多列
--则必须保证所有都重复才能消除
selectdistinctempno,jobfromemp;
--orcale中的链接字符串操作用"||"表示。如果要加入一些显示信息的话,
--所有的其他固定信息要使用"'"括起来
select'编号是:'||empno||'的雇员','是:'||ename,'工作是:'||jobfromemp;
--在程序中支持+、-、*、/的语句
--代码中sal*12的意义不明确,所以最好给这个运算结果起个别名,但
--在起别名的时候一定要回避中文
selectename,sal*12incomefromemp;
--限定查询
select*fromempwheresal>1500;
--不为空的表示isnotnull,为空的表示是isnull
select*fromempwherecommisnotnull;
select*fromempwherecommisnull;
select*fromempwheresal>1500andcommisnotnull;
--在程序中,通过括号表示一组的条件
select*fromempwherenot(sal>1500andcommisnotnull);
select*fromempwheresal>1500orcommisnotnull;
select*fromempwheresal>1500andsal<3000;
select*fromempwheresalbetween1500and3000;
--日期表示的时候要加"'",betweenand支持日期
select*fromempwherehiredatebetweento_date('1981-1-1','yy-mm-dd')andto_date('1981-12-31','yy-mm-dd');
--oracle对大小写敏感
select*fromempwhereename='SMITH';
--指定了范围,可以使用in操作符
select*fromempwhereempnoin(7369,7499,7521);
--若不在此范围内,可以使用notin操作符
select*fromempwhereempnonotin(7369,7499,7521);
--in操作符还可以用在字符串的信息上
select*fromempwhereenamein('SMITH','ALLEN','WARD');
--如果在查询范围内加入额外信息,不影响程序执行
select*fromempwhereenamein('SMITH','ALLEN','WARD','asdfasdf');
--在like中使用两种通配符,"%":可以匹配任意长度的内容,"_":可以匹配一个长度的内容
select*fromempwhereenamelike'_M%';
--使用like时,如果没有指定关键字,则查询全部
select*fromempwhereenamelike'_%';
--like可以在任何地方使用
select*fromempwherehiredatelike'%81%';
select*fromempwheresallike'%5%';
--在oracle中,不等号有两种表现形式"<>"、"!="
select*fromempwhereempno!=7369;
--使用orderby对查询结果进行排序(升asc,降desc),默认为asc
select*fromemporderbysalasc;
select*fromemporderbysaldesc;
--排序放在整个SQL语句的最后执行
select*fromemporderbysaldesc,hiredateasc;
--单行函数
--1.字符函数
selectupper('smith')fromdual;
select*fromempwhereename=upper('smith');
selectlower('HELLOWORLD')fromdual;
selectinitcap('HELLOWORLD')fromdual;
selectinitcap(ename)fromemp;
--字符串除了使用"||"连接之外,还可以使用concat()函数进行连接操作
selectconcat('hello','world')fromdua
l;
--字符串截取,字符串长度,字符串替换
--在oracle函数中,substr()函数的截取点是从0还是从1开始的,
--从0和从1开始效果是一样的,oracle比较智能
selectsubstr('hello',1,3)字符串截取,
length('hello')字符串长度,
replace('hello','o','l')字符串替换
fromdual;
--显示所有雇员和后的三个字符
selectename,substr(ename,length(ename)-2)fromemp;
--substr()函数可以采用倒着截取的方式,只要输入的位置是负数,就可以倒着进行
selectename,substr(ename,-3,3)fromemp;
--2.数值函数
--四舍五入:round();截断小数位trunc();取模mod()
selectround(789.536)fromdual;
--保留两位小数
selectround(789.536,2)fromdual;
--直接对整数进行四舍五入
selectround(789.536,-2)fromdual;
--trunc不保留小数,也不进行四舍五入
selecttrunc(789.536)fromdual;
selecttrunc(789.536,2)fromdual;
selecttrunc(789.536,-2)fromdual;
--去模
selectmod(10,3)fromdual;
--3.日期函数
--日期-数字=日期;日期+数字=日期;日期-日期=数字(天数);
--显示雇员进入公司的星期数
selectsysdatefromdual;
selectempno,ename,round((sysdate-hiredate)/7)fromemp;
--months_between():求出给定日期范围的月数
-
--last_day():求出给定日期的最后一天日期
selectempno,ename,months_between(sysdate,hiredate)fromemp;
selectadd_months(sysdate,4)fromdual;
selectnext_day(sysdate,'星期一')fromdual;
selectlast_day(sysdate)fromdual;
--4.转换函数
--to_char:转换成字符串;
--to_number:转换成数字;
--to_date:转换成日期
--利用to_char()函数进行拆分,拆分的时候必须指定拆分的通配符:
--年:y,年是四位数字,所以用yyyy表示
--月:m,月是两位数字,所以使用mm表示
--日:d,日是两位数字,所以使用dd表示
selectempno,ename,to_char(hiredate,'yyyy')year,
to_char(hiredate,'mm')month,to_char(hiredate,'dd')day
fromemp;
--使用to_char()进行日期显示的转换功能
selectename,to_char(hiredate,'yyyy-mm-dd')fromemp;
--fm可以去掉前导0
selectename,to_char(hiredate,'fmyyyy-mm-dd')fromemp;
--可以使用to_char()进行数字格式化
selectename,to_char(sal,'99,999')fromemp;
--希望数字可以明确的表示区域,可以使用以下两种符号:
--$表示美元;LLocal的缩写,一本地语言进行金额显示
selectename,to_char(sal,'$99,999')fromemp;
selectename,to_char(sal,'L99,999')fromemp;
--to_number
selectto_number('123')+to_number('123')fromdual;
--to_date
selectto_date('2010-12-31','yyyy-mm-dd')fromdual;
--通用函数
selectempno,ename,(sal+comm)*12fromemp;
--nvl函数,可以将一个指定的null值变成指定的内容
--如果需要进行计算的时候,对于null必须使用nvl()函数进行一个转换的操作
selectempno,ename,nvl(co
mm,0),(sal+nvl(comm,0))*12fromemp;
--decode()函数
selectdecode(1,1,'内容是1',2,'内容是2',3,'内容时3')fromdual;
selectempno雇员编号,ename雇员,hiredate雇佣日期,
decode(job,'CLERK','业务员','SALESMAN','销售人员','MANAGER','经理'
,'ANALYST','分析员','PRESIDENT','总裁')职位fromemp;
--多表查询
select*fromemp,dept;
selectcount(*)fromemp;
selectcount(*)fromdept;
select*fromemp;
select*fromdept;
select*fromempe,deptdwheree.deptno=d.deptno;
selecte.empno,e.ename,d.deptno,d.dname,d.loc
fromempe,deptdwheree.deptno=d.deptno;
selecte.ename,e.job,m.ename,d.dname
fromempe,empm,deptdwheree.mgr=m.empnoande.deptno=d.deptno;
select*fromsalgrade;
selecte.ename,e.sal,d.dname,decode(s.grade,1,'第五等工资',2,'第四等工资',3,'第三等工资',4,'第二等工资',5,'第一等工资')
,m.ename,m.sal,decode(ms.grade,1,'第五等工资',2,'第四等工资',3,'第三等工资',4,'第二等工资',5,'第一等工资')
fromempe,deptd,salgrades,empm,salgradems
wheree.deptno=d.deptnoande.salbetweens.losalands.hisalande.mgr=m.empno
andm.salbetweenms.losalandms.hisal;
--左右连接
selecte.empno,e.ename,d.deptno,d.dname,d.loc
--左连接,默认左连接
fromempe,deptdwheree.deptno=d.deptno(+);
--右连接
selecte.empno,e.ename,d.deptno,d.dname,d.loc
fromempe,deptdwheree.deptno(+)=d.deptno;
--组函数和及分组统计
selectmin(sal)fromemp;
selectmax(sal)fromemp;
selectsum(sal)fromempwheredeptno=20;
selectavg(sal)fromemp;
--分组统计
selectdeptno,count(deptno)fromemp
groupbydeptno;
selectdeptno,avg(sal)fromemp
groupbydeptno;
1.selectdeptno,count(deptno)fromemp;
2.selectdeptno,count(deptno),empnofromemp
groupbydeptno;
--以上代码不能正确执行,是因为:
--1,如果程序中使用了分组函数,则有两种可以使用的情况:
--:程序中存在了groupby,并指定了分组字段,这样可以将分组字段一起查询出来
--:如果不使用分组的话,则只能单独的使用分组函数
--2.在使用分组函数的时候,不能出现分组函数和分组字段之外的字段。
selectd.dname,count(e.empno)
fromdeptd,empe
whered.deptno=e.deptno
groupbyd.dname;
--分组函数不允许在where语句之中出现,如果假设要指定分组的条件,
--则只能通过第二种条件的指令:having
selecte.deptno,avg(e.sal)
fromempe
groupbye.deptnohavingavg(sal)>2000;
selectmax(avg(sal))fromemp
groupbydeptno;
--分组的简单原则
--只要一列上存在重复的内容才有可能考虑到分组
--注意
--分组函数可以嵌套使用,但是在组函数嵌套使用的时候不能再出现分组字段的查询语句
--子查询
select*fromempwheresal>
(selectsalfromempwhereempno=7654);
--所有的子查
询必须在"()"中编写代码
--子查询操作分为以下三类:
--1.单列子查询,返回的结果是一列的一个内容
--2.单行子查询,返回多个列,有可能是一条完整的记录
--3.多行子查询,返回多条记录
select*fromempwheresal>
(selectsalfromempwhereempno=7654)andjob=(selectjobfromempwhereempno=7788);
select*fromempwheresal=(selectmin(sal)fromemp);
selectd.dname,ed.c,ed.a,e.ename
fromdeptd,
(selectdeptno,count(empno)c,avg(sal)a,min(sal)min
fromemp
groupbydeptno)ed,empe
where
d.deptno=ed.deptnoande.sal=ed.min;
--在子查询中,存在以下三种查询的操作符号
--inanyall
--in指定一个查询范围
select*fromempwheresalin(selectmin(sal)fromempgroupbydeptno);
--any操作:=any与in的操作符功能一样
select*fromempwheresal=any(selectmin(sal)fromempgroupbydeptno);
-->any,比里面的最小值要大
select*fromempwheresal>any(selectmin(sal)fromempgroupbydeptno);
--
select*fromempwheresal --all操作
-->all,比里面的最大值要大
select*fromempwheresal>all(selectmin(sal)fromempgroupbydeptno);
-- select*fromempwheresal
--多列子查询
select*fromempwhere(sal,nvl(comm,-1))in(selectsal,nvl(comm,-1)fromempwheredeptno=20);