请免费分享!严禁谋利! Oracle学习笔记
常彦博
二、select from语句
2.1 select语句功能
1)投影操作:结果集是源表中的部分“列” 2)选择操作:结果集是源表中的部分“行”
3)选择操作+投影操作:结果集是源表中的部分“行”部分“列”
4)连接操作join:多表查询,结果集来自多张表,把多张的记录按一定条件组合起来
2.2 select语句基本语法
1)select colname(列名) from tabname(表名) 2)select中指定多个列名,则用“逗号”分隔:select colname1,colname2 from tabname 3)* 号表示所有列:select * from tabname 4)select语句:可有多个子句 5)select子句:投影操作(列名)、列表达式、函数 、from子句等 2.3列别名 1)给列起一个别名,能够改变一个列、表达式的标识。 2)不写的话默认都是转成大写。 3)适合计算字段。 4)在原名和别名之间可以使用as关键字。 5)别名中包含空格、特数字符或希望大小写敏感的,用“”双引号将其括起来。 2.4算术表达式 在number类型上使用算术表达式(加减乘除)。 eg:一个月使用了250小时,每种资费标准下应缴纳的费用(首次实现) select base_cost + (250 - base_duration)*unit_cost fee from cost; 2.5空值null的处理 未知的,没写数 1)空值不等于0 2)空值不等于空格 3)在算术表达式中包含空值导致结果为空 4)在算术表达式中包含空值需要用空值转换函数nvl处理 2.6 nvl(p1,p2)函数 空值转换函数
1)两个参数类型要一致!
2)参数的数据类型可以是数值number、字符character、日期date 3)但null转成字符串,null也要用to_char()转化。 4)实现过程: if p1 is null then return p2 elase return p1 end if 5)实现空值转换:null->非null值 0
5
请免费分享!严禁谋利! Oracle学习笔记
eg:一个月使用了250小时,每种资费标准下应缴纳的费用(再次实现) 常彦博
select nvl(base_cost,0) + (250 - nvl(base_duration,0)) * nvl(unit_cost,0) fee from cost; 2.7拼接运算符 ||
表达字符(串)的拼接,可以将某几列或某列与字符串拼接在一起。 select colname1||colname2 from tabname 2.8文字字符串
select语句后面可以包含的文字值:字符、表达式、数字。
1)字符常量(或字符串)必须用‘’单引号括起来,作为“定界符”使用。 2)表达单引号本身,需要两个单引号 ' ' ' ' 1,4定界2,3表单引号。 3)对于文字值每行输出一次。 eg:显示客户姓名的身份证号是?? select real_name | | ' ' ' s IDCARD NO is ' | | idcard_no | | ' . ' cilent from account; 4)函数转换大小写,尽量在进入数据时操作。 2.9消除重复行 distinct去重复行(对整条记录返回的结果去重,不是对后面的某个列去重),若后面有多列,则所有列联合起来唯一,即每列的值都可以重复,但组合不能重复。 eg1:哪些unix服务器提供远程登录业务 select distinct unix_host from service; eg2:每一台unix服务器在哪些天开通了远程登录业务 select distinct unix_host,create_date from service; 2.10其他注意事项 1)调常量时用单行单列的dual表,系统提供的表。 2)invalid identifier 无效标识名,列名不。 3)table or view does not exist 表名不对。 6
请免费分享!严禁谋利! Oracle学习笔记
常彦博
三、SQL语句的处理过程
3.1 SQL语句处理过程
用户进程sqlplus→建立连接→服务进程Server process oracleSID
↑--创建会话--Oracle server
3.2处理一条select语句
1)分析语句: ①搜索是否有相同语句 ②用hash value计算select语句是否长得一样:大小写,关键字,空格要都一样,不一样则为两条语句,则服务进程会重新分析。若为统一语句,则直接从内存拿执行计划,计算结果
③检查语法、表名、权限 ④在分析过程中给对象加锁 ⑤生成执行计划
2)绑定变量:给变量赋值 3)执行语句:
4)获取数据:将数据返回给用会进程
7
请免费分享!严禁谋利! Oracle学习笔记
常彦博
四、where子句
用where子句对表里的记录进行过滤,where子句跟在from子句后面。
4.1 where子句后面可以跟什么
跟条件表达式:列名、常量、比较运算符(单、多值运算符)、文字值;不能跟组函数!不能跟列别名!
? 注意事项:对列不经过运算的条件表达式效率会更高,建议在写where子句时尽量
不要对列进行运算。
eg:一年的固定费用为70.8元,计算年包在线时长 select base_duration*12 ann_duration from cost where base_cost*12=70.8; 没下面效率高 select base_duration*12 ann_duration from cost where base_cost=70.8/12; 4.2语法和执行顺序 语法顺序:select from where 执行顺序:from where select 4.3字符串是大小写敏感的,在比较时严格区分大小写 1)upper():函数将字符串转换成大写。 2)lower():函数将字符串转换成小写。 3)initcap():函数将字符串转换成首字符大写(是将列中的值大小写转换然后去和等号后的字符串比,而不是把转字符串转换去和列比)。 eg:哪些unix服务器上开通了os帐号huangr select unix_host,os_username from service where os_username = 'huangr';(有结果) where lower(os_username)='HUANGR';(无结果) where lower(os_username)='huangr';(有结果) where upper(os_username)='HUANGR';(有结果) 4.4 where子句后面可以跟多个条件表达式 条件表达式之间用and、or连接,也可用()改变顺序。 4.5 between and运算符 表示一个范围,是闭区间,含义为大于等于并且小于等于。 eg:哪些资费的月固定费用在5元到10元之间 select base_duration,base_cost,unit_cost from cost where base_cost >= 5 and base_cost <= 10; where base_cost between 5 and 10; 4.6 in运算符(多值运算符)
表示一个集合,是离散值,含义为等于其中任意一个值,等价于any。 eg:哪些资费的月固定费用是5.9元,8.5元,10.5元 select base_duration,base_cost,unit_cost from cost where base_cost = 5.9 or base_cost = 8.5 or base_cost = 10.5; where base_cost in(5.9,8.5,10.5); where base_cost =any(5.9,8.5,10.5); 8
请免费分享!严禁谋利! Oracle学习笔记
常彦博
4.7 like运算符
在字符串比较中,可用like和通配符进行模糊查找。
1)通配符:%表示0或多个字符; _表示任意“一个”字符(要占位的)。
? 注意事项:若要查找%和_本身,则需要escape进行转移。 eg:哪些unix服务器上的os帐号名是以h开头的 select os_username from service where os_username like 'h%' eg:哪些unix服务器上的os帐号名是以h_开头的 select os_username from service where os_username like 'h\\_%' escape '\\'; 4.8 is null运算符
测试null值需要用is null。 1)null不能用等于号“=”和不等于号“<>”跟任何值比较,包括它自身。所以不能用“=”和“<>”来测试是否有空值。 2)即:null=null是不成立的;null不等于 null也不成立;null和任何值比较都不成立。 eg:列出月固定费用是5.9元,8.5元,10.5元或者没有月固定费。 select base_duration,base_cost,unit_cost from cost where base_cost in (5.9,8.5,10.5,null);(错误) where base_cost in (5.9,8.5,10.5) or base_cost is null;(正确) 4.9比较和逻辑运算符(单值运算符) 1)比较运算符:= > >= <<= 2)SQL比较运算符:between and、in、like、is null 3)逻辑运算符:and、or、not 4.10多值运算符all、any 1)>all:大于所有的,等价于 >(select max()?)。 2)>any:大于任意的,等价于 >(select min()?)。 4.11运算符的否定形式 1)比较运算符:<> != ^= 2)SQL比较运算符:not between and not in not like is not null ? 注意事项: ? in相当于=or =or =or等价于any ? not in等价于 <>and <>and <>and等价于<>all ? not between and 小于下界 or 大于上界
? 集合中有null,对in无影响;但对not in有影响,有一个就没有返回值! eg:哪些资费信息的月固定费用不是5.9元,8.5元,10.5元 select base_duration,base_cost,unit_cost from cost where nvl(base_cost,0) <> 5.9 and nvl(base_cost,0) <> 8.5 and nvl(base_cost,0) <> 10.5; where nvl(base_cost,0) not in (5.9,8.5,10.5); 9