友情提示以下内容是对数据库以及相关知识所做的一个阐述,内容较多需多花费些各位看官宝贵时间,不过全是干货以及一些小的实例,我相信各位点进来的看官都会有所收获。
数据库介绍
什么是数据库?
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,
每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据。
RDBMS即关系数据库管理系统(Relational Database Management System)的特点:
- 1.数据以表格的形式出现
- 2.每行为各种记录名称
- 3.每列为记录名称所对应的数据域
- 4.许多的行和列组成一张表单
- 5.若干的表单组成database
RDBMS 术语
在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:
- 数据库: 数据库是一些关联表的集合。.
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
- 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
数据库是用来存放数据的。
数据库使用一个一个的表来存放数据。
数据库表与表之间的数据是有关系的。
现在的数据库都是关系型数据库。
主流的数据库:oracle、mysql、sqlserver、db2
Mysql安装
Win32的安装
注意选择编码为utf-8和把mysql的bin目录加入path,其他的一律下一步。
安装完成后,打开控制面板—管理工具—服务,可以查看mysql服务状态。
mysqld.exe是mysql服务启动程序
1G=1024M=1024*1024KB=1024*1024*1024B(byte)
Mysql服务属性中的启动类型
自动—计算机启动后自动启动mysql服务
手动—需要自己去启动mysql服务
Mysql bin目录下的MySQLInstanceConfig.exe可以重新修改配置
启动服务 net start 服务名
停止服务 net stop 服务名
注册服务 程序 –install
卸载服务 sc delete 服务名 (sc == service)
进入mysql控制台,mysql -uroot -p (u==username) (p==password)
退出mysql控制台, exit;
Mysql卸载
删除mysql安装版数据库的方法
1、运行mysql bin 目录下的MySQLInstanceConfig.exe删除数据库实例和服务
2、运行安装包,删除mysql数据库程序。
3、删除c盘Program Files中的mysql目录
4、删除c盘隐藏文件夹Program Data中的mysql目录
Mysql常用命令
创建数据库
create database 数据库名称;
删除数据库
drop database 数据库名称;
show databases;//查看有几个数据库。
use 数据库名;//使用某个数据库。
show tables;//查看有几个表
desc 表名字;//查看表结构
命令行输入ipconfig可以查看本机ip地址
Ip地址是用来区分主机的
端口号是用来区分应用的
Sql介绍
Structured query language结构化查询语言
SQL 对大小写不敏感
SQL 以分号结尾
可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL)。
查询和更新指令构成了 SQL 的 DML 部分:
- SELECT - 从数据库表中获取数据
- UPDATE - 更新数据库表中的数据
- DELETE - 从数据库表中删除数据
- INSERT INTO - 向数据库表中插入数据
SQL 中最重要的 DDL 语句:
-
- CREATE DATABASE - 创建新数据库
- ALTER DATABASE - 修改数据库
- CREATE TABLE - 创建新表
- ALTER TABLE - 变更(改变)数据库表
- DROP TABLE - 删除表
- CREATE INDEX - 创建索引(搜索键)
- DROP INDEX - 删除索引
sql作用:
- SQL 面向数据库执行查询
- SQL 可从数据库取回数据
- SQL 可在数据库中插入新的记录
- SQL 可更新数据库中的数据
- SQL 可从数据库删除记录
- SQL 可创建新数据库
- SQL 可在数据库中创建新表
- SQL 可在数据库中创建存储过程
- SQL 可在数据库中创建视图
- SQL 可以设置表、存储过程和视图的权限
RDBMS
Relational database management system关系数据库管理系统
创建表
create table 表名称(
列名称 列类型,
列名称 列类型,
列名称 列类型
) ;
插入数据
insert into 表名称 values(值1, 值2, 值3);
删除所有数据
delete from 表名称 ;
查询表的所有数据
select * from 表名称;
删除表
drop table 表名称;
表的约束
非空约束
create table stu(
no int not null,#规定no不能为空
name char(10),
age int
);
唯一约束
两种类型的唯一约束
unique key uk_no (no) 为no添加唯一约束,约束名称是uk_no
unique key uk_no_age (no, age) 为no和age添加唯一约束,约束的名字是uk_no_age,no和age放在一起不能与另外一条记录重复
注意unique key uk_no_age (no, age)和
unique key uk_no (no)
unique key uk_no (age)
有很大的区别
记录是指数据库表中的一行数据
为字段添加默认值
gender CHAR (1) DEFAULT '男'
主键是能够唯一标识一条记录的字段。
主键有两个特点,非空和唯一
任何一张表都有一个主键
主键是某一列
主键的作用是唯一标识一条记录
主键的使用方式:
PRIMARY KEY (NO)
可以设置某一列不为负值
age INT UNS IGNED NOT NULL
CREATE TABLE stu (
NO INT auto_increment,
NAME CHAR (10) NOT NULL,
age INT UNSIGNED NOT NULL,
gender CHAR (1) DEFAULT '男',
PRIMARY KEY (NO)
);
CREATE TABLE if not exists stu ( #如果不存在此表就创建表
插入数据时可以向指定列插入
insert into stu (name, age, gender) values('李四', 26, '女');
查询数据时可以只查询指定列的数据
select name,age from stu;
where条件查询
#查询编号为5的名称
select name from stu where no = 5;
#查询性别为'男'的学生
select * from stu where gender='男';
#查询性别不是男的学生
select * from stu where gender!='男';
#查询年龄小于20的学生
select * from stu where age<20;
#查询年龄大于20的女生
select * from stu where age >20 and gender='女';
更新数据
update stu set age = 20;#修改所有记录的年龄为20
update stu set age = 20 where name = '赵小四';#将姓名为赵小四的记录的年龄修改为20
update stu set age = 21,gender = '男';#修改所有记录的年龄为21,性别为男。
delete from stu where name='赵小四';#删除名称为赵小四的记录
select distinct(jg) from stu;#查询籍贯,去掉重复数据
select * from stu where age >=18 and age <=30; #查询年龄介于18到30岁之间的记录
select * from stu where age between 18 and 30;#查询年龄介于18到30岁之间的记录
select * from stu where age not between 18 and 30;#查询年龄不在18到30岁之间的记录
select * from stu where jg IS NULL;#查询籍贯是空的记录
select * from stu where jg IS NOT NULL;#查询籍贯不是空的记录
select * from stu where jg = '河北' or jg = '哈尔滨';#查询籍贯是河北和哈尔滨的记录
select * from stu where age in (18, 20, 21);#查询年龄为18,20,21的记录
select * from stu where age not in (18, 20, 21);#查询年龄不是18,20,21的记录
模糊查询
#%代表任意长度(0个、1个、多个)字符
#_匹配一个字符
name like '赵%';赵四 #以赵开头的
name like '%赵';小赵#以赵结尾的
name like '%赵%';赵四 小赵四 小赵 # 包含赵的
name like '赵_'; #以赵开头的两个字符的名字
排序
select * from stu order by age desc;降序 #按照年龄降序排列
select * from stu order by age asc;升序 #按照年龄升序排列
select * from stu order by claz asc,age asc; #先按照班级升序排列,班级内按照年龄升序排列。
分页查询
select * from stu order by no asc limit 5;#取前五条数据
select * from stu order by no asc limit 10,5;#从第十一条开始,向后取5条,能取多少是多少
select * from stu order by no asc limit 1;#取第一条数据
select * from stu order by no desc limit 1;#取最后一条数据
统计函数
select min(age) from stu;#查询字段的最小值
select max(age) from stu; #查询字段的最大值
select avg(age) from stu; #查询字段的平均值
select sum(age) from stu; #查询字段的总和
select count(*) from stu;#查询记录的条数
select count(jg) from stu;#查询字段的条数,忽略NULL值
分组查询
select jg, count(jg) from stu group by jg;#统计各籍贯学生数
select claz '班级',jg '籍贯', count(no) from stu group by claz,jg; #统计各班级各籍贯学生数
select claz '班级', gender '性别', count(no) from stu group by claz,gender;#统计各班级男生数和女生数
select gender '性别', count(no) '人数' from stu where claz = '1班' group by gender;#统计一班的男生数和女生数
select claz,count(no) from stu group by claz order by claz desc;#统计各班的学生数,按照班级名称降序排列
select claz '班级', count(claz) '班内人数' from stu group by claz
having count(claz) >= 5;#统计人数超过5的班级
having和where的区别:
having和where都是限定条件
where限定的是字段,having限定的是统计函数
where只能限定字段,having只能使用统计函数
where跟分组没有关系,而要是用having必须要先分组
外键和多表连接查询
在表中与另外一张表相关联的字段叫做外键
外键的数据来源于与之关联的表的主键
两个表关联总是通过外键来关联的
关联查询是把两个表先关联起来,组成一张新表,这张表包含了两个表的内容,然后就像查单表一样查这个新表。
一个张表可以有多个外键,只能有一个主键。
一张表的主键可以被多张表的外键来参照。
一张表的外键只能参照一张表的主键。
外键可以起到约束数据的作用。
查询persons表中的前两条记录
select * from persons limit 2;
查询年龄比较小的两个人
select * from persons order by age asc limit 10;
查询地址中包含“北”字的人
%代表0个或多个字符
这种查询叫做模糊查询
select * from persons where address like '%北%';
查询年龄是20或者25的人
select * from persons where age = 21 or age = 25;
select * from persons where age in(21,25);
查询年龄大于等于21并且小于等于25的人
select * from persons where age >= 21 and age <= 25;
select * from persons where age between 21 and 25;
查询年龄是22的人
select p.firstName from persons p where p.age = 22;
select firstName 姓氏,lastName 名字 from persons where age = 22;
主键:
主键(Primary Key)是一个列,在
这个列中的每一行的值都是唯一的。
主键的作用是为了唯一标识一条记录
主键必须是非空、唯一的。
orders表中的id_p列的数据来源于persons表的id_p
id_p是persons表的主键,id_o是orders表的外键
一个表的外键参照另外一个表的主键,从而将两个表建立起关系
外键所在的表叫做从表,被外键参照的主键所在的表叫做主表。
查询所有人的姓名和订单信息
只有orders表的id_p和persons表的id_p相同的数据才有意义
连接查询
select p.firstName,p.lastName, o.orderNumber
from persons p,orders o
where p.id_p = o.id_p
连接查询
select p.*, o.*
from persons p,orders o
where p.id_p = o.id_p;
内连接
只有左表和右表匹配的数据才会显示
select p.*,o.* from persons p
inner join orders o on p.id_p = o.id_p;
左外连接,左边表的数据必须显示在结果集中
如果右边表没有对象的数据,就补NULL
select p.*,o.* from persons p
left join orders o on p.id_p = o.id_p;
右外连接,右边表的数据必须显示在结果集中
如果左边表没有对象的数据,就补NULL
select p.*,o.* from persons p
right join orders o on p.id_p = o.id_p;
select p.*, o.* from orders o left join persons p on
p.id_p = o.id_p;
约束(Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件
将中国员工表和美国员工表的数据联合到一起
union去掉重复,union all不去重
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。
列也必须拥有相似的数据类型。
select * from employees_china union
select * from employees_usa;
select * from employees_china union all
select * from employees_usa;
对persons表进行备份
mysql不支持select into
select p.* into persons_copy from persons p;
建表语句
在列的声明上使用唯一约束
create table stu(
s_id int(10),
s_first_name varchar(255) unique not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1)
);
单独使用唯一约束
姓和名在一起使用唯一约束
create table stu(
s_id int(10),
s_first_name varchar(255) not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1),
unique(s_first_name,s_last_name)
);
使用CONSTRAINT 关键字加约束
create table stu(
s_id int(10),
s_first_name varchar(255) not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1),
CONSTRAINT xmwy unique(s_first_name,s_last_name)
);constraint 约束名约束类型具体的约束说明
删除约束
alter table stu drop index xmwy;
主键
在列的声明上使用主键
create table stu(
s_id int(10) PRIMARY key,
s_first_name varchar(255) unique not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1)
);
主键
单独加主键
create table stu(
s_id int(10),
s_first_name varchar(255) unique not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1),
PRIMARY key (s_id)
);
使用constraint关键字加主键
create table stu(
s_id int(10),
s_first_name varchar(255) unique not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1) default '男',
CONSTRAINT pk PRIMARY key(s_id)
);constraint 约束名约束类型 具体的约束说明。
删除主键
alter table stu drop primary key;
给订单表加外键
alter table orders
add constraint fk
FOREIGN key(id_p) REFERENCES persons(id_p);
删除外键
alter table orders drop FOREIGN key fk;
default 约束
alter table persons alter city set default '北京';
撤销default约束
alter table persons alter city drop default;
创建索引
create index fn on persons (firstName);
如果创建了索引,在执行查询语句时
数据库会自动的翻看索引
select * from persons where firstName='张';
删除索引
drop index fn on persons;
删除stu表
drop table stu;
删除表中数据
delete * from stu;
删除数据库
drop database aaa;
删除全表的数据
truncate table stu;
stu表加一列
alter table stu
add column tel varchar(255);
删除一列
alter table stu
drop column tel;
自动增长,自动增长只能给主键加
create table stu(
s_id int(10) PRIMARY key auto_increment,
s_first_name varchar(255) not null,
s_last_name varchar(255) not null,
s_age int(10),
s_gender char(1)
);
查询性别是NULL的学生
select * from stu where s_gender is NULL;
select * from stu where s_gender is not NULL;
视图一个虚拟的表,它的数据来源于真实的表
对数据源表的数据的改变,会反映到视图上
create view dd as
select p.firstName,p.lastName,o.orderNumber
from persons p inner join orders o
on p.id_p = o.id_p;
视图的作用:简化查询
select * from dd where orderNumber = 77895;
drop view dd;
日期函数
当前的日期和时间
select now();
当前的日期
select curdate();
当前的时间
select curtime();
格式化日期
select date_format(now(), '%Y-%m-%d %k:%i:%s');
计算perons表中人的平均年龄
select avg(age) from persons;
查询persons表中年龄高于平均值的人
子查询(一个查询中嵌套了一个查询)
select * from persons
where age > (select avg(age) from persons);
查询表中有多少条数据
select count(*) from persons;
count(column_name)不包括NULL
select count(lastName) from persons;
查询一共有几种居住地
select count(distinct address) from persons;
找出最大年龄
select max(age) from persons;
找出年龄最大的人
select * from persons
where age = (select max(age) from persons);
最小 MIN(age)
计算年龄的和
select sum(age) from persons;
分组查询每个人订单总金额
分组查询的结果只能是统计函数的结果,或者是
分组的字段
select id_p, sum(order_price) from orders
group by id_p;
统计各个地区的人数
select city, count(*) from persons
group by city;
统计查询人数大于等于2的地区
select city, count(*) cc from persons
group by city
having cc >=2;
统计查询人数大于等于2的地区
select city from persons
group by city
having count(*) >=2;
查询各个地区的男同学的人数
select city, count(*) from persons
where gender = '男'
group by city;
查找男同学人数大于等于2的地区
select city from persons
where gender = '男'
group by city
having count(*) >=2;
where是对单个属性进行限制
having是对统计结果进行限制
数据库是关系型数据库
一对多
多对一
一对一
多对多
一个人有多个订单,一个订单属于一个人,人员表和订单表是一对多的关系
订单表和人员表是多对一
一对多和多对一,外键是多的表上
mysql为数据库,MySQL是服务,可以理解为mysql数据库服务(注意:重点强调“服务”),sql是数据库的查询语言
目前使用最流行的两种后台数据库即为MySQL and SQL Server。这两者最基本的相似之处在于数据存储和属于查询系统。你可以使用SQL来访问这两种数据库的数据,因为它们都支持ANSI-SQL。还有,这两种数据库系统都支持二进制关键词和关键索引,这就大大地加快了查询速度。同时,二者也都提供支持XML的各种格式。
二者所遵循的基本原则是它们的主要区别:开放vs保守。SQL服务器的狭隘的,保守的存储引擎与MySQL服务器的可扩展,开放的存储引擎绝然不同。
发行费用:MySQL不全是免费,但很便宜,而SQL费用就要高一些。
1. MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 1应用方面 MySQL 是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
2. SQL Server (Microsoft SQL Server)是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点。
3. 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
JDBC(Java Database Connection 也就是Java数据库连接)是如何实现Java程序和JDBC驱动的松耦合的?
JDBC API使用Java的反射机制来实现Java程序和JDBC驱动的松耦合。
什么是JDBC连接,在Java中如何创建一个JDBC连接?
JDBC连接是和数据库服务器建立的一个会话。
创建JDBC连接很简单,只需要两步:
- 注册并加载驱动:Class.forName()
- 用DriverManager获取连接对象
JDBC的DriverManager是用来做什么的?
JDBC的DriverManager是一个工厂类,我们通过它来创建数据库连接。
在Java程序中,如何获取数据库服务器的相关信息?
使用DatabaseMetaData可以获取到服务器的信息。
JDBC的Statement是什么?
Statement是JDBC中用来执行数据库SQL查询语句的接口。通过调用连接对象的getStatement()方法我们可以生成一个Statement对象。我们可以通过调用它的execute(),executeQuery(),executeUpdate()方法来执行静态SQL查询。
JDBC的PreparedStatement是什么?
PreparedStatement对象代表的是一个预编译的SQL语句。用它提供的setter方法可以传入查询的变量。
相对于Statement,PreparedStatement的优点是什么?
它和Statement相比优点在于:
- PreparedStatement有助于防止SQL注入,因为它会自动对特殊字符转义。
- PreparedStatement可以用来进行动态查询。
- PreparedStatement执行更快。尤其当你重用它或者使用它的拼量查询接口执行多条语句时。
- 使用PreparedStatement的setter方法更容易写出面向对象的代码,而Statement的话,我们得拼接字符串来生成查询语句。
PreparedStatement的缺点是什么?
PreparedStatement的一个缺点是,我们不能直接用它来执行in条件语句
JDBC的ResultSet是什么?
在查询数据库后会返回一个ResultSet,它就像是查询结果集的一张数据表。
JDBC通过Statement和PreparedStatement中的addBatch和executeBatch方法来支持批处理。
如何回滚事务?
通过Connection对象的rollback方法可以回滚事务。它会回滚这次事务中的所有修改操作,并释放当前连接所持有的数据库锁。
触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。