select语句.docx
- 文档编号:3639551
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:22
- 大小:180.77KB
select语句.docx
《select语句.docx》由会员分享,可在线阅读,更多相关《select语句.docx(22页珍藏版)》请在冰豆网上搜索。
select语句
一:
马士兵视频oracle01------24(select语句)
所有sql语句的命令关键词不区分大小写
第一天课程
Oracle命令:
sqlplus,当启动sqlplus需要让你输入,用户名和口令。
输入用户名:
scott口令:
tiger,进入oracle命令行
3个界面:
图形版界面,命令行界面,
网页界面(isqlplus):
在浏览器地址栏输入:
http:
//ip:
5560/isqlplus/
输入用户名:
scott口令:
tiger
有一个著名的oracle客户端叫toad
Oracle还有一个客户端sqlpldevelement
使用超级管理员登录到数据库上:
sqlplussys/密码assysdba当成DBA登录到服务器上连上之后更改user,命令如下
alteruserscottaccountunlock;更改用户解除锁定
Sql语言是在数据库地下进行操作的专门的语言,sql语言本身是一种标准语言,它是一个国际标准,它定义了套标准SQL1922,SQL1999,SQL在大多数数据库上通用,或许有轻微的改变
注意:
Sql语句中的关键字,命令不区分大小写,最好小写
包含四大语句:
1.查询语句
查询语句只有一种就是select语句
2.DML语句
DML语句包含Insert,Update,Delete等常用语句
3.DDL语句
DDL语句包含Create,Alter,Drop等常用语句
4.事务控制语句
包含Commit,Rollback等常用语句
还有一大类语句:
叫DCL语句(DataControlLanguage),主要用于权限的分配与回收,由于与开发关系不是十分密切,不做重点讲解
最重要的就是select语句,任何select语句全部要背过,面试时要是考sql语句,select语句必考,不会考其它的
Select语句就是从表里把数据选出来
首先熟悉试验中的数据
第1条语句:
descemp;emp是一张表,该命令描述下一张表的字段
第2条Varchar2可变字符串支持国际化
NUMBER(7,2)7位的数字,2位的小数
每行显示的宽度setlinesize200;
显示的页数setpagesize30;
emp雇员信息表
EMPNO雇员编号NOTNULLNUMBER(4)
ENAME雇员姓名VARCHAR2(10)
JOB工作岗位VARCHAR2(9)
MGR该雇员经理人的编号NUMBER(4)
HIREDATE入职时间DATE
SAL薪水NUMBER(7,2)
COMM津贴NUMBER(7,2)
DEPTNO雇员所在部门编号NUMBER
(2)
表内容一部分:
dept部门信息表
DEPTNO部门编号NOTNULLNUMBER
(2)
DNAME部门名字VARCHAR2(14)
LOC部门所在地VARCHAR2(13)
内容:
salgrade薪水等级表
GRADE薪水等级NUMBER
LOSAL该等级的最低薪水值NUMBER
HISAL该等级的最高薪水值NUMBER
表中内容:
熟悉表里面的数据:
三张表empdeptsalgrade
第一个select语句:
select*from表名;
select*fromemp;
1.简单select语句:
例子1:
取出一张表中所有的数据
Select*fromemp;
例子2:
取出某些字段的值
Selectempno,ename,deptnofromemp;
2.包含算术表达式的sql语句
例子1:
取出emp中所有人的年薪及名字
Selectename,sal*12fromemp;
例子2:
在emp表中取出2*3的结果
Select2*3fromemp;(会显示多行数据)
例子3:
取出2*3的一条记录
Select2*3fromdual;当我们需要显示一行结果的时候就用系统提供的dual虚表
例子4:
取出当前系统时间
Selectsysdatefromdual;sysdate在Oracle中表示当前系统时间
3.含有别名的sql语句
例子1:
selectename,sal*12annual_salfromemp;(给年薪起了名字annual_sal,即使我们写Annual_Sal的话,系统也会转化为小annual_sal写名字中不能有空格,想有空格或者名字有大写字母或者中文必须加双引号,见下个例子)
例子2:
如果想让别名强制大小写或者有空格有中文混合可以使用双引号
Selectename,sal*12“Annual_sal”fromemp;
例子3:
如果想让别名中有空格或者有中文也使用双引号
Selectename,sal*12“年薪”fromemp;
注意:
0和空值是不一样的,0代表值是0,而空值是指没有值
任何含有空值的数学表达式的结果还是空值
4.处理含有空值的字符串
例子1:
算某人一年的年薪(含有任何null值的数学表达式最后的结果都为null)
Selectename,sal*12+commfromemp
注意:
字符串连接符为||eg:
selectename||salfromemp
该语句把sal的值转换为字符串和ename的值连接显示
Sql语句中,字符串用单引号连接eg:
selectename||‘aadada’fromemp该语句在ename的值后面连接上字符串aadada显示出来
例子2:
含有任何null值的字符串表达式中,null被当作空字符串处理
Selectempno,ename||'andhismanagernumberis'||mgrfromemp;
5.在select中使用单引号
例子1:
用两个单引号表示一个单引号
Selectempno,ename||'''smanageris'||mgrfromemp;
6.消除重复值
例子1:
selectdistinctdeptnofromemp;用distinct消除结果集中的重复信息
例子2:
用distinct修饰多个字段的时候,指的是消除后面所有字段的组合重复结果
Selectdistinctjob,deptnofromemp;指job和deptno都相同的删除
7:
Where语句
(1).等值判断
例子1:
显示部门编号为10的所有员工的详细信息
select*fromempwheredeptno=10;
例子2:
显示名字为KING的员工的详细信息
判断字符串是否相等时,字符串要用单引号引起来,单引号中字符串内容是要区分大小写的
select*fromempwhereename=‘KING’;
(2).非等值判断(><<>>=<=)
例子1:
取出薪水大于2000的所有员工的名字和薪水
Selectename,salfromempwheresal>2000;
取出薪水不等于2000的所有员工的名字和薪水
Selectename,salfromempwheresal<>2000;
例子2:
字符串大小比较:
是比较字符串ASCII码值的比较,先比较第一字母,依次……
Selectename,salfromempwhereename>‘DBA’;
例子3:
取出所有部门号不是10的雇员的名字和薪水
Selectename,salfromempwheredeptno<>10;
例子4:
取出薪水位于800和1500之间的雇员名字和薪水
Selectename,salfromempwheresal>=800andsal=<1500;
Selectename,salfromempwheresalbetween800and1500;
以上两句等价
注意:
使用betweenand的时候,包含了最大值和最小值
(3).空值的处理
例子1:
取出津贴值为空的所有雇员的名字
Selectenamefromempwherecommisnull;
取出津贴值不为空的所有雇员的名字
Selectenamefromeempwherecommisnotnull;
例子2:
取出津贴不为空的所有雇员的名字
Selectenamefromempwherecommisnotnull;
8:
In语句:
用于筛选某一个值
例子1:
把薪水是800,1250,1500,2000的雇员信息取出来
Selectename,salfromempwheresalin(800,1250,1500,2000);
也可以用于字符串操作
例子2:
把名字为SMITH,ALLEN,KING的雇员取出来
Selectename,salfromempwhereenamein(‘SMITH’,‘ALLEN’,‘KING’);
9.日期处理
Oracle默认的日期格式为:
DD-MON-RR
例子1:
查询在81年2月20号以后入职的员工
Selectename,hiredatefromempwherehiredate>’20-2月-81’;
或者:
Selectename,hiredatefromempwherehiredate>’20-2月-1981’;
如果想用自己定义的日期格式,可以使用to_charor或者to_date函数(后面会讲)
10.AND,OR,NOT
例子1:
查询部门标号为10并且薪水>1000的员工
Selectename,deptno,salfromempwheredeptno=10andsal>1000;
例子2:
查询部门编号为10或者工作岗位为CLERK的员工
Selectename,deptno,jobfromempwheredeptno=10orjob=‘CLEARK’;
例子3:
查询薪水没有位于800,1500,2000之中的员工
Selectename,salfromempwheresalnotin(800,1500,2000);
11.模糊查询
使用like关键字,和通配符%(表示0个或多个字符),_表示1个字符
例子1:
查询名字中含有ALL的人员
Selectenamefromempwhereenamelike‘%ALL%’;
例子2:
查询第二字母中含有A的雇员
Selectenamefromempwhereenamelike‘_A%’;
例子3:
查询名字中含有%等通配符的数据时,使用转义字符\
escape关键字自定义转移字符,系统默认的转义字符是‘\’
Selectenamefromempwhereenamelike‘%$%%’escape‘$’;
11.数据排序
例子1:
按照部门编号的降序排序及按照员工名字的升序排序
Select*fromdeptorderbydeptnodesc;用desc关键字代表降序
Selectename,salfromemporderbyenameasc;用asc关键字指出按升序排列
例子2:
按照雇员编号的升序排序
Selectename,deptnofromemporderbydeptno;升序可以不写asc关键字,默认就是升序
Selectename,deptnofromemporderbydeptnoasc;
例子3:
按照名字降序排列
Selectename,deptnofromemporderbyenamedesc;
例子4:
按照部门编号降序排列
Selectename,deptnofromemporderbydeptnodesc;
例子5:
和where语句一起用,先过滤,再排序sdsds
Selectename,deptnofromempwheredeptno<>10orderbydeptnodesc;
例子5:
可以对多个按多个字段排序
Selectename,sal,deptnofromorderbydeptnoars,enamedesc;先按照deptno的升序排序,如果deptno的值相同的话就按ename的降序排序
12.常用SQL函数
(1).Lower()函数将字符串全部转换成小写
Eg:
selectlower(ename)fromeemp;把雇员名字的值转换为小写显示出来(显示出来的是小写的雇员名字,但是实际上表中的雇员的名字还是大写,没有被改变)
Selectenameformempwherelower(ename)like‘_a%’;把满足这个条件的雇员名字显示出来(注意,显示出来的是大写名字),这个条件是:
当雇员的名字转换为小写的时候,它的第二个字母是a)也可以这样写selectenamefromempwhereenamelike‘_a%’orenamelike‘_A’
(2).Upper()函数将字符串全部转换为大写
将雇员中名字含有’A’或’a’的人员全部显示出来
Selectenamefromempwhereupper(ename)like‘%A%’;
(3).substr()函数
例子1:
从第2个字符开始共截3个子串
Selectsubstr(ename2,3)fromemp;
Selectsubstr(‘Hello’,2,3)fromdual;
Substr可以省略第三个参数
例子2:
从第二个字符开始,截取到整个字符串结束
Selectsbustr(ename,2)fromemp;
(4).Chr()函数:
把一个数字转换为相对的字母
例子1:
求一个与某个ASCII码值对应的字符
Selectchr(65)fromdual;
(5).Ascii()函数
例子:
求一个字符的ASCII码值
Selectascii(‘A’)fromdual;
(6).round()函数:
对参数值进行四舍五入的操作
例子1:
对23.652进行四舍五入操作
Selectround(23.652)fromdual;显示:
24
可以指定四舍五入到小数点后几位:
例如第二个参数
Selectround(23.652,2)fromdual;显示:
23.65
可以用负数指定小数点前面几位
例子3:
对23.652四舍五入到小数点前1位
Selectround(23.652,-1)fromdual;显示20
(7).to_char()
用于将数字或日期转换成特定的字符串,
To_char()有两个参数:
第一个参数:
需要进行转换的日期或数字
第二个参数:
特定的转换格式,对于数字有一下几个格式可以指定:
9代表数字,如果该位没有数字则不进行显示,但对于小数点后面的部分仍会强制显示为0
0代表一位数字,如果该位没有数字则强制显示0
$显示美元符号
L显示本地货币符号
.显示小数点
显示千分位符号
Eg:
selectto_char(sal,‘$99,999.9999’)salaryfromempwhereename=‘ALLEN’;显示:
$1,600.0000
Selectto_char(sal,‘$00,000.0000’)salaryfromempwhereename=
‘ALLEN’;显示$01,600.0000
对于日期:
to_char()可以指定为下面的常用格式:
Eg:
Selectto_char(hiredate,‘YYYY-MM-DDHH:
MI:
ss’)fromemp;
Selectto_char(sysdate,‘YYYY-MM-DDHH24:
MI:
SS)fromdual;
格式控制符含义
YYYY、YY--代表4位,2位数字的年份
MM--用数字表示的月份
MON--月份的缩写对中文月份来说就是全称
DD--数字表示的日
DY---星期的缩写,对中文的星期来说就是全称
HH24、HH12--------12小时或者24小时进制下的时间
MI------分钟数
SS-------秒数
有了这些格式,就可以把日期自定义为任何格式
(8).to_date()函数
将特定的字符串转换成日期格式,这个函数有两个参数
第一参数:
自定义的日期字符串
第二参数:
指定这个字符串的格式
例子1:
将1981年3月2日中午以后入职的雇员信息取出:
Select*fromempwherehiredate>to_date(‘1981-03-0212:
00:
00’,‘YYYY-MM-DDHH12:
MI:
SS’);
(9).to_number()函数
讲指定的字符串转换成数字格式,这个函数有两个参数
第一参数:
自定义的数字字符串
第二参数:
指定这个字符串的格式
例子1:
求薪水大于1200的员工信息
Select*fromempwheresal>to_number(‘$1,200.00’,‘$9,999.99’);
(10)nvl()函数
用来处理空值,这个函数有两个参数:
第一参数:
字段名或表达式,如果这个参数值为null,就返回第二参数值,否则返回第一
参数值
例子:
求每个员工每年的年收入(12个月的薪水+津贴)
因为有的comm的值为null,想要得到正确的结果,必须讲null值转换为0
Selectename,sal*12+nvl(comm,0)fromemp;如果comm里面的值是null的话,把它转化为0;
(11)一组输入单行输出函数包括5个函数:
avg():
求平均值
max():
求最大值
min():
求最小值
sum():
求总和
count():
求记录的数量
例子1:
求薪水的总和、平均值、最大值和最小值
Selectsum(sal),avg(sal),max(sal),min(sal)fromemp;
Selectto_char(avs(sal),’9999999.99’)fromemp;把数字转换为字符串,并带小数点后两位
Selectround(avg(sal),2)fromemp;精确到小数点后两位,四舍五入
例子2:
求emp表中记录的数量
Selectcount(*)fromemp;求出该表中记录的数量
Selectcount(*)fromempwheredeptno=10;求出编号为10的部门中有多少记录,即多少人
Count()可以对单独字段使用,得到的是所有非空记录的数量
Selectcount(ename)fromemp;显示14,即emp表中有14个名字
例子:
求comm字段中所有非空记录的数量
Selectcount(comm)fromemp;显示:
4,因为有几个雇员的comm值为null,所以count()不计入在内
Count()可以和distinct一起使用,得到所有唯一值记录的数量
Selectcount(distinctdeptno)fromemp;显示部门编号,不显示重复的
例子4:
求emp表中deptno唯一的数量
Selectcount(distinctdeptno)fromemp;
注意:
函数名不是在所有数据库中通用(oracle和mysql中sql函数有些轻微的差别)
13.对表中的数据进行分组(输出多行)
注意:
出现在select列表里的字段,如果没有出现在组函数中,必须出现在groupby中
我的例子:
求出薪水最高的人名字
Selectenamefromeempwheresal=(selectmax(sal)fromemp);
求出每个部门中薪水最高的人名字?
答案见下面
例子1:
计算每个部门的平均工资
首先将现有数据按照部门进行分组,然后再计算每个组员工的平均薪水。
Selectdeptno,avg(sal)fromempgroupbydeptno;
按照两个字段的组合分组(只要组合不同,就是一组)
Selectdeptno,job,max(sal)fromempgroupbydeptno,job;
例子2:
计算每个部门的最大工资
Selectdeptno,max(sal)fromempgroupbydeptno;
例子3:
按照部门,和职位进行分组的最大薪水
Selectdeptno,job,max(sal)fromempgroupbydeptno,job;
使用groupby的规律:
出现在select列表中的字段,如果没有出现在组函数中,则必须出现在groupby子句中
典型错误:
selectename,deptno,max(sal)fromempgroupbydeptno;
例子4:
求出每一个部门里赚钱最多的那个人的名字
先求出每个部门中赚钱最多的人的部门编号,和工资
Selectdeptnomax(sal)max_salfromempgroupbydeptno;
把上面的语句查询的结果当做一张表,这张表包括的字段有deptnomax_sal,然后对它查询得到最高工资:
selectmax_salfrom(Selectdeptnomax(sal)max_salfromempgroupbydeptno)
然后对emp查询,找到工资是最大工资的人
Selectename,deptno,salfromempwheresalin(Selectmax_salfrom(Selectdeptno,max(sal)max_salfromempgroupbydeptno))
注意:
上句会出现问题,下面会解决
例子4:
选出表中工资最高的人的名字
Selectename,salfromempwheresal=(Selectmax(sal)fromemp);
如果我们要从分组数据中把某些特定的剔除去的时候,使用Having关键字
例子1:
将平均薪水大于1000的组的平均薪水从emp这张表中选出来
Selectavg(sal),deptnofromempgroupbydeptnohavingavg(sal)>1000;
Select单条查询语句总结:
Select字段from表名where什么什么groupby什么什么having什么什么orderbyasc/desc;
例子2:
求薪水大于1200的雇员,按照部门进行分组,而且这些分分组后组内平均薪水必须大于1500然后降序排列,要查询分组的平均工资
Selectavg(sal)fromempwheresal>1200groupbydeptnohavingavg(sal)>1500orderbyavg(sal)desc;
视频
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- select 语句
![提示](https://static.bdocx.com/images/bang_tan.gif)