您的位置:首页 > 数据库

数据库基本知识

2014-08-13 23:58 267 查看
监听程序端口:1521

mts的oracle端口:2030

http监听程序端口:8088

常见的类型:

number(n) n位整数

number(m,n) m位有效数字,n位小数

varchar2(n) 不大于n位字符

date

mysql 和 oracle基本测试都可行

create table emp(id number(3), //创建表
mysql中没有number,用int等
name varchar2(50), 
hire_date date, 
salary number(8, 2));
//工资块表示有效数字八位,小数为2位.

drop table emp; //删除表

desc emp; //描述表结构

insert into emp(id, name, hire_date, salary) values(101, 'goodman', to_date('2013-10-23','yyyy-mm-dd'), 1500.50);
//to_date('2013-10-23','yyyy-mm-dd') 日期类的to_date()函数,oracle转悠,第一个参数是自己定义的日期类型,第二个参数是指明自定义格式,该函数按照参数2定义的格式将参数1转换为oracle的默认日期格式,使用毫秒数比较好,这样可以和java无缝连接

update emp set salary=100,name='sss' where id=101;
//修改表中的某些行

delete from emp where id=101;

select name from emp where salary>1000;

char和varchar2的区别

char是定长的,varchar2是可变长的.指的是存储空间可变

leng(name)是求name的表面长度

2.关于varchar2的中文问题

select userenv('language') from tb_name //查看oracle字符编码,dual是oracle自带的测试表

select sysdate from dual //varchar字段一般是中文长度乘以3作为存储空间的大小

nvarchar2 平台无关的可变长度字符类型

create table foo_3(c1 nvarchar2(2));

insert into foo_3 values('你好')

char和varchar2的最大长度  2000 4000

字符串连接

'abc'||'sdf'

concat(fname, lname)

常用函数

trim //

ltrim

rtrim

lpad(str, 填充至的长度, [填充的字符,默认空格]) //左边填充字符至指定长度

lpad(str, 50, '*');

rpad //右边填充字符至指定长度

lower //变成小写

upper //变成大写

initcap //首字母大写

length //取字符串长度

substr() //求子串

select substr(String ,起始位置[,子串长度]) from tb_nam3;
//负数表示从后往前数

instr() //查找字符串

select instr(字段名, '子串', 5)

select trim(c1) from db_name;,

日期操作

1. 日期类型
date 年月日时分秒
timestamp 年月日时分秒(秒带小数点)
select sysdate from dual;
to_date, to_char
select to_date('2013-10-23', 'yyyy-mm-dd') from dual;
select to_char(sysdate, 'yyyy-mm-dd') from dual;
select to_char(sysdate, 'yyyy-mm-dd hh:mi:ss')from dual;
select to_char(da, 'yyyy-mm-dd hh24:mi:ss') from tb_name;

last_day(date)
所在月的最后一天
select months_between(sysdate,birthday)/12 from tb_name
date1-date2
least(date1, date2)
较早的一个
greast(date1, date2)  距离现在较近的一个.

round(date)
四舍五入
floor(date)
向下取整
ceil(date)
对时分秒向上取整
trunc(date) 把时分秒去掉

DDL表

create alter drop

1. 关于null

create table goo_1(

 n1 number(2),

 c1 varchar(20)

);

插入时可以指定为null

insert into goo_1 values(1, 'abc');

insert into goo_1 values(2, 'bcd');

insert into goo_1 values(3, null);

没有插入的列也为null

2 判断是否为null

select * from goo_1 where c1 is null;

3 nvl

select nvl(c1,'hahaha') from goo_1; //将null替换为指定的字符串

select nvl(c1,'hehhee','hahhaha') from goo_1;
//如果c1为null,返回hahha,否则返回hehhehe

4 not null 约束

create table goo_1(

 n1 number(2) not null,

 c1 varchar(20) not null

);

number的舍入

create table goo_1(

 n1 number(8,2),

 c1 varchar(20)

);

 

主键  数据表中行的唯一性

constraint 主键约束名 primary key(主键列)

主键也是列,一般没有业务含义,唯一标识数据表中的某一行.必须有主键

create table stu(

 stu_id number(11),

 stu_no number(8),

 stu_name varchar(50),

 constraint stu_pk primary key(stu_id) //主键的约束

);

insert into stu values(100,2013001,'sfsdf');

主键约束:主键不能为null,不能重复

4 drop delete truncate

 drop table stu; //删除表所占用的空间

 truncate table stu; //保留表的结构,删除数据,释放空间,不能恢复,速度快

 delete from stu; //删除数据,可以恢复,速度慢.

5 添加列

create table goo_11(

 name varchar(5)

);

添加工资列

alter table goo_11 add(

salary number(8,2)

);

添加主键的方式为先加入字段名,然后在字段中添加数据,最后将字段设置为主键

添加not null的列的方式如同主键的方式

修改列的信息

alter table goo_11 modify(

 name varchar(15) not null,

 constraint goo_11 primary key(id)

);

删除列

alter table goo_11 drop column name;

根据其他表创建新表

//该拷贝会自动将表中符合条件的数据全部复制到新表中

create table emp_1

as select id, last_name, first_name, salary from s_emp where salary>1200;

//只拷贝结构,不拷贝其中的数据

create table emp_1

as select id, last_name, first_name, salary from s_emp where 1=3;

4 DQL

1).基本的关系表达式
and or >,<,>=,<=,<>,=

2).%多个 _一个
字段名 like ''

select last_name,salary from s_emp where last_name like 'Bi%';

3).where子句中的between *** and ***

select salary between 1000 and 2000;

4).where子句中的in和not in

select last_name,salary from emp_1 where last_name in('biri','maqee');

5). is null, is not null判断空值

6). select last_name, salary from s_emp
where
salary = (select salary from s_emp where last_name in('Biri') and last_name <> 'Maduro');

7). select * from s_emp where length(last_name)>8;

update s_emp set salary=1200 where last_name='Biri';

8). select id,first_name name from emp_1; //将查询结构看成逻辑上的一个表

9). slect distinct salary from emp; //不重复

010). select first||'.'||last_name name, salary from emp_1;

11). 聚合函数
count min max sum avg

 对查询出的所有行进行运算

select sum(salary) total_salary from emp_1;

select count(commission_pct) from s_emp;

12). order by 根据某个或几个列进行排序

where salary>1000 order by salary desc //asc 升序   可以加函数什么的

13). group by 分组,注意select后跟着组的特性  group by a,b,c ;

create table emp_5 as select id, last_name  name, title, dept_id, salary from s_emp;

select dept_id, count(id) from emp_5 group by dept_id

14). having 根据条件过滤组,注意与group by的区别

selec
b460
t dept_id,avg(salary),count(id) from emp_5 group by dept_id having count(id)>3;

15). decode函数,oracle特有的函数

decode(value1 if1 then1 if2 then2....else)

如果value=if1 返回 then1

否则 如果value=if2 返回 then2

默认的返回时else

select decode(salary,1200,'一千二',1400,'一千四','其他') from s_emp;

select dept_id,count(decode(title,'Stock Clerk',1,null)) from s_emp group by(dept_id);

select dept_id,count(id) from s_emp where title='Stock Clerk' group by(dept_id);

select dept_id,avg(decode(title,'Stock Clerk',salary,1,null)) from s_emp group by(dept_id);

表的关联

连接表 笛卡尔积

create table ta(a varchar(2));

create table tb(b varchar(2));

insert into ta values('a1');

insert into ta values('a2');

insert into tb values('b1');

insert into tb values('b2');/

insert into tb values('b3');

insert into tb values('a1');

select * from ta,tb; 笛卡尔积

select * from ta ax, tb bx where ax.a=bx.b;
拼接

内连接 [inner] join... on...
select ename, dname from emp e [inner] join dept d on e.deptno=d.deptno;
//先笛卡尔积,然后再根据条件选择得到表
select ename, dname from emp e [inner] join dept d using(deptno);
//效果同上

外连接

 左外连接 select ename, nvl(dname,'未分配部门') from emp e left outer join dept d using(deptno);

 右外连接 select nvl(dname,'未分配部门'),count(empno) from emp e right outer join dept d using(deptno) group by dname order by count(empno) desc;

 

 全外连  select nvl(dname,'未分配部门'),count(empno) from emp full join dept using(deptno) group by dname order by count(empno);

//查询所有部门的名称及部门的人数,没有部门的人被划分到未分配部门

自连接

查询所有有上级的员工的姓名和其上级的姓名

select e1.ename,e2.ename from emp e1 join emp e2 on e1.mgr = e2.empno;

select nvl(e1.ename,'新员工'),e2.ename from emp e1 right outer join emp e2 on e1.mgr = e2.empno;

查询所有领导及其手下的员工

select e2.ename,count(e1.empno) from emp e1 join emp e2 on e1.mgr=e2.empno group by e2.ename order by count(e1.empno) desc;

查询king的直属下级

select ename from emp where mgr=(select empno from emp where ename='KING');

select e1.ename from emp e1 join emp e2 on e1.mgr=e2.empno where e2.ename='KING';

查询工资高于平均工资的员工姓名和工资

select ename,sal from emp where sal>(select avg(sal) from emp);

查询所属员工姓名中含有'S'的部门的名字

select dname from dept where deptno in (select deptno from emp where ename like '%S%');
//in关键字

select ename,sal from emp where sal>any(select distinct sal from emp where job='MANAGER');
//ANY关键字

select ename,sal from emp where sal>all(select distinct sal from emp where job='MANAGER');
//ALL关键字大于全部

查询所有的管理者

select ename from emp where empno in(select distinct mgr from emp);

select ename from emp e1 where exists (select 1 from emp e2 where e2.mgr=e1.empno);
//EXISTS判断子查询是否有行有行就是true,一般认为exists比in的查询效率高.

5 not in (1,2,null) //false

5 in (1,2,null) //false

select ename from emp where empno not in(select distinct mgr from emp where mgr is not null);
//in和not in的子查询中不能有空值存在

select ename from emp e1 where not exists (select 1 from emp e2 where e1.empno=e2.mgr);
//作用同上,注意比较

alter user unlock account scott;

where 子句中,多列

select * from emp where(deptno,sal) in(select deptno,min(sal) from emp where deptno is not null group by deptno);

select ename,job from emp join dept using(deptno) where(deptno,sal) in (select deptno,min(sal) from emp where deptno is not null group by deptno);

having是筛选分组之后的情况,在分组之后筛选.where是对单个的行筛选,在分组之前筛选

select deptno,round(avg(sal)) from emp where deptno is not null group by deptno having avg(sal) = (select deptno,max(avg(sal)) from emp group by deptno);

oracle分页显示设计

select empno, ename from emp where rownum<=10;
//rownum只能是小于等于,大于等其他不行.

select empno,ename from (select empno,ename,rownum n from emp where rownum<=9) where n>5;
//分页查询

mysql的分页查询 select * from emp limit 5,10;
//取出5-10行的数据

内联视图(INNER VIEW)

查询job为manager的所有人所属的部门编号和人数

select ename,job,emp_num from emp join (select deptno d,count(empno) emp_num from emp join dept using(deptno) group by deptno) on deptno=d where job='MANAGER';

Oracle高级查询

 union 将两个表的内容联合在一起,union all可以重复

 intersect,交集

 minus从第一个表中将表二中重复的删除

 connect by和start with

提供了一个专门的伪列 level

 select * from (select level k,empno,ename,mgr from emp start with ename='KING' connect by prior empno=mgr) where k=2;
//last向后,prior向前,Start with是开始的行,上级编号写在connect by的等号右边

高级分组函数

rollup 函数 计算分组的小计值,对于分组的列为null,对于聚合函数则是根据聚合函数求其小计.

cube统计所有列的小计,rollup只统计第一列的小计

select dname,job,sum(sal) from emp join dept using(deptno) group by rollup(dname,job) order by dname;

select dname,job,sum(sal) from emp join dept using(deptno) group by cube(dname,job) order by dname;

grouping grouping sets(只查询小计的行)的用法,效率高于cube和rollup

排名函数

select ename,sal from emp order by desc;

select rank() over (order by sal desc),ename, sal from emp;

select dense_rank() over (order by sal desc),ename, sal from emp;

计算行号

row_number() 

select row_number() over (order by sal desc), ename from emp;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: