数据库(Oracle)基础知识:
1.SQL分类:
DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)
2.几个简单的基本的sql语句
选择:select * from table1 where范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where范围
更新:update table1 set field1=value1 where范围
查找:select * from table1 where field1 like ‘%value1%’ ---like的语法很精妙
排序:select * from table1 order by field1,field2 [desc|asc]
总数:select count(*) as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
没有重复的:selectdistinctmsisdnfromaddress
3.几个高级查询运算词
并集union (aUb):select * from a union(all)select * from b
union all,不去掉重复的。交集intersect(anb):select * from a intersect select * from b差集minus(a-b):select * from a minus select × from b
取第6到第10条数据:
select*fromdualwhererownum<=10minusselect*fromdualwhererownum<5
4.总结为日期字段赋值的几种方式,并举例说明
oracle中有个到当前系统时间--sysdate,如:
select sysdate from dual; // 2008-07-29 11:30:01
给当前日期加上2年:
select add_months(sysdate,24) from dual;// 2010-07-29 11:21:24
取得当前日期中下个周一的日期:
select next_day(sysdate,'Monday') from dual;//2008-08-04 11:23:39
取得当前日期中月份的最后一天:
select last_day(sysdate) from dual; // 2008-07-31 11:25:37
取得二个日期之间的间隔月数:
select months_between('01-sep-08','11-jan-08') from dual; //7.677
可对日期进行算述运算:
select (last_day(sysdate)-sysdate)from dual; // 2
5.总结join几种用法,并举例说明
inner join: select * from A join B on A.id=B.id (default是inner join)
left join: select * from A left join B on A.id=B.id
right join: select * from A right join B on A.id=B.id
笛卡尔积: select * from A,B;
selectcount(*)fromaddress;// 12
selectcount(*)fromaddress a, address b;//12*12=144
自连接:
已知一个表的结构为:
1姓名科目成绩
2张三语文20
3张三数学30
4张三英语50
5李四语文70
6李四数学60
7李四英语90
怎样通过select语句把他变成以下结构:
1姓名语文数学英语
2张三20 30 50
3李四70 60 90
select A.姓名,A.科目as语文,B.科目as数学,C.科目as英语from student A,student B,student C
where A.姓名 =B.姓名and B.姓名 =C.姓名and A.科目 ='语文 'and B.科目 ='数学 'and C.科目 ='英语 '
6.数字函数
round(45.926,2)---将前一数保留指定的小数位,并四舍五入(45.93),假如指定位是负数则意为在小数点左边保留指定位,如:
round(45.923,-1)=50,rount(45.923,0)=46,round(45.93,-2)=0,round(55.93,-2)=100
trunc(45.926,2)---同上,得不四舍五入(45.92) ,trunc(55.926,-1)=50, trunc(55.926,-2)=0mod(1600,300)---求余(100)
select round(sysdate,'month')RM,round(sysdate,'year')RY,trunc(sysdate,'month')TM, trunc(sysdate,'year')TY from dual;
RM
RY
TM
TY
2008-08-01 00:00:00
2009-08-01 00:00:00
2008-07-01 00:00:00
2008-01-01 00:00:00
7.字符处理
upper(str)---将字符串str全部转换成大写
lower(str)---将字符串str全部转换成小写
initcap(str)---将字符串中每个单词的首字母大写
concat(str1,str2)---将字符串str1与str2连接起来(也可以通过'||'号直接相连)
substr(str,a,b)---取字符串str中的指定字符,从位置a开始取长度为b的字符串,若a为正则从左边开始,则从右边开始
instr(str,'z')---取得str字符串中从左边开始每一次出现z字符的下标位置(下标从1开始)
lpad(str,12,'*')---左填充,即将字符串str长度填充到12,假如其不足12位则在左边以*号填充
rpad(str,12,'*')---右填充,同上
length(str)---计算字符串str的长度
8.SQL操作符,举例说明
||字符串相加 select sysdate||'_奥运' from dual; // 29-JUL-08_奥运>
<
=
Like
Between and
9.注意事项:
9.1 group by之外的字段如果出現在select里面的話必須使用聚集函數,否則不合法。比如:select a, b, sum(c) from tab group by a, b (OK) select a, b, c from tab group by a, b (X)
9.2 having子句对group by子句所确定的行组进行控制,having子句条件中只允许涉及常量,聚组函数或group by子句中的列.
9.3 rownum只能用符号(
select * from tablename where rownum != 10;返回的是前9条记录。不能用:>,>=,=,Between...and。由于rownum是一个总是从1开始的伪列,Oracle认为这种条件 不成立,查不到记录.
9.4 快速复制一个表和数据:
create table TEST3 as select * from TEST
insert into TEST3 select * from TEST