SQL语言基础 (转自key)

1 SQL语言基础
1.1 两种SQL语言
1.1.1 DDL
表7-1 部分D D L语句列表
S Q L命令功能
alter procedure 重编译存储过程
alter table 增加表列、重定义表列、更改存储分配
analyze 收集数据库对象的性能统计值并送入基于代价的优化器
alter table add constraint 在已有的表上增加约束
create table 创建表
create index 创建索引
drop index 删除索引
drop table 删除表
grant 将权限或角色授予用户或其他角色
truncate 删除表中所有行
revoke 从用户或数据库角色回收权限
1.1.2 DML
表7-2 部分D M L语句列表
S Q L命令功能
insert 增加数据行到表
delete 从表中删除数据行
update 更改表中数据
select 从表或视图中检索数据行
commit work 把当前事务所做的更改永久化(写入磁盘)
rollback 作废上次提交以来的所有更改
1.2 SQL*Plus入门
进入DOS窗口,输入命令sqlplus polly/gone
1.2.1 创建语句
Create table customer(
Last_name varchar2(30) not null,
State_cd varchar(2),
Sales number
)
tablespace custspace -- tablespace子句将表存放到指定的数据库表空间中。
storage(initial 25k next 25k minextents 1); -- storage子句用于定义表空间

create table state(
state_cd varchar(2) not null,
state_name varchar2(30)
);

create table x(
col varchar2(30)
);

create table y(
col varchar2(30)
);
表7-3 部分数据类型
数据类型说明
char(size) 存放定长字符数据,最长2 0 0 0个字符
nchar(size) 与char型类似,不过其最大长度由数据库所用的字符集(如American English)决定
varchar2(size) 存放可变长字符数据,最大长度为4000字符
nvarchar(size) 类似于varchar2
Varchar 目前等同于char
number(l,d) 存放数值型数据,l代表总位数, d代表小数点后位数(4,2)的最大值是 99.99。
Blob 二进制大对象,其最大长度为4GB
raw(size) 纯(Raw)二进制数据,最大长度为2000字节
Date 存放日期,范围从公元前4712年的1月1日到公元后9999年的12月31日
Long 存放可变长字符数据,最大为2GB(gigabytes)
在每条D D L语句的最后都有一个分号(;),表示S Q L语句输入完毕,可以开始执行。
1.2.2 描述语句
describe customer -- 得到表customer的相关信息
在SQL*Plus中,只有describe命令可简写为desc。

1.2.3 插入语句
insert into customer values(’Teplow’,’MA’, 23445.67);
insert into customer values(’Abbev’, ’GA’, 6969.96);

Oracle数据库响应1row created.

或者:
insert into state(state_name,state_cd) values(‘Massachusetts’,’MA’);
1.2.4 查询语句
使用select语句操作名为user_tables的数据字典视图
select * from user_table where table_name = ‘customer’;
1.2.5 where子句
表7-5 常用比较操作符
操作符作用样例
= 相等 select * from state where state_cd=’MA’;
! = 不相等 select * from state where state_cd!=’MA’;
^ = 同! = select * from state where state_cd^=’MA’;
< > 同! = select * from state where state_cd<>’MA’;
< 小于 select * from customer where sales<100;
> 大于 select * from customer where sales>100;
< = 小于或等于 select * from customer where sales<=1000;
> = 大于或等于 select * from customer where sales>=1000;
In 等于括号内任一成员 select * from customer where state_cd in (’MA’,’NJ’);
not in 不等于括号内任一成员 select * from customer where state_cd not in (’MA’,’NJ’);
between A and B 大于等于A与小于等于B select * from customer where sales between 1 and 50;
not between A and B 不大于等于A与小于等于B select * from customer where sales not between 1 and 50;
like ’%tin%’ 包括给定字串 select * from customer where last_name like ’%tin%’;

