oracleday01郭爱军guoaj@tarena.com.cnoracle4天plsql2天oracleoracle是数据库的一种DBMS数据库管理系统DB数据库RDBMS关系型数据库管理系统RDB关系型数据库(基于二维表的数据库)SQL结构化查询语言(structquerylanguage)table表头行列字段名字段值一行数据现在主流的数据库管理系统:oracle(甲骨文)公司:oracle9ioracle10goracle11gIBM:DB2MIC(微软):sqlserver非商业型数据库SUN:mysqlSQL语句分类:1select语句select2DDL数据定义语言createtabledroptablealtertable3DML数据操作语言insert、delete、update4TCL事务控制语言commit(提交)、rollback(回滚)、savepoint(保存点)5DCL数据控制语言grant、revoke操作数据库1远程登录服务器telnetIP地址2openlabopen1233使用sqlplus连接数据库sqlplusopenlabopen1234进入oracle的操作环境SQLs_emp(oracle公司提供的表)descs_emp;通过desc可以得到表的表头中的每个字段的名,反应这个字段能不能为空(不填值);得到字段的类型:varchar2(字符串)、number(数字类型)、date(日期类型);select语句1from子句1)查询表中的一个字段select字段名from表名;查询s_emp表得到每个人的月薪2)查询表中的多个字段select字段名1,字段名2from表名;3)查询一个表中的所有字段对应的数据*可以代表所有的字段名select所有字段名(用,隔开)表名;或select*from表名;4)sql语句中的数学运算+-*/(除法不再具有取整特性)5)字段或表达式的别名select字段名别名,表达式别名from表名;使用双引号可以把别名看成一个整体,且可以使别名原样显示。6)sql语句中的字符串表达使用单引号引起来的一串字符7)oracle中的字符串拼接||字符串拼接符输出一个单引号需要双单引号8)NULL值的处理任何值和NULL值做运算结果都是NULL;NULL值处理函数nvl(par1,par2)//par1和par2的类型必须保持一致;当par1为NULL时,返回par2的值;当par1不为NULL时,返回par1本身的值。NULL值要尽早处理。9)数据的排重显示distinctselectdistinctsalaryfroms_emp;//显示工资(排除相同的)selectdistincttitle,salaryfroms_emp;//只有title和salary都相同才排除2where子句1)where子句的本质限制表中数据的返回:满足where条件数据被选中,不满足where条件数据被过滤掉。2)如何限制number类型的数据//显示表s_emp中salary等于1000的所有id和salaryselectid,salaryfroms_empwheresalary=1000;3)字符串类型的条件//查询first_name是Carmen的id,first_name,salarySelectId,first_name,salaryfroms_empwherefirst_name='Carmen';4)总结常见条件where字段===!=(^=均为不等于)5)sql提供的条件运算符①表达一个闭区间[a,b]where字段betweenaandb;//查询salary的值在1500到2500之间的所有的id,first_name和salaryselectid,first_name,salaryfroms_empwheresalarybetween1500and2500;②表达任意列表内任意一个值where字段in(值1,值2,值3);//查询部门编号是31或者32或者50员工的id,first_name,dept_id;selectid,first_name,dept_idfroms_empwheredept_idin(31,32,50);列表中的数据顺序如果交换,数据出现概率相同基本对效率和结果无影响;但如果有些数据出现概率高就应该把概率高的数据放在前面。③NULL值的判断where字段isNULL;查询提成为10的员工id,first_name,commission_pctselectid,first_name,commission_pctfroms_empwherecommission_pct=10;④模糊查询关键字likewhere字段like'通配串'数据库中的通配符%0-n个任意字符_确定的一个任意字符//查找表user_tables中table_name以S_开头的所有table_nameselecttable_namefromuser_tableswheretable_namelike'S\_%'escape'\';6)逻辑连接符号andornot3数据的排序1)按照一定的标准和排序方式对数据进行排列2)orderby排序标准排序方式排序方式:asc升序(自然顺序、字典顺序)、desc降序3)永远出现在sql语句最后4)多字段排序5)NULL值在排序中如何处理NULL值在排序中作为最大值处理(多个NULL值视为相等)SQL语句不区分大小写,但字符串的值要严格区分大小写,并且要加上单引号。恢复运行环境1上传环境脚本2进入sqlplus运行脚本@summit2_drop.sqlselectidid,first_namef_name,salarysal,nvl(manager_id,-1)m_idfroms_emp;删除droptables_empcasecadeconstraints;day024当行函数1)含义单行函数:针对sql语句影响的每一行都做处理,并且针对每一行都返回一个结果。即:sql语句影响多少行就返回多少个结果。upper----转大写lower-----转小写selectfirst_name,upper(first_name)froms_empwhereid1;组函数:无论sql语句影响多少行,只返回一个结果。count----统计个数2)处理字符串的单行函数测试表dual(单行单列的表)upper----转大写lower-----转小写selectlower('HELLO')fromdual;length----求字符串长度concat(par1,par2)连接字符串很少用selectconcat('a',concat('b','c'))fromdual;substr(par1,par2,par3)//par1是要截取的字符串;par2是什么位置开始截取,编号从1开始,可以是负数,-1是最后一个字符;par3是截取的长度列出s_emp中first_name和first_name的后三个字符selectfirst_name,substr(first_name,-3,3)froms_emp;3)格式化显示函数to_char(par1,par2)par1是要处理的字段;par2是显示的处理格式,可以省略(省略表示转成字符串)。格式fm代表格式的开始(可以省略);$美元符号L本地货币符号9在小数点前时代表0-9的任意数字;在小数点后时代表1-9的任意数字0在小数点前时代表强制显示前导0;在小数点后时代表1-9的任意数字?.小数点,分隔符selectsalary,to_char(salary,'fm$099,999.00')froms_emp;selectsalary,to_char(salary,'fmL099,999.00')froms_emp;如何修改本地语言:远程登录服务器(telnetIP);切换shell(bsah);打开配置文件(vi.bash_profile-----exportNLS_LANG='SIMPLIFIEDCHINESE_CHINA.ZHS16GBK');保存退出;source.bash_profile;重新进入sqlplus4)字符串转换函数to_number('数字字符串')selectid,first_name,salaryfroms_empwhereid=1;selectid,first_name,salaryfroms_empwhereid=to_number('1');selectid,first_name,salaryfroms_empwhereid='1';三条语句效果相同5)数字处理函数round(par1,par2)四舍五入par1是要处理的数字,par2是方式(可省,省略代表按四舍五入取整,有值时代表对小数点(负)前/(正)后的第几位四舍五入)selectround(9.99)fromdual;10selectround(9.99,1)fromdual;10selectround(9.59,1)fromdual;9.6selectround(12.884,2)fromdual;12.88selectround(12.884,-1)fromdual;10trunc(par1,par2)截取------不四舍五入,直接舍弃selecttrunc(9.99)fromdual;9selecttrunc(9.99,1)fromdual;9.9selecttrunc(9.59,1)fromdual;9.5selecttrunc(12.884,2)fromdual;12.88selecttrunc(12.884,-1)fromdual;106)函数嵌套把一个函数的返回值作为另一函数的参数。//显示first_name的后三个字符selectfirst_name,substr(first_name,length(first_name)-2,3)froms_emp;//如果manager_id为NULL值就显示BOSS(加单引号)selectfirst_name,nvl(to_char(manager_id),'''BOSS''')froms_emp;5多表查询1why?----查询的数据分布在多张表中2how?----//显示表s_emp每个员工的first_name和部门号显示出来,并且要求显示部门名(部门名在表s_dept)selectfirst_name,dept_id,namefroms_emp,s_deptwheres_emp.dept_id=s_dept.id;在字段名前加表名点即可区分。//显示s_dept表中的员工名和与其对应的部门名selects_dept.name,s_region.namefroms_dept,s_regionwheres_dept.region_id=s_region.id;使用表的别名selectd.name,r.namefroms_deptd,s_regionrwhered.region_id=r.id;等值连接和非等值连接等值连接:使用等号作为连接符非等值连接:不使用等号作为连接符自连接:selectdistinctm.id,m.first_namefroms_empm,s_empewheree.manager_id=m.idorderbym.id;当我们查询的数据来自一张表,并且数据具有两层业务含义时需要将一张表看成两张表。-------------------------------------------------------------------------------------------------------------------------符合连接条件的数据被选中,不符合连接条件的数据被过滤掉;这种连接称为内连接。↑↓外连接:外连接的结果集等于内连接的结果集加上匹配不上的记录。(+)(+)字段对面表的数据