哥也是Oracle数据库的初学者,总结了一份Oracle数据库的的课堂笔记,共享给通道中者。
一.数据库的定义(DataBase:DB)
1.历史
2.数据库产品
Oracle, DB2(IBM), Sybase(Sybase)
sql server(微软), mysql(Oracle)
access
3.数据库是存放数据/访问数据/维护数据的存储仓库.
4.数据库软件由两部分组成:数据存储的仓库/管理系统(DBMS:Database Managment System)
5.数据库中数据的主要载体: 表(Table)
二维表:横向:行,记录(record)
纵向:域,列(column)
二.数据库的简单操作
1.连接数据库的方式
1)远程登录到数据库服务器:
C:>telnet 192.168.0.26
openlab/open123
2)使用数据库的工具sqlplus连接到数据库
$ sqlplus openlab/open123
sqlplus:数据库的客户端命令行工具.
用户和数据库的沟通工具.
2.创建一个用户表,存放考生信息.
SQL> create table users_ninglj(
id number,
password char(4),
name char(20),
phone char(11),
email char(30)
);
1)关键字:create table
2)表名:users_ninglj自定义,不超过30个字符
3)列名:id/password/name/phone/email自定义
4)数据类型:number:数字,char:字符串
5)以分号结束
6)每个列之间用逗号隔开,最后一个列没有逗号.
SQL:Structured Query Language
结构化查询语言
和数据库沟通的途径
3.增加数据到表users_ninglj中.
insert into users_ninglj
values(1001, '1234', 'liucs',
'13600000000','liucs@tarena.com.cn')
;
insert into users_ninglj
values(1002, '1234', 'zhangwuji',
'13700000000','zwj@tarena.com.cn')
;
insert into users_ninglj
values(1003, '1234', 'zhaomin',
'13800000000','zm@tarena.com.cn')
;
insert into users_ninglj
values(1004, '1234', 'tom',
'13900000000','tom@sina.com')
;
4.查询刚刚增加的数据:
select * from users_ninglj;
5.调整格式:
SQL指令,只在sqlplus工具中有用
SQL>column 列名 format 格式
column name format a10 --10位字符
column id format 9999 --四位数字
col id for 9999 --简写形式
而SQL语句(create / insert / select)
在不同数据库中是通用的.
小结:语句的种类:
1.create: 创建语句
2.insert into 表名 values(列数据);
插入语句(新增语句)
3.select * from 表名; 查询语句
查询是否有1001/1234的用户:
select name from users_ninglj
where id = 1001 and password = '1234';
常用的数据类型:
数字类型: number
number(4): 最多4位数字
number(7,2):共7为,2位小数
99999.99
字符类型: char : 定长字符串
char(10)占据10个长度的空间
不管数据多长,都占据10个长度
varchar :变长字符串
varchar(10):根据字符数据的 实际长度决定空间大小.
varchar2:变长字符串
oracle独有的
create table myuser(
id number(4),
name char(10),
email varchar(20)
);
insert into myuser
values(1, 'tom', 'tom@sina.com');
日期:date 7位日期数据
java取系统时间:
Calendar.getInstance();
oracle取系统时间:
select sysdate from dual;
默认格式: 08-OCT-11
DD-MON-RR , 不是YY
当前年: 11年(2011年)
YY RR
08年 2008 2008
95年 2095 1995
当前年: 95年(1995年)
01年 1901 2001
98年 1998 1998
6.创建数据结构,新增数据,为下一步的学习准备数据资料.
CREATE TABLE DEPT_ning (DEPTNO NUMBER(2) PRIMARY KEY,
DNAME VARCHAR2(14) ,LOC VARCHAR2(13) ) ;
INSERT INTO DEPT_ning VALUES(10,'研发部','北京');
INSERT INTO DEPARTMENT_ning VALUES (20,'财务部','上海');
INSERT INTO DEPT_ning VALUES(30,'销售部','广州');
INSERT INTO DEPT_ning VALUES(40,'后勤部','天津');
--删除表结构
drop table emp_ning;
--创建表结构
create table emp_ning(
id number(4),
name varchar2(20),
job varchar2(20),
salary number(7,2),
bonus number(7,2),
hiredate date,
mgr number(4),
deptno number(2)
);
insert into emp_ning values(1001, '张无忌', 'Manager', 10000, 2000, '12-MAR-10', 1005, 10);
insert into emp_ning values(1002, '刘苍松', 'Analyst', 8000, 1000, '01-APR-11', 1001, 10);
insert into emp_ning values(1003, '李翊', 'Analyst', 9000, 1000, '11-APR-10', 1001, 10);
insert into emp_ning values(1004, '郭芙蓉', 'Programmer', 5000, null, '01-JAN-11', 1001, 10);
insert into emp_ning values(1005, '张三丰', 'President', 15000, null, '15-MAY-08', null, 20);
insert into emp_ning values(1006, '燕小六','Manager', 5000, 400, '01-FEB-09', 1005, 20);
insert into emp_ning values(1007, '陆无双','clerk', 3000, 500, '01-FEB-09', 1006, 20);
insert into emp_ning values(1008, '黄蓉','Manager', 5000, 500, '1-MAY-09', 1005, 30);
insert into emp_ning values(1009, '韦小宝','salesman', 4000, null, '20-FEB-09', 1008, 30);
insert into emp_ning values(1010, '郭靖','salesman', 4500, 500, '10-MAY-09', 1008, 30);
--奖金写错了,应该是800, 写成80
--更新数据的语句:
update emp_ning
set bonus = 800 where id = 1008;
--数字数据直接写,不用单引号
--字符和日期,用单引号.
--查询表的全部数据:
select * from emp_ning;
SQL>set linesize 300
SQL>set pagesize 100
SQL>col name for a15
SQL>col id for 9999
--复制表:
--已有表结构,只复制数据(emp_my表已存在,结构和emp_you相同)
SQL>insert into emp_my
select * from emp_you;
--复制表结构和数据(emp_myother表不存在)
SQL>create table emp_myother
as
select * from emp_you;
四.查询语句
1.计算员工的年薪?
select * from emp_ning;
select name, salary from emp_ning;
select name, salary, salary * 12
from emp_ning;
2.计算员工的月收入是多少?
select name, salary, bonus,
salary +
bonus sal_month
from emp_ning;
select name, salary, bonus,
salary + nvl(bonus,0) sal_month
from emp_ning;
nvl(bonus,0)
==> (bonus == null) ? 0 : bonus
使用nvl函数,更正空值计算出现的逻辑错误.
--凡是和空值计算的算术表达式,结果为空.
--数据库中任何数据类型都可以取null值
表示这个数据暂时没有.
insert into emp_ning values(1011, '余则成', null, null, null, null, null, 10);
java:只有引用类型数据,可以取null值
String name = null; //ok
List list = null; //ok
int i = null; //error
boolean f = null; //error
3.员工都分布在哪些部门?
select deptno from emp_ning;
--去除重复记录
select distinct deptno from emp_ning;
员工表中有多少种职位?
select job from emp_ning;--不去重
select distinct job from emp_ning;--去重
4.条件查询.
哪些员工的薪水>1w?
select name, salary from emp_ning
where salary > 10000;
--哪些员工的薪水在5000-10000之间
--闭区间:[5000, 10000]
select name, salary from emp_ning
where salary <= 10000
and salary >= 5000;
--可以简写为:
select name, salary from emp_ning
where salary between 5000 and 10000;
5.把员工按照薪水由低到高排序
--正序排序
select name, salary
from emp_ning
order by salary;
--倒序排序(由高到低) desc = descend
select name, salary
from emp_ning
order by salary desc;
空值被视作最大.
--按员工的入职时间排序,入职越早排在前面
select name, hiredate
from emp_ning
order by hiredate;
6.查询部门10或者部门20的员工
select *
from emp_ning
where deptno = 10
or deptno = 20
or deptno = 30
or deptno = 40
or deptno = 50;
--in:在列表中.
select * from emp_ning
where deptno in (10,20,30,40,50);
列出职位是Analyst或者Programmer的员工
select * from emp_ning
where job = 'Analyst'
or job = 'Programmer';
--或者写成:
select * from emp_ning
where job in ('Analyst','Programmer');
--SQL语句的大小写不敏感,比如:
select和SELECT一样
--数据大小写敏感.比如:
Analyst和analyst不一样
--查询所有的分析员:
select name, job from emp_ning
where lower(job) = 'analyst';
等价于:
select name, job from emp_ning
where upper(job) = 'ANALYST';
lower(job): job='AnaLyst'
==> job = 'analyst
select * from emp_ning
where
lower(job) in('analyst','programmer');
7.哪些员工的职位中包含'sales'?
--模糊查询
select name, job
from emp_ning
where job like '%sales%';