Oracle之基本的SQL语句4.1SQL简介在实际中,各个数据库的SQL的区别就是提供的函数不同,SQL(结构化查询语言)是关系数据库管理的标准语言。分为以下几类:DML(DataManipulationLanguage,数据操作语言)--用于检索或则修改数据(SELECT,update,save)DDL(DataDefinitionLanguage,数据定义语言)--用于定义数据的结构,create,drop,deleteDCL(DataControlLanguage,数据控制语言)--用于定义数据库用户的权限4.2简单查询语句SELECT*|具体的列别名FROM表名称;如果只要查询部分信息(雇员编号,姓名,工作),就需要制定查询列,可以制定返回列的名称,即为一个列起别名SELECTempno编号,ename姓名,job工作FROMemp;现在要查询出所有的工作,SELECTjobFROMemp;(结果有重复)SELECT(distinct)*|具体的列别名(查询多列,必须保证所有列都重复才能删除掉重复)FROM表名称exa:SELECTdistinctempno,jobFROMemp;(由于编号不重复无法执行去重操作)一个新的要求:要求雇员编号姓名工作但是显示的格式:exa:编号是7369的雇员,姓名是:SMITH工作是:CLERK要想使用此种功能,则可以使用Oracle中提供的字符串连接操作,使用||表示,如果要加入一些显示信息,所有的其他的固定信息要使用单引号括起来。exa:SQLSELECT'编号是:'||empno||'的雇员,姓名是:'||ename||'的工作是:'||jobFROMemp'编号是:'||EMPNO||'的雇员,姓名是:'||ENAME||'的工作是:'||JOB--------------------------------------------------------------------------------编号是:7369的雇员,姓名是:SMITH的工作是:CLERK编号是:7499的雇员,姓名是:ALLEN的工作是:SALESMAN编号是:7521的雇员,姓名是:WARD的工作是:SALESMAN编号是:7566的雇员,姓名是:JONES的工作是:MANAGER编号是:7654的雇员,姓名是:MARTIN的工作是:SALESMAN编号是:7698的雇员,姓名是:BLAKE的工作是:MANAGER编号是:7782的雇员,姓名是:CLARK的工作是:MANAGERGeneratedbyFoxitPDFCreator©FoxitSoftware:7788的雇员,姓名是:SCOTT的工作是:ANALYST编号是:7839的雇员,姓名是:KING的工作是:PRESIDENT编号是:7844的雇员,姓名是:TURNER的工作是:SALESMAN编号是:7876的雇员,姓名是:ADAMS的工作是:CLERK编号是:7900的雇员,姓名是:JAMES的工作是:CLERK编号是:7902的雇员,姓名是:FORD的工作是:ANALYST编号是:7934的雇员,姓名是:MILLER的工作是:CLERK已选择14行。4.3在查询中也可以使用四则运算功能(+-*/(优先顺序)),例如要求列出每个雇员的姓名和年薪SQLSELECTename,sal*12incomeFROMemp;(别名避免汉字)限定查询(WHERE子句)之前的查询时将一张表的所有记录全部查询出来,那么现在如果希望可以根据制定的条件查询,则必须指定限定查询。语法如下:SELECT(DISTINCT)*|具体的列别名FROM表名称WHERE条件SELECT*FROMempwheresal1500;查询每月可以得到奖金的雇员的信息;奖金是comm字段只要字段中存在内容,则表示内容不为空(null),如果存在内容显示具体的值SELECT*FROMempWHEREcommISNOTNULL;(isnull为空)多条件查询:范例:要求查询出基本工资大于1500同时可以领取奖金的雇员信息(同时指定2个条件2个条件同时满足才可以查询)SQLSELECT*FROMempWHEREcommisnotnullandsal1500;范例:要求查询出基本工资大于1500或则可以领取奖金的雇员信息SQLSELECT*FROMempWHEREcommisnotnullorsal1500;之前使用NOT可以取反,把真的条件变成假的,假的变成真的!范例:要求查询出基本工资不大于1500并且不可以领取奖金的雇员信息SELECT*FROMempWHEREnot(commisnotnullandsal1500);GeneratedbyFoxitPDFCreator©FoxitSoftware:查询基本工资大于1500,小于3000的全部雇员信息SELECT*FROMempWHEREsal1500andsal3000;SQLSELECT*FROMempWHEREsalbetween1500and3000;(包含1500和3000)范例:查询1981年雇佣的全部员工信息(1981-1-1到1981-12-31)SELECT*FROMempwnerehiredatebetween‘1-1月-81’and‘31-12月-81’;结论:betweenand查询除了可以支持数字之外还可以支持日期执行范例:要求查询姓名是smith的雇员的信息SELECT*FROMempWHEREename='smith';执行上述语句无返回结果,再次查询数据库表中的信息发现smith是采用大写的,所以ORACLE是对大小写敏感的,所以必须要使用大写的形式进行查询范例:要求查询出雇员编号是7369、7499、7521的雇员的具体信息;SELECT*FROMempWHEREempno=7369orempno=7499orempno=7521;实际上,此时是指定了查询了范围,那么既然有范围了,在SQL语法中就可以使用IN操作符完成语法格式:字段IN(值、值、值);SELECT*FROMempWHEREempnoin(7369,7499,7521);如果查询的内容不再此范围中使用NOTIN(值、值、值);范例:要求查询出雇员编号是不是7369、7499、7521的雇员的具体信息SELECT*FROMempWHEREempnonotin(7369,7499,7521);范围:要求查询出姓名是SMITH,ALLEN,KING的雇员的信息;SELECT*FROMempWHEREenamein('SMITH','ALLEN','KING');(大小写要匹配)提示:如果在指定的查询范围中指定了额外的内容(表中没有的),不影响查询;SELECT*FROMempWHEREenamein('SMITH','ALLEN','KING',SOMEBADY);通配符:在一般的日常见到的站点中经常发现有模糊查询的功能,即输入一个指定的关键字,把符合内容的全部查询出来,在SQL中使用LIKE语句查询。‘%’可以匹配任意长度的内容'_'可以匹配一个长度的内容范例:查询出所有雇员姓名中第二个字母包含“M”的雇员信息;SELECT*FROMempWHEREenamelike'_M%';范例:查询出所有雇员姓名中包含“M”的雇员信息SELECT*FROMempWHEREenamelike'%M%';提示:如果在使用LIKE的时候没有使用查询的关键字,则表示查询全部;SELECT*FROMempWHEREenamelike'%%';GeneratedbyFoxitPDFCreator©FoxitSoftware:查询工资中带6的雇员信息:SELECT*FROMempWHEREsallike'%6%';总结:在操作条件中还可以使用、=、=、、=等计算符(对日期和数字也有效)SELECT*FROMempWHEREhiredatelike'%81%';不等于符号:在SQL中如果使用不等于符号'''!='SELECT*FROMempWHEREempno7369;4.4对查询的结果进行排序(ORDERBY字句)(重点)在SQL中可以使用ORDERBY字句对查询的结果进行排序,例如现在使用查询的全部的语句:SELECT*FROMemp;此时,从查询的结果可以发现,是按照雇员的编号进行排序的,那么此时如果要对使用指定的列进行排序,则必须使用ORDERBY语句格式如下:SELECT(DISTINCT)*|指定列别名FROMempWHERE条件语句(ORDERBY)排序字段1,排序字段2ASC(DESC降序)默认是升序排列范例:要求查询出10部门的所有雇员信息,查询的信息按照工资由高到低排序,如果工资相等,则按照雇佣日期由早到晚进行排序此时存在2个排序条件:第一个是降序,第二个是升序SELECT*FROMempWHEREdeptno=10orderbysaldesc,hiredateasc;排序操作肯定是放在整个SQL语句的最后执行的GeneratedbyFoxitPDFCreator©FoxitSoftware,每个数据库之间唯一不同的最大区别在于函数的支持上,使用函数可以完成一系列的操作功能;单行函数语法:function_name(column|expression[arg1,arg2])分类:1.字符函数:接受字符输入并且返回字符或则数值2.数值函数:接受数值并返回数值3.日期函数:对日期函数进行操作4.转换函数:从另一种数据类型转换到另一种数据类型5.通用函数NVL函数,DECODE函数4.5.1字符函数是专门处理字符的,例如可以将大写字符变为小写,还能求出字符的长度范例:将小写字母变成大写字母;验证函数必须以查询语句的形式出现此时使用dual表(单记录的表)SELECTupuer('smith')FROMdual;范例:一般用户查询一个人姓名的时候是忽略大小写的,此时可以使用UPPER()函数SELECT*FROMempWHEREename=UPPER('smith');对应的大写变小写是LOWER()函数;还可以使用initcap()将首字母大写范例:使用此函数将雇员表中的雇员姓名变成为开头大写字符串除了可以使用”||“使用还可以使用CONCAT()连接exa:SELECTCONCAT('hello','world')FROMdual;没有||好用SUBSTR()截取字符串LENGTH()求字符长度REPLACE('字符','e','x')替换字符用x代替e范例:SELECTSUBSTR('hello',1,3),LENGTH('hello'),REPLACE('hello','e','x')FROMdual;SUBSTR()函数中有一点要提醒大家注意,和面试有关:Oracle中的SUBSTR()函数的截取点是从0还是从1开始(测试从0还是1开始都是一样的因为ORACLE比较智能)范例:要求显示所有雇员的姓名及姓名的后3个字符;因为雇员姓名的字符长度不一样,所以只能求出整个的长度在-去3,这样进行截取SELECTename,SUBSTR(ename,LENGTH(ename)-2,LENGTH(ename))FROMemp;GeneratedbyFoxitPDFCreator©FoxitSoftware