九 数据库基础
9.1什么是数据库
严格地说,数据库是“按照数据结构来组织、存储和管理数据的仓库”。在经济管理的日常工作中,常常需要把某些相关的数据放进这样的“仓库”,并根据管理的需要进行相应的处理。例如,企业或事业单位的人事部门常常要把单位职工的基本情况(职工号、姓名、年龄、性别、籍贯、工资、简历等)存放在表中,这张表就可以看成一个数据库。有了这个“数据仓库”我们就可以根据需要随时查询某职工的基本情况,也可以查询工资在某个范围内的职工人数等等。这些工作如果都能在计算机上自动进行,那我们的人事管理就可以达到极高的水平。此外,在财务管理、仓库管理、生产管理中也需要建立众多的这种“数据库”,使其可以利用计算机实现财务、仓库、生产的自动化管理。
9.2 常用的数据库管理系统软件
微软: Sql Server和Access
瑞典MySQL: MySql
IBM公司: DB2和Informix
美国Sybase公司: Sybase
美国Oracle公司: Oracle
9.3 数据库的基本结构
1)数据库管理系统(DataBase Management System,DBMS)是一种系统软件,有一个互相关联的数据集合和一组访问数据的程序构成,简言之,就是管理数据库的系统。数据库管理系统的基本目标是提供一个可以方便有效地存取数据库信息的环境。
2)数据库系统(DataBase System,DBS)是一个实际可运行的系统,可以对系统提供的数据进行存储、维护和应用,它是由存储介质、处理对象和管理系统共同组成的集合体,通常由软件、数据库以及数据库管理员组成。
3)数据库管理员(DataBase Administrator,DBA)是指在数据库系统中负责创建、监控和维护整个数据库的专业管理人员。
4)SQL(Structured Query Language)结构化查询语言是只能被数据库识别的指令,但是在程序中,可以利用其它编程语言组织SQL语句发送给数据库,数据库再执行相应的操作。
5)SQL语言主要由以下四部分组成:
A:DML:数据操作语言,用来插入、修改和删除数据库中的数据,如INSERT、UPDATE、 DELETE等。
B:DDL:数据定义语言,用来建立数据库、数据库对象,定义数据表结构等,大部 分都是以CREATE开头的命令,如CREATE TABLE、CREATE VIEW及DROP TABLE等。
C:DQL:数据查询语言,用来对数据库中的数据进行查询,如SELECT等,这个使用 最多。
E:DCL:数据控制语言,用来控制数据库组件的存取许可、存取权限等,如GRANT、 REVOKE等。
6)SQLyog:是一款简洁高效、功能强大的MySQL数据库管理工具。优点是易用、简洁、图形化。
7)常用的数据类型:
A:数值类型:tinyint非常小的整型,int最常用的整型,double浮点型,decimal精 度高常用于货币。
B:字符类型:char长度固定检索快,varchar长度可变省空间,text长文本。
C:日期类型:datetime和timestamp时间戳。
9.4 数据的基本特点
1、实现数据共享
数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接口使用数据库,并提供数据共享。
2、减少数据的冗余度
同文件系统比,数据库实现了数据共享,从而避免了用户各自建立应用文件。减少了大量重复数据,减少了数据冗余,维护了数据的一致性
3、数据实现集中控制
文件管理方式中,数据处于一种分散的状态,不同的用户或同一用户在不同处理中其文件之间毫无关系。利用数据库可对数据进行集中控制和管理,并通过数据模型表示各种数据的组织以及数据间的联系。
4、数据一致性和可维护性,以确保数据的安全性和可靠性。
5、故障恢复
9.5 Mysql
– 建表语句
create table user_lf(
id int(9) primary key,
username varchar(18) unique,
pwd char(6),
salary double(9,2),
registDete date
);
–查询语句
select * from user_lf;
–插入数据
insert into user_lf values(1001,‘刘凡’,123456,8888.88,null);
insert into user_lf(id,username,pwd,salary)
values(1002,‘张三’,445451,1111.11);
insert into user_lf values(1003,‘李四’,796615,3333.33,null);
insert into user_lf values(1004,‘麻子’,854223,4444.44,null);
–修改数据
update user_lf
set username=‘赵小六’,pwd=125665,salary=10000
where id=1004;
–删除语句
delete from user_lf
where id=1004;
–新建表dept_lf
create table dept_lf(
deptno int(2) primary key,
dname varchar(20),
loaltion varchar(20)
);
–删除表
drop table dept_lf;
–插入数据
insert into dept_lf values(10,‘developer’,‘北京’);
insert into dept_lf values(20,‘account’,‘上海’);
insert into dept_lf values(30,‘sales’,‘广州’);
insert into dept_lf values(40,‘operations’,‘天津’);
–新建表emp_lf
create table emp_lf(
empno int(4),
enmae varchar(20),
job varchar(15),
salary double(7,2),
bonus double(7,2),
hiredate date,
mgr int(4),
deptno int(2)
);
show tables;
drop table emp_lf;
–插入数据
insert into emp_lf values(1001,‘张无忌’,‘Manager’,10000,2000,‘2018-7-23’,1005,10);
insert into emp_lf values(1002,‘刘小松’,‘Analyst’,8000,1000,‘2011-1-1’,1001,10);
insert into emp_lf values(1003,‘李天一’,‘Analyst’,9000,1000,‘2010-2-24’,1001,10);
insert into emp_lf values(1004,‘郭芙蓉’,‘programmer’,5000,null,‘2012-7-23’,1001,10);
insert into emp_lf values(1005,‘张三丰’,‘president’,15000,null,‘2000-1-1’,null,20);
insert into emp_lf values(1006,‘燕小六’,‘Manager’,5000,400,‘2005-7-23’,1005,20);
insert into emp_lf values(1007,‘陆无双’,‘clerk’,3000,500,‘2018-7-23’,1006,10);
insert into emp_lf values(1008,‘黄蓉’,‘Manager’,10000,2000,‘2007-2-2’,1005,20);
insert into emp_lf values(1009,‘韦小宝’,‘salesman’,4000,null,‘2018-6-23’,1008,30);
insert into emp_lf values(1010,‘郭靖’,‘salesman’,4500,500,‘2011-9-23’,1008,30);
select * from emp_lf;
–1. 计算员工的月薪和年薪 null代表无穷大 ,非空函数ifnull(bonus,0)
select enmae,salary ,(salary+ifnull(bonus,0))*12 as salary_year
from emp_lf
–2. 计算员工的月收入
select enmae,salary+ifnull(bonus,0) as salary_month
from emp_lf;
–3.机构中有哪些职位 去重:distinct
select distinct job
from emp_lf ;
–4.薪水高于10000元的员工数据
select *
from emp_lf where salary>10000;
–5.职位是Analyst的员工数据
select *
from emp_lf where job=‘Analyst’;
–6.薪水大于5000并且小于10000的员工数据?
– 入职是按在2011年的员工
– between 5000 and 10000 and salary not in(5000,10000) 在5000和10000之间不包含5000和10000
select *
from emp_lf where salary>5000 and salary<10000 ;
select *
from emp_lf where salary between 5000 and 10000 and salary not in(5000,10000) ;
select *
from emp_lf where hiredate between ‘2011-1-1’ and ‘2011-12-31’;
– 7.列出职位是Manager或者Analyt的员工
select empno,enmae,job
from emp_lf where job=‘Manager’ or job=‘Analyst’;
– 8.列出职位种有sales字符的员工数据 模糊查询 like
select empno,enmae
from emp_lf
where job like ‘%sales%’; --‘张_’
–9查询哪些员工没有奖金
select empno,enmae,bonus
from emp_lf
where bonus is null;
– 哪些员工有奖金
select empno,enmae,bonus
from emp_lf
where bonus is not null;
– 单表查询语句
– 加薪 Analyst:10% programmer:5% clerk:2% 其他职位:不变。
select enmae,salary,job,
case job when ‘Analyst’ then salary1.1
when ‘programmer’ then salary1.05
when ‘clerk’ then salary*1.02
else salary
end new_salary
from emp_lf;
– 排序: order by asc (升序) desc(降序)
– 2.薪水由高到低排序
select *
from emp_lf
order by salary desc;
– 3.按入职时间排序,入职时间越早排在前面
select *
from emp_lf
order by hiredate desc;
– 4.按照部门排序,同一部门按薪水由高到底排序
select *
from emp_lf
order by deptno asc ,salary desc;
– 组函数 count/avg/sum/max/min 忽略空值
– 5.员工表种有多少条记录?统计:count
select count(empno)
from emp_lf;
– 6.计算员工的平均薪资和薪资的总和
select sum(salary),avg(salary)
from emp_lf;
– 7.计算员工的最高薪水和最低薪水
select max(salary) as MaxSalary,min(salary) as MinSalary
from emp_lf;
– 8.计算员工最早和最晚的入职时间
select max(hiredate) as 最晚 ,min(hiredate) as 最晚
from emp_lf;
– 9.按部门计算每个部门的最高和最低薪水分别是多少
select deptno,max(salary) as MaxSalary,min(salary) as MinSalary
from emp_lf group by deptno;
– 10.计算每个部门的薪水总和和平均薪水?
select deptno,sum(salary) as 部门薪水综合 ,avg(salary) as 部门平均薪水
from emp_lf group by deptno;
– 11.每个部门的统计信息:格式如下
– deptno max_s min_s sum_s avg_s emp_num
– 10 1000 5000 23000 6789 3
select deptno,max(salary) as 部门最高薪水,min(salary) as 部门最低薪水,sum(salary) as 部门薪水综合 ,avg(salary) as 部门平均薪水,count(empno) as 部门总人数
from emp_lf group by deptno;
– 12.按职位分组,每个职位最高,最低薪水和人数
select job,max(salary) as 职位最高薪水,min(salary) as 职位最低薪水,count(empno) as 职位总人数
from emp_lf group by job;
– 13. 平均薪水大于5000的部门数据?
select deptno,max(salary) as 部门最高薪水,min(salary) as 部门最低薪水,sum(salary) as 部门薪水综合 ,avg(salary) as 部门平均薪水,count(empno) as 部门总人数
from emp_lf group by deptno
having avg(salary)>5000;
– 14. 薪水综合大于20000元的部门数据
select deptno,max(salary) as 部门最高薪水,min(salary) as 部门最低薪水,sum(salary) as 部门薪水综合 ,avg(salary) as 部门平均薪水,count(empno) as 部门总人数
from emp_lf group by deptno
having sum(salary)>20000;
– 15. 那些职位的人数超过两人
select job,count(job) as 职位人数
from emp_lf
group by job
having count(job)>=2
order by count(job) desc;
– 总结 执行顺序
– select 。。。。
– from 表名
– where 条件
– group by 列名
– having 组函数的条件筛选
– order by 条件 升序,降序
–子查询(查询语句的嵌套)
– 1.查询最高薪水是谁
select enmae
from emp_lf
where salary=(select max(salary) from emp_lf );
– 薪水最低的是谁
select enmae
from emp_lf
where salary=(select min(salary) from emp_lf);
– 2.谁的薪水比张无忌高 大于最大:多行 运算符
select enmae
from emp_lf
where salary >ALL (select salary from emp_lf where enmae=‘张无忌’);
– 3.谁和刘小松 同部门?列出除了刘小松之外的员工名字
select enmae
from emp_lf
where deptno in(select deptno from emp_lf where enmae=‘刘小松’) and enmae!=‘刘小松’;
– 4.每个部门拿最高薪水的是谁
‘-select deptno,salary,enmae
from emp_lf
where (deptno,salary)in(
select deptno, max(salary)
from emp_lf
group by deptno);
– 5.哪个部门的人数比部门30的人数多?
select deptno,count()
from emp_lf
group by deptno
having count() > (
select count(*)
from emp_lf
where deptno=30
group by deptno);
– 6.哪个部门的平均薪水比部门30的平均薪水高?
select deptno,avg(salary)
from emp_lf
group by deptno
having avg(salary) > (
select avg(salary)
from emp_lf
where deptno=30
group by deptno);
– 7.列出员工的名字和职位,这些员工所在的部门平均薪水大于5000元
select enmae,job
from emp_lf
where deptno in(select deptno from emp_lf group by deptno having avg(salary)>5000 );
– 8.谁是张无忌的下属
select *
from emp_lf
where mgr=(select empno from emp_lf where enmae=‘张无忌’);
– 9.研发部有那些职位
select job
from emp_lf
where deptno=(select deptno from dept_lf where dname=‘developer’);
十 JDBC
10.1 JDBC概述
JDBC是一种可用于运行SQL语句的JavaAPI(ApplicationProgrammingInterface。应用程序设计接口)。
通过使用JDBC,开发者能够非常方便地将SQL语句传送给差点儿不论什么一种数据库。
也就是说,开发者能够不必写一个程序訪问Sybase,写还有一个程序訪问Oracle。再写一个程序訪问Microsoft的SQLServer。
用JDBC写的程序能够自己主动地将SQL语句传送给对应的数据库管理系统(DBMS)。不但如此,使用Java编写的应用程序能够在不论什么支持Java的平台上执行,不必在不同的平台上编写不同的应用。Java和JDBC的结合能够让开发者在开发数据库应用时真正实现“WriteOnce。RunEverywhere。”
Java具有健壮、安全、易用等特性。并且支持自己主动网上下载,本质上是一种非常好的数据库应用的编程语言。它所须要的是Java应用怎样同各种各样的数据库连接,JDBC正是实现这样的连接的关键。
JDBC扩展了Java的能力。如使用Java和JDBCAPI就能够发布一个Web页,页中带有能訪问远端数据库的Applet。或者企业能够通过JDBC让所有的职工(他们能够使用不同的操作系统。如Windwos。Machintosh和UNIX)在Intranet上连接到几个全球数据库上,而这几个全球数据库能够是不同样的。随着越来越多的程序开发者使用Java语言。对Java訪问数据库易操作性的需求越来越强烈。
JDBC API定义了一组用于与数据库通信的接口和类。
这些接口和类位于java.sql包中。
JDBC是用来(让我们的程序)通过网络来操作数据库的,作用非常重要;JDBC技术也是Java核心技术之中的一个。
10.2 JDBC操作数据库步骤
通过JDBC操作数据库——步骤:
第1步:注冊驱动 (仅仅做一次)
第2步:建立连接(Connection)
第3步:创建运行SQL的语句(Statement)
第4步:运行语句
第5步:处理运行结果(ResultSet)
第6步:释放资源
1)使用JDBC第一步:载入驱动
注冊驱动有三种方式:
2)使用JDBC第二步:建立连接
通过Connection建立连接,Connection是一个接口类。其功能是与数据库进行连接(会话)。
建立Connection接口类对象:
Connection conn =DriverManager.getConnection(url, user, password);
当中URL的格式要求为:
JDBC:子协议:子名称//主机名:port/数据库名?属性名=属性值&…
如:"jdbc:mysql://localhost:3306/test“
user即为登录数据库的username,如root
password即为登录数据库的密码,为空就填””
3)使用JDBC第三步:创建运行对象
运行对象Statement负责运行SQL语句。由Connection对象产生。
Statement接口类还派生出两个接口类PreparedStatement和CallableStatement, 这两个接口类对象为我们提供了更加强大的数据訪问功能。
创建Statement的语法为:
Statement st = conn.createStatement();
4)使用JDBC第四步:运行SQL语句
运行对象Statement提供两个经常使用的方法来运行SQL语句。
executeQuery(Stringsql),该方法用于运行实现查询功能的sql语句。返回类型为 ResultSet(结果集)。
如:ResultSet rs =st.executeQuery(sql);
executeUpdate(Stringsql),该方法用于运行实现增、删、改功能的sql语句,返 回类型为int,即受影响的行数。
如:int flag = st.executeUpdate(sql);
5)使用JDBC第五步:处理运行结果
ResultSet对象
ResultSet对象负责保存Statement运行后所产生的查询结果。
结果集ResultSet是通过游标来操作的。
游标就是一个可控制的、能够指向随意一条记录的指针。
有了这个指针我们就能轻易地指出我们要对结果集中的哪一条记录进行改动、删 除,或者要在哪一条记录之前插入数据。一个结果集对象中仅仅包括一个游标。
6)使用JDBC 第六步——释放资源
Connection对象的close方法用于关闭连接,并释放和连接相关的资源。