数据库概念:
存储数据用文件就可以了,为什么还要弄个数据库?
文件保存数据有以下几个缺点:
- 文件的安全性问题
- 文件不利于数据查询和管理
- 文件不利于存储海量数据
- 文件在程序中控制不方便
数据库存储介质:
- 磁盘
- 内存
为了解决上述问题,出现了更利于管理数据的软件,数据库,它能更有效的管理数据。数据库可以提供远程服务,即通过远程连接来使用数据库,因此也称为数据库服务器。
数据库分类
数据库大体可以分为 关系型数据库 和 非关系型数据库
关系型数据库(RDBMS):是指采用了关系模型来组织数据的数据库。 简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。基于标准的SQL,只是内部一些实现有区别。
常用的关系型数据库如:
- Oracle:甲骨文产品,适合大型项目,适用于做复杂的业务逻辑,如ERP、OA等企业信息系统。收费。
- MySQL:属于甲骨文,不适合做复杂的业务。开源免费。
- SQL Server:微软的产品,安装部署在windows server上,适用于中大型项目。收费。
- MariaDB: 基于 MySQL 的一个开源数据库产品。
非关系型数据库:
(了解)不规定基于SQL实现。现在更多是指NoSQL数据库,如:
- 基于键值对(Key-Value):如 redis
- 基于文档型:如 mongodb
- 基于列族:如 hbase
- 基于图型:如 neo4j
Mysql安装
CentOS 7 通过 yum 安装 MariaDB
CentOS 6.5下编译安装MySQL 5.6.14
Windows下通过MySQL Installer安装MySQL服务
SQL分类
SQL,指结构化查询语言,全称是 Structured Query Language。
SQL 让您可以访问和处理数据库。
DDL数据定义语言,用来维护存储数据的结构
代表指令: create, drop, alter
DML数据操纵语言,用来对数据进行操作
代表指令: insert,delete,update
DML中又单独分了一个DQL,数据查询语言,代表指令: select
DCL数据控制语言,主要负责权限管理和事务
代表指令: grant,revoke,commit
主要是应用:DDL和DML的操作。
MySQL 连接
在windows系统中,打开cmd,对电脑中的Mysql进行数据连接。
[root@host]# mysql -u root -p
在登录成功后会出现 mysql> 命令提示窗口,你可以在上面执行任何 SQL 语句。
以上命令执行后,登录成功输出结果如下:
mysql>
数据库的操作
数据库操作分为:库操作和表操作。
1. 数据库的操作
1.1 显示当前的数据库
SHOW DATABASES;
1.2 创建数据库
CREATE DATABASE 数据库名
示例:
CREATE DATABASE db_test1;
创建名为 db_test1 的数据库
1.3 使用数据库
use 数据库名;
1.4 删除数据库
DROP DATABASE [IF EXISTS] db_name;
2. 数据表的操作
要想操作数据库,需要先进入数据库
use db_test;
2.1查看表结构
desc 表名;
2.2创建表
CREATE TABLE table_name (
field1 datatype,
field2 datatype,
field3 datatype );
可以使用comment增加字段说明。
例如:
create table stu_test (
id int,
name varchar(20) comment '姓名',
password varchar(50) comment '密码',
age int, sex varchar(1),
birthday timestamp,
amout decimal(13,2),
resume text );
2.3删除表
-- 删除 stu_test 表
drop table stu_test;
-- 如果存在 stu_test 表,则删除 stu_test 表
drop table if exists stu_test;
数据库中常用数据结构
1.数值类型
数据类型 | 大小 | 说明 | 对应java类型 | 对应 C类型 |
---|---|---|---|---|
BIT[ (M) ] | M指定位数,默认为1 | 二进制数,M范围从1到64,存储数值范围从0到2^M-1 | 常用Boolean对应BIT,此时默认是1位,即只能存0和1 | char[] |
TINYINT | 1字节 | Byte | signed;char | |
SMALLINT | 2字节 | Short | short ;int | |
INT | 4字节 | Integer | int | |
BIGINT | 8字节 | Long | long;long;int | |
FLOAT(M, D) | 4字节 | 单精度,M指定长度,D指定 | ||
小数位数。会发生精度丢失 | Float | float | ||
DOUBLE(M,D) | 8字节 | Double | double | |
DECIMAL(M,D) | M/D最大值+2 | 双精度,M指定长度,D表示小数点位数。精确数值 | BigDecimal | char[] |
NUMERIC(M,D) | M/D最大值+2 | 和DECIMAL一样 | BigDecimal | char[] |
2.字符串类型
数据类型 | 大小 | 说明 | 对应java类型 | 对应 C 类型 |
---|---|---|---|---|
VARCHAR (SIZE) | 0-65,535字节 | 可变长度字符串 | String | char[] |
TEXT | 0-65,535字节 | 长文本数据 | String | char[] |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 | String | char[] |
BLOB | 0-65,535字节 | 二进制形式的长文本数据 | byte[] | char[] |
3.日期类型
数据类型 | 大小 | 说明 | 对应java类型 | 对应 C 类型 |
---|---|---|---|---|
DATETIME | 8字节 | 范围从1000到9999年,不会进行时区的检索及转换。 | java.util.Date、java.sql.Timestamp | MYSQL_TIME |
TIMESTAMP | 4字节 | 范围从1970到2038年,自动检索当前时区并进行转换。 | java.util.Date、java.sql.Timestamp | MYSQL_TIME |
CRUD操作
注释:在SQL中可以使用“–空格+描述”来表示注释说明
CRUD 即增加(Create)、查询(Retrieve)、删除(Delete)、修改(Update)。
增加(Create)
Create table student {
id int comment 'id',
sn int comment '学号',
name varchar(10) comment '学号',
qq_email varchar(20) comment '邮箱'
}
插入操作
1.单行插入
Insert into student(id,sn,name,qq_email) values (1,6541,'lin1','684@qq.com');
Insert into student values (1,6541,'lin1','684@qq.com');
2.单行指定列插入
Insert into student(id,sn,name) values (1,6541,'lin1');
-- 没有给值,默认就是null
3。多行全列插入
Insert into student(id,sn,name,qq_email) values
(2,6222,'lin2','6888@qq.com')
(3,64544,'lin3','68943@qq.com')
;
4.多行指定列插入
Insert into student(id,sn,name) values
(4,62111,'lin4')
(5,648684,'lin5')
;
查询(Retrieve)
select
-- 创建考试成绩表
DROP TABLE IF EXISTS exam_result;
CREATE TABLE exam_result (
id INT,
name VARCHAR(20),
chinese DECIMAL(3,1),
math DECIMAL(3,1),
english DECIMAL(3,1)
-- 指最多三个有效数字,小数点后最多一位
);
-- 插入测试数据
INSERT INTO exam_result (id,name, chinese, math, english) VALUES
(1,'唐三藏', 67, 98, 56),
(2,'孙悟空', 27, 33, 89),
查询操作
1.全表查询
select * from exam_result;
1.通常不建议使用*,*是指通配符,查询的结果相当于一个表
2.缺点:当你查询的数据量比较大时,会造成数据库卡死(重大事故)
2.指定列查询
select id,name,chinese from exam_result;
3.查询表达式
-- 表达式不包含字段
SELECT id, name, 10 FROM exam_result;
-- 表达式包含一个字段
SELECT id, name, english + 10 FROM exam_result;
-- 表达式包含多个字段
SELECT id, name, chinese + math + english FROM exam_result;
4.别名
-- 结果集中,表头的列名=别名
SELECT id, name, chinese + math + english as 总分 FROM exam_result;
5.去重
SELECT distinct math FROM exam_result;