数据库(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
没有重复的:select distinct msisdn from address
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 * from dual where rownum<=10 minus select * from dual where rownum<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;
select count(*) from address; // 12
select count(*) from address 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)=0
mod(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