一.Oracle 数据库名称 公司的名称(甲骨文)
神谕
优点:
1.适合管理大批量的数据
2.数据有安全保障
3.查找数据效率高
4.支持多用户同时访问
关于客户端/服务器 client/server
Oracle 企业版 快捷版(XE)
数据中存储数据的单位 "表" table
table 结构是 行 Row ,列 Column
table Student
name age sex
sunls 35 男
...
二.使用Oracle数据库
客户端:
1.命令行工具(sqlplus)
SQL 是管理数据库数据的一种语言,结构化查询语言的简称。
2.web 界面的管理工具
在浏览器上输入地址:
http://localhost:8080/apex
3.plsql(第三方工具访问)
4.查询命令
//查询数据库用户中是否有表
select table_name from user_tables;
desc 表名 (非sql命令)
1)基本语法
select 列名1,列名2,...列名n from 表名;
(sql 语句中不区分大小写,后面必须写“;”)
select employee_id from employees;
select employee_id,first_name from employees;
select * from employees;
*代表表中的所有列
*缺点:可能查出不需要的列
2)表别名
select employee_id,first_name from employees;
select e.employee_id,e.first_name from employees e;
语法:
from 表 表别名;
3)列别名
select employee_id empId,first_name name from employees;
select 列 列别名
4)where(条件查询)
select * from employees where employee_id=179;
等于 =
大于 >
大于等于 >=
不等于 != ,<>
逻辑运算符
逻辑与 逻辑或 逻辑非
and or not
//工资大于5000的所有员工信息
select * from employees where salary >5000;
//工资在2000-6000之内的所有员工信息
select * from employees where 5000>salary>2000;//error!
select * from employees where salary>2000 and salary<6000;
//查询员工first_name 叫 james的员工信息
select * from employees where first_name='James';
对于字符串
1)用单引号''表示字符串
2)严格区分大小写。
运算符
//工资在2000-6000之内的所有员工信息
between... and...
select * from employees where salary between 2500 and 6000;
1)小值放在前面
2)包括了=条件
in(值列表 ) in(值1,值2...)
//查询 员工部门为50和60员工信息
select * from employees where department_id=50 or department_id=60;
select * from employees where department_id in(50,60);
like(模糊查询)
//first_name 以 'J'开头的员工
select * from employees where first_name like 'J%';
//first_name 中含有m的员工信息
select * from employees where first_name like '%m%';
//first_name 中第二个字母为a的员工信息
select * from employees where first_name like '_a%';
//first_name 中第二个字母为a且 只有四个字符组成的员工信息
select * from employees where first_name like '_a__';
特殊表:
dual表,只有一行一列
+ - * /
算数函数:
求余数:mod(10,3)
select mod(10,3) from employees;
select mod(10,3) from dual;
select 100+200 from dual;
求绝对值:abs(-1)
select abs(-1) from dual;
随机数:dbms_random.random()
select dbms_random.random() from dual;
日期函数:
to_char(date,'时间的格式字符串')
将日期按照指定的格式转化成字符串
--年--rr,yyyy,year
--月--mm,mon,month
--日--dd,ddsp,ddth,ddspth
--星期--d,dy,day
--小时--hh am. hh24
--分钟--mi
--秒--ss
比较大小:日期只能和日期比较
字符串只能和字符串比较
to_date(str,'时间的格式字符串')
将字符串按照时间格式转化成DB中承认的date类型值
查询详细时间
select to_char(hire_date,'yyyy-mm-dd,day hh24:mi:ss') from employees;
找到1981年入职的员工
解决思路1: (比较字符串)
select * from employees where to_char(hire_date,'yyyy') = '1981';
解决思路2: (比较日期)
select * from employees where hire_date between to_date('1998-01-01','yyyy-mm-dd')
and to_date('1998-12-31','yyyy-mm-dd');
求字符串长度:length('')
select length(phone_number) from employees;
null值:
select * from employees where commission_pct is not null;
select * from employees where commission_pct is null;
排序: order by
asc 升序(默认)
desc 降序
select .... from .... order by 排序条件(字段名,别名) [asc(默认)/desc]
按照入职时间排序
select * from employees order by hire_date [asc(默认)/desc];
多列排序:
select .... from .... order by 字段1,字段2... [asc(默认)/desc]
先根据字段1排序,若字段1相等,则按照字段2排序
组函数:
1.常见
avg() ---平均值
select avg(salary) from employees;
sum() ---求和
select sum(salary) from employees;
max() ---最大值
select max(salary) from employees;
min() ---最小值
count()--计数器、统计总数
select count(salary) from employees;
select count(commission_pct) from employees;
select count(*) from employees;
注意:count(),只统计有效数据,即非空值。
分组语句: group by
select ... from ... where ... group by ... order by ...
各部门的平均工资:
select department_id,avg(salary) from employees group by department_id;
group by 语法规定: 首尾呼应、前后一致
1) 只有出现在group by里的字段,才能出现在select后面和order by的子句中;
2) 没有出现在group by里的字段,只有配合组函数才能出现在select和order by里面;
3) 如果在group by里的字段应用了单行函数,那么在select后面和order by子句中也要用同样的单行函数
分组条件查询: having
平均工资大于10000的部门
select department_id,avg(salary) from employees group by department_id having avg(salary) > 10000;
执行的顺序:
1.from --确定来源表
2.where--对基础数据的筛选
3.group by--分组
4.having--对分组数据的在筛选
5.select--查询
6.order by --对查询结果的排序
表连接: 左外连接 left [outer] join......on......
select * from Employees left join departments
on employees.Department_Id = departments.department_id
where employees.employee_id = 160;
5.建表
create table 表名(
列名1 数据类型,
列名2 数据类型,
列名3 数据类型,
列名4 数据类型
);
create table yueh_student(
s_number number(10) primary key,
name varchar2(10) not null unique,
age number(5) unique,
sex varchar2(2) check(sex in('1','2')),--1代表 男 2 代表女
score number(10),
zip_code number(10) check(length(zip_code)==6),
email varchar2(6) not null,
address varchar2(10),
birthday date,
teacher_id number references yueh_teacher(id)
);
create table yueh_teacher(
id number
);
学生编号
姓名
年龄
性别
成绩
邮编
邮箱
住址
生日
6.常见的数据类型
number 数字类型
varchar2 字符串类型 它的长度表示最多能够存储的英文字符数
char 字符串 定长的
varchar2(5) abc
char(5) abc__
date 日期类型
7.约束
一种语法:用来保证数据的有效性和完整性
主键约束: primary key 用来保证某一列的取值唯一且不为空
注意:每张表只允许有一个主键
非空约束: not null 用来保证这一列数据必须赋值
唯一约束: unique 用来保证这一列的取值唯一
检查约束:check(length(zip_code)==6)
外键(foreign key)约束:保证两个列的数据必须匹配,有关联关系
references
三.练习
CREATE TABLE F_CLIENT( ID NUMBER(12) PRIMARY KEY,--用户编号 USERNAME VARCHAR2(20) NOT NULL,--用户姓名 CLIENT_CERTIFICATE_NO VARCHAR2(20) NOT NULL UNIQUE,--证件号码 BORN_DATE DATE,--出生日期 FAMILY_REGISTER_ADDRESS VARCHAR2(200),--家庭住址 NOW_ADDRESS VARCHAR2(200) NOT NULL,--现在住址 CONTACT_MODE VARCHAR2(50) NOT NULL,--联系方式 URGENCY_CONTACT_MODE VARCHAR2(50) NOT NULL,--紧急联系方式 CREATE_DATE DATE NOT NULL--创建时间 ); insert into F_CLIENT values(1,'sawyer','1593224056',TO_DATE('1980-10-10','yyyy-mm-dd'),'北京市海淀区东北旺','peaking','123456789','987654321',sysdate); insert into F_CLIENT values(2,'yangly','1593224057',TO_DATE('1980-10-11','yyyy-mm-dd'),'北京市海淀区东北旺','peaking','123456789','987654321',sysdate); insert into F_CLIENT values(3,'gaozhy','1593224058',TO_DATE('1980-12-12','yyyy-mm-dd'),'湖北省洪山区黄家湖','shanghai','123456789','987654321',sysdate); insert into F_CLIENT values(4,'wangmj','1593224059',TO_DATE('1980-04-13','yyyy-mm-dd'),'湖北省洪山区黄家湖','hubei','123456789','987654321',sysdate); insert into F_CLIENT values(5,'lijing','1593224060',TO_DATE('1980-07-14','yyyy-mm-dd'),'湖北省洪山区黄家湖','tianjing','123456789','987654321',sysdate); insert into F_CLIENT values(6,'wangpl','1593224061',TO_DATE('1980-09-15','yyyy-mm-dd'),'北京市朝阳区百子湾','peaking','123456789','987654321',sysdate); insert into F_CLIENT values(7,'lixiao','1593224062',TO_DATE('1980-09-16','yyyy-mm-dd'),'北京市朝阳区百子湾','henan','123456789','987654321',sysdate); insert into F_CLIENT values(8,'zhaoyf','1593224063',TO_DATE('1980-07-17','yyyy-mm-dd'),'北京市海淀区五道口','henan','123456789','987654321',sysdate); insert into F_CLIENT values(9,'suyibo','1593224064',TO_DATE('1980-09-18','yyyy-mm-dd'),'北京市海淀区东北旺','hebei','123456789','987654321',sysdate); insert into F_CLIENT values(10,'luojh','1593224065',TO_DATE('1980-09-19','yyyy-mm-dd'),'北京市朝阳区百子湾','heilongjiang','123456789','987654321',sysdate); insert into F_CLIENT values(11,'mazhb','1593224066',TO_DATE('1980-08-10','yyyy-mm-dd'),'北京市海淀区东北旺','peaking','123456789','987654321',sysdate); insert into F_CLIENT values(12,'gaohf','1593224067',TO_DATE('1980-08-18','yyyy-mm-dd'),'北京市朝阳区百子湾','peaking','123456789','987654321',sysdate); insert into F_CLIENT values(13,'chenb','1593224068',TO_DATE('1980-08-13','yyyy-mm-dd'),'北京市海淀区西二旗','peaking','123456789','987654321',sysdate); --一.运行以上语句,创建客户表,完成以下操作。 --1)查询所有客户 select * from F_CLIENT; --2)查询所有客户的编号以及证件号码 select ID,CLIENT_CERTIFICATE_NO from F_CLIENT; --3)打印所有的用户名及出生日期 select username,born_date from F_CLIENT; --4)查询所有住在‘北京市海淀区东北旺’的用户的名称、出生日期以及现在住址 select username,born_date,FAMILY_REGISTER_ADDRESS from F_CLIENT where FAMILY_REGISTER_ADDRESS='北京市海淀区东北旺'; --5)查询所有现居住在‘peaking’的用户 select username,born_date,FAMILY_REGISTER_ADDRESS from F_CLIENT where FAMILY_REGISTER_ADDRESS='peaking'; --6)查询所有证件号码尾数小于‘7’的用户 select * from F_CLIENT where substr(CLIENT_CERTIFICATE_NO,length(CLIENT_CERTIFICATE_NO),length(CLIENT_CERTIFICATE_NO))<7; --7)查询所有证件号码尾数大于‘6’且家庭住址在‘北京市海淀区东北旺’的用户 select * from F_CLIENT where substr(CLIENT_CERTIFICATE_NO,length(CLIENT_CERTIFICATE_NO),length(CLIENT_CERTIFICATE_NO))>6 and FAMILY_REGISTER_ADDRESS = '北京市海淀区东北旺'; --8)查询所有出生在‘1980-07-15’到‘1980-09-15’之间的用户 select * from F_CLIENT where BORN_DATE between to_date('1980-07-15','yyyy-mm-dd') and to_date('1980-09-15','yyyy-mm-dd'); --8)查询所有住在‘北京市海淀区’的用户 select * from F_CLIENT where FAMILY_REGISTER_ADDRESS like '%北京市海淀区%'; --9)查询所有证件号码以‘7’结尾的用户 select * from F_CLIENT where CLIENT_CERTIFICATE_NO like '%7'; --经营信息表 CREATE TABLE F_OPERATION( ID NUMBER(12) PRIMARY KEY,--资产编号 CLIENT_ID NUMBER(12) REFERENCES F_CLIENT(ID),--用户编号 OPERATE_INFOMATION_DESCRIBE VARCHAR2(120) NOT NULL,--资产信息描述 POSSESS_SHAREHOLDING NUMBER(4,2) NOT NULL,--持股比例 OPERATE_ADDRESS VARCHAR2(50) NOT NULL,--经营地址 YEAR_AVG_INCOME VARCHAR2(50) NOT NULL,--年收入 BEGIN_OPERATION_TIME DATE NOT NULL,--开始经营日期 EMPLOYEES_AMOUNT NUMBER(6) NOT NULL,--员工总数 LEGAL_PERSON_NAME VARCHAR2(20) NOT NULL,--法人姓名 LEGAL_PERSON_CRD_NUMBER VARCHAR2(50) NOT NULL,--法人证件号码 OPERATE_CRD_NUMBER VARCHAR2(50) NOT NULL,--经营证件号码 UPDATE_TIME DATE NOT NULL--更新时间 ) insert into F_OPERATION values(1,1,'是一份资产的信息',0.33,'北京市海淀区东北旺','10000000',TO_DATE('1999-09-10','yyyy-mm-dd'),100,'yangll','1567843925','1567843925',sysdate); insert into F_OPERATION values(2,2,'是一份资产的信息',0.50,'北京市海淀区西二旗','100000000',TO_DATE('1999-04-17','yyyy-mm-dd'),500,'yangdd','1567678978','1567678978',sysdate); insert into F_OPERATION values(3,1,'是一份资产的信息',0.20,'北京市海淀区东北旺','15000000',TO_DATE('1999-09-18','yyyy-mm-dd'),70,'yangmm','15468756778','15468756778',sysdate); insert into F_OPERATION values(4,2,'是一份资产的信息',0.16,'湖北省洪山区黄家湖','18000000',TO_DATE('1999-10-20','yyyy-mm-dd'),10,'wangss','68743368594','68743368594',sysdate); insert into F_OPERATION values(5,4,'是一份资产的信息',0.09,'北京市海淀区东北旺','10000000',TO_DATE('1997-09-05','yyyy-mm-dd'),120,'sangbb','47389434043','47389434043',sysdate); insert into F_OPERATION values(6,1,'是一份资产的信息',0.05,'湖北省洪山区黄家湖','100000000',TO_DATE('1999-06-13','yyyy-mm-dd'),1000,'lihh','90893472119','90893472119',sysdate); insert into F_OPERATION values(7,7,'是一份资产的信息',0.50,'北京市海淀区东北旺','10000000',TO_DATE('1998-08-19','yyyy-mm-dd'),19,'hehe','15654783034','15654783034',sysdate); insert into F_OPERATION values(8,13,'是一份资产的信息',0.70,'北京市朝阳区百子湾','1000000',TO_DATE('1999-09-10','yyyy-mm-dd'),40,'heihei','15678445645','15678445645',sysdate); insert into F_OPERATION values(9,4,'是一份资产的信息',1.00,'北京市海淀区东北旺','1000000',TO_DATE('1999-09-10','yyyy-mm-dd'),80,'hahaha','15098239749','15098239749',sysdate); --运行以上语句,创建资产表,完成以下操作。 --1)查询所有经营信息 select * from F_OPERATION; --2)查询所有1号客户的经营信息 select * from f_operation where CLIENT_ID=1; --3)查询所有1号客户且年收入大于10000000的经营信息 select * from f_operation where client_id=1 and YEAR_AVG_INCOME>10000000; --4)查询所有位于‘北京市海淀区东北旺’的经营信息 select * from f_operation where OPERATE_ADDRESS='北京市海淀区东北旺'; --5)查询所有持股比例大于0.20的经营信息 select * from f_operation where POSSESS_SHAREHOLDING>0.20; --6)查询所有2号客户的经营信息,以及他的年收入 select * from f_operation where client_id = 2; select YEAR_AVG_INCOME from f_operation where client_id = 2; --7)查询所有位于‘黄家湖’的经营信息 select * from f_operation where OPERATE_ADDRESS like '%黄家湖%'; --8)查询所有成立于1999年的经营信息 select * from f_operation where BEGIN_OPERATION_TIME between to_date('1999-01-01','yyyy-mm-dd') and to_date('1999-12-31','yyyy-mm-dd'); --8)查询所有法人姓名以‘yang’开头的经营信息 select * from f_operation where LEGAL_PERSON_NAME like 'yang%'; --9)查询年收入最高的经营信息 select * from f_operation where YEAR_AVG_INCOME=(select max(YEAR_AVG_INCOME) from f_operation); --10)查询所有的经营信息以及其所属的客户 select * from f_operation f left join f_client c on f.client_id=c.id; --11)查询所有1号客户的信息以及经营信息 select * from f_operation f left join f_client c on f.client_id=c.id where c.id=1; --资产表 CREATE TABLE F_ASSET( ID NUMBER(12) PRIMARY KEY,--资产编号 CLIENT_ID NUMBER(12) FOREIGN KEY REFERENCES F_CLIENT(ID),--用户编号 ASSET_NAME VARCHAR2(20) NOT NULL,--资产名称 ASSET_DESCRIBE VARCHAR2(150),--资产简介 ASSET_ADDRESS VARCHAR2(150) NOT NULL,--资产所在地 ASSET_CREDENTIALS_NAME VARCHAR2(50) NOT NULL,-- ASSET_CREDENTIALS_NUMBER VARCHAR2(50) NOT NULL, ASSET_MARKET_VALUATION NUMBER(12,2) NOT NULL, PLEDGE NUMBER(1) NOT NULL, UPDATE_TIME DATE NOT NULL--更新日期 ) --添加十条资产数据 --授信信息表 CREATE TABLE F_CREDIT( ID NUMBER(12) PRIMARY KEY, CLIENT_ID NUMBER(12) REFERENCES F_CLIENT(ID),--用户编号 NOW_CREDIT_LIMIT NUMBER(11,2) NOT NULL, FROZEN_LIMIT NUMBER(11,2) NOT NULL, LIMIT_SPACE NUMBER(11,2) NOT NULL, UPDATE_TIME DATE NOT NULL ) -- 学生表 : create table y_student( id number(10) primary key, sname varchar2(20) not null, spass varchar2(20) not null check(length(spass)=8), sex varchar2(2) not null, email varchar2(20), zip_code number(10) check(length(zip_code)=6), address varchar2(20), );