1.2.6 Order by子句
降序:select * from customer order by last_name desc;
升序:select * from customer order by last_name;
在order by子句中未指定升序或降序时,Oracle按升序排列
1.3 数值型数据
SQL语句中,若无法指定具体的数据表用于该语句,就可以使用dual表。
表7-7 数值型常用函数
函数返回值样例显示
ceil(n) 大于等于数值n的最小整数 select ceil(10.6) from dual; 11
floor(n) 小于等于数值n的最大整数 select floor(10.6) from dual; 1 0
mod(m,n) m除以n的余数,若n = 0,则返回m select mod(7,5) from dual; 2
power(m,n) m的n次方 select power(3,2) from dual; 9
round(n,m) 将n四舍五入,保留小数点后m位 Select round(14.5678,2) from dual; 14.57
sign(n) n=0返回0;n>0返回1; n<0返回-1 select sign(12) from dual; 1
sqrt(n) n的平方根 select sqrt(25) from dual; 5
SQL*Plus的帮助实用工具存放在Oracle Documentation内。
SQL>help functions
1.4 字符型数据
表7-8 常用字符函数
函数返回值样例显示
initcap(char) 把每个字符串的第一个字符换成大写 Select initcap(’mr.teplow’) from dual; M r. Te p l o w
lower(char) 整个字符串换成小写 Select lower(’Mr.Frank Townson’) from dual; mr.terry beaker
replace(char,str1,str2) 字符串中所有str1换成str2 select replace(’Scott’,’S’,’Boy’) from dual; Boycott
soundex(char) 字符串的语音表示,常用于名字的模糊查询,可查找发音相似拼写不同的字符串 select last_name from employee where Abbey soundex(last_name)=soundex(’SMYTHE’);
substr(char,m,n) 取出从m字符开始的n个字符的子串 select substr(’ABCDEF’,2,1) from dual; CD
length(char) 求字符串的长度 select length(’Anderson’) from dual; 8
用两竖线“||”表示并置运算符。select ’ABC’||’DEF’ from dual;,返回文本ABCDEF。
若last_name值为John,select ’Dear’||last_name||’:’ from customer;将返回文本“DearJohn:”
1.5 日期型数据
1.5.1 日期型函数
表7-9 常用日期型函数
函数返回值样例显示
Sysdate 当前日期和时间 Select sysdate from dual; 28-FEB-02 on February 28,2002
Last_day 本月最后一天 Select last_day(sysdate) from dual; 31-MAR-02 on March 12,2002
Add_months(d,n) 当前日期d后推n个月 Select add_months(sysdate,2) from dual; 1 8 - M AY-02 on March 18,2002
Months_between(f,s) 日期f和s间相差月数 Select months_between(sysdate,’12- MAR,-02’)from dual; 13 in April 2003
Next_day(d,day) d后第一周指定的day日期 Select next_day(sysdate,’Monday’) from dual; 03-JAN-02 on December30,2001
1.5.2 特殊格式的日期型数据
表7-10 常用日期数据格式
格式返回值样例显示
Y或YY或YYY 年的最后一位,两位或三位 Select to_char(sysdate,’YYY’) from dual; 002表示2002年
SYEAR或YEAR SYEAR使公元前的年份前加一负号 Select to_char(sysdate,’SYEAR’) from dual; -1112表示公元前111 2年
Q 季度,1~3月为第一季度 Select to_char(sysdate,’Q’) from dual; 2表示第二季度①
MM 月份数 Select to_char(sysdate,’MM’) from dual; 12表示12月
RM 月份的罗马表示 Select to_char(sysdate,’RM’) from dual; IV表示4月
Month 用9个字符长度表示的月份名 Select to_char(sysdate,’Month’) from dual; May后跟6个空格表示5月
WW 当年第几周 Select to_char(sysdate,’WW’) from dual; 24表示2002年6月13日为第24周
W 本月第几周 Select to_char(sysdate,’W’) from dual; 2002年10月1日为第1周
DDD 当年第几, 1月1日为001,2月1日为032 Select to_char(sysdate,’DDD’) from dual; 363 2002年1 2月2 9日为第363天
DD 当月第几天 Select to_char(sysdate,’DD’) from dual; 04 10月4日为第4天
D 周内第几天 Select to_char(sysdate,’D’) from dual; 5 2002年3月14日为星期一
DY 周内第几天缩写 Select to_char(sysdate,’DY’) from dual; SUN 2002年3月24日为星期天
HH或HH12 12进制小时数 Select to_char(sysdate,’HH’) from dual; 02 午夜2点过8分为02
HH24 24小时制 Select to_char(sysdate,’HH24’) from dual; 14 下午2点08分为14
MI 分钟数(0~59) Select to_char(sysdate,’MI’) from dual; 17下午4点17分
SS 秒数(0~59) Select to_char(sysdate,’SS’) from dual; 22 11点3分22秒
提示注意不要将MM格式用于分钟(分钟应该使用MI)。MM是用于月份的格式,将它用于分钟也能工作,但结果是错误的。
1.5.3 日期运算
Oracle特别注意月和年的界限问题。如语句select to_char(sysdate+14) from dual;
将在原值23-DEC-2002上加1 4天,得出06 -JAN-03。
1.6 表列数据类型转换
用户常常会用遇到需要将数据表列从一种类型转换为另一种类型的情况(如数值型转换成
日期型,字符型转换成数值型)。O r a c l e提供三种主要的转换函数。
1. To_char 将任意类型的数据转换成字符类型。语句select to_char(8897) from dual;返回一个包含字符串8897的字符类型的数据。
2. To_number 将一组合法的数字字符串(如字符数据8897)转换成数值。语句select to_number(’8897’) from dual;返回一个包括数值8897的数值类型的数据。
3. To_date 将适合格式的字符串数据转换成日期型数据,语句select to_date(’12-DEC-02’) from dual;语句select to_date(’20021227’,’YYYYMMDD’) from dual;将返回日期27-DEC-02
1.7 Update、Delete和Alter等语句
1.7.1 update语句
u update后跟一个或多个要修改的表,这部分是必不可少的。
u set后跟一个或多个要修改的表列,这也是必不可少的。
u where后跟更新限定条件,这是可选的。
例如,若用户准备把customer表中的所有sales值改为0,只要执行命令update customer set sales=0; 即可。Oracle将修改所有的数据行,并返回被修改的行数。如果只想把State_cd为MA的客户的sales改为0,那么可用SQL语句update customer set sales=0 where state_cd=’MA’;可见update命令的功能十分重要。
1.7.2 delete语句
u 关键字delete from 后跟准备从中删除数据的表名,这是必不可少的。
u 关键字where后跟删除条件,为可选的。
如果用户想删除customer表的所有记录,可用S Q L语句delete from customer;。如果用户准
备删除state_cd 为CA的客户记录,可用SQL 语句delete from customer where state_cd=’CA’;
1.7.3 alter语句
u 语句alter table customer add(sale_date date);将成功地把表列sale_date加到表customer中。在多数情况下,用户都是用alter增加表列到表中的。语句alter table x modify(col1 date);用来改变一个已存在表列的数据类型。(执行alter命令时,如果要改变含有数据的列的数据类型,那么Oracle8i对alter命令所执行的操作将有很严格的限制)
u alter table x modify (col1 date,col5 number(3,1));的作用和两条独立的alter语句一样。
u Oracle8i的新内容:如果想把customer表中的一个新增加的sale_date列删除,可使用如下语句:Alter table customer drop column sale_date;这将立即从表中删除这列,回收sale_date列所用的空间。
1.8 连接两个表
1.9 格式化输出
利用S Q L * P l u s命令show all,用户能知道显示格式的当前设置。
1.9.1 页和行的大小
为设置行宽为8 0,可输入命令set linesize 80。
可以用命令set pagesize 30设置页长为3 0行。
1.9.2 页头标
ttitle ’Database techologies|Customer Report’
使Oracle居中放置文本“ Database Technologies”为第一个头标行,然后将文本“Customer Report”居中放置在第二行。
1.9.3 页脚标
btitle ’---sample.sql---’
使SQL*Plus把文本“---sample.sql---”放于每一页底部中央。用户还可以使用left或right 关键字将btitle命令中的文字放到相应的位置。
1.9.4 将SQL*Plus结果写到文件中
1. spool c:/report/out.lis。在大多数操作系统中,如果用户未指定后缀,系统会自动在文件名后增加后缀“.lst”。例如,命令spool report会自动产生一个名为report.lst的文件。
2. 为停止假脱机(spooling),可用命令spool off 或spool out 后者关闭输出文件并打印输出。
1.9.5 格式化输出表列
1. column last_name format a8 wrap heading ’Last|Name’
告诉SQL*Plus在last_name表列只显示8个字符。8代表last_name的显示宽度,a表示每个位置只能是字符。其中w r a p部分说明如果last_name多于8个字符,多余的字符显示在下一行的对应位置。Heading部分告诉SQL*Plus把“Last Name”分两行打印在报告的头上。
2. column state_cd format a8 heading ’State|Code’
让SQL*Plus以8个字符位置显示state_cd,并且在state_cd表列的顶部放一个两行的列标题“State Code”。
3. Column sales format 999,999,999,999.00 heading ’Sales’使S Q L * P l u s显示1 2位数字,两位小数,用逗号作分隔符。
4. col sales format 99999999 格式化了sales表列,因为sales表列是用99999999格式化的,因此显示结果中没有小数。
1.10 格式化所有表列的输出
1. 断开逻辑(Break Logic)
执行表列格式化命令col sales format 999999.00 然后SQL查询语句selects tate_cd, last_name, sales from customer order by state_cd,last_name;执行断开命令break on state_cd: state_cd为C A的在第1行显示后,第2行至第5行都不显示(因为从第一行后state_cd没有改变),然后第6行和第7行的值不同,又再显示。
2. 断开和跳过(Break and Skip)
用命令col sales format $999,999,999.99 heading ’YTD|Sales’重新格式化sales表列,再执行断开命令break on state_cd skip 1。现在,语句select state_cd, last_name, sales from customer oderby state_cd, last_name;请注意Oracle是怎样控制打印state_cd表列的。利用这一点可以很容易地通知Oracle计算每个断开部分的总销售(Sales)值。
3. 在断开点计算表列值
命令compute sum of sales on report 是在报表结尾处,计算报表的合计值。report在此处用于触发数值域求和,并显示在报表的结尾处。而命令“ compute sum of sales on state_cd” 使在打印新的state_cd时打印合计。为同时打印报表合计和断开点合计,需要用命令break on report skip 1 on state_cd skip 1重置断开条件。修改SQL 语句以便用state_cd排序数据。对于断开报表,必须用break 语句中同样的表列排序数据。

你可能感兴趣的:(SQL语言基础 (转自key))