数据库基本知识
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;
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;
相关文章推荐
- [转载]关于数据库的一些基本知识
- domino数据库存取控制列表(acl)基本知识_lotus notes
- 【黑马程序员】数据库基本知识
- 数据库基本知识
- 数据库基本知识
- 数据库基本知识(包括视图、触发器、存储过程、DTS等等)【转载】
- 数据库基本知识、操作
- 数据库基本知识梳理
- 数据库开发基本操作-SQL Server数据库基础知识
- oracle 数据库基本知识
- Domino数据库存取控制列表(ACL)基本知识
- mysql 数据库基本知识
- 数据库的基本知识
- 一 数据库基本理论知识
- PHP学习笔记(2)--PHP数据库操作基本知识
- Visual C# 2008+SQL Server 2005 数据库与网络开发--4.1.1 数据库基本知识
- 数据库基本知识
- 数据库基本知识
- 数据库基本知识
- 数据库基本知识