目录
1.数据库介绍
1.1 数据结构与数据库
(1)数据结构是一门研究数据如何组织的学科,服务于大量数据后续的增删查改;
(2)数据库是一类用于组织、保存、管理数据的软件,同样是为了后续进行增删查改,在数据库的实现过程中也应用到了很多数据结构;
1.2 常见的数据库软件
(1)数据库中最好的软件:Oracle,但由于其软件收费且必须搭配IBM小型机使用,故而使用并不是很广泛;
(2)数据库中使用最广泛的软件:MySQL;
(3)微软数据库:SQL Server;
(4)轻量级数据库:SQLite,整个程序就是一个exe可执行文件,体积大约为1M,常用于小型嵌入式系统,比如安卓系统就内置了sqlite;
以上数据库虽然在功能与操作上稍有差异,但都大同小异,基本相通;
注:嵌入式:生活中部分设备比如智能冰箱、空调、电视、投影仪等等也搭载了计算机,但只需要完成一些特定功能,不需要非常高的配置,在为其编程时与计算机编程也具有一些差异,就将以上设备称为嵌入式设备,开发以上设备就称为嵌入式开发;
1.3 数据库的分类
(1)关系型数据库:
对数据库中的数据格式较为严格,以上数据库统称为关系型数据库;
使用硬盘来保存数据,这与冯诺依曼体系有关,在Python第一篇文章中已经有所提及,具体内容请参考:CSDN
(2)非关系型数据库:
如redis,MongoDB,HBase等就是非关系型数据库,其功能相比关系型数据库要少一些,但是性能更高,更适合当下大数据分布式时代背景;
注:① 大数据:数据一个机器无法承载,就通常称为大数据;
② 分布式:这些数据需要多台机器相互配合,共同管理和存储,就称为“分布式”系统;
1.4 MySQL介绍
1.4.1 重要概念
MySQL是一个客户端服务器结构的程序:
(1)客户端(Client):主动发起交互的一方;
打开方式1:开始栏有:
打开就显示客户端本体,是一个命令行程序:
打开方式2:
也可使用cmd通过输入mysql命令启动,客户端本体就是mysql命令,
方式1就是这个命令的快捷方式:
(2)服务器(Server):被动接收交互的一方:
① 由于客户端发出请求是不定时的,故而一般服务器程序也要持续运行;
② 一个服务器同一时刻可能要给多个客户端提供服务;
③ 安装好MySQL后,在开始栏搜索服务有以下界面:
这就是MySQL的服务器;
④ MySQL的服务器和客户端通过网络进行通信;
⑤ 客户端和服务器可以在同一个主机上(当前情况),也可以在不同的主机上;
(3)请求(Request):客户端给服务器发出的数据;
(4)响应(Response):服务器返回给客户端的数据;
基于以上定义,某个程序可能既是客户端和服务器;
其关系简图如下:
1.4.2 学习内容
① SQL编程语言:通过SQL完成对数据库数据的增删改查,不同的数据库软件可能对于SQL语法支持略有差异,但整体大同小异;
② 数据库背后的一些典型原理;
③ 通过java代码来操作数据库;※
在本专栏系列文章中,均以命令行界面操作为主;
1.4.3 数据库服务器在硬盘上组织数据的方式
关系型数据库组织数据的方式都是上图结构,
而非关系型数据库往往基于文档或键值对,格式较为松散,要求并不严格;
2. 数据库操作
2.1 显示当前数据库
注:(1)使用“ show databases; ” 显示数据库;
(2)其中show与databases直接有一个或多个空格,且使用英文分号为结尾;
(3)注意为databases而非database;
(4)执行完一个SQL之后会得到一个反馈,显示当前执行结果有多少行记录和消耗多少时间;
set表示集合,sec表示秒;
2.2 创建数据库
创建成功后再查看数据库:
注:(1)使用“ create database [数据库名]; ”创建一个数据库;
(2)注意是database而非databases;
(3)数据库名一般由数字、字母、下划线构成且数字不能开头,名字不能是SQL中的关键字,如果二者冲突,就会报错,比如创建名为database的数据库,如果需要将关键字作为数据库名,可以使用反引号`把数据库名引起来:
(4)数据库名字不能重复:
(5)SQL的关键字是大小写不敏感的,比如CREATE DATABASE和create database是一样的;
(6)创建数据库时还可以指定字符集:
平时常用的字符集为gbk(windows简体中文版默认字符集,2个字节表示一个汉字)和utf8(更通用的字符集,通常是3个字节表示一个汉字),其中C语言所使用的vs默认就是gbk字符集。
当在使用SQL时,如果不指定字符集,就很有可能插入中文失败;
语法为:
CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,
create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name // 设置字符集
[DEFAULT] COLLATE collation_name // 设置约束关系
示例代码:
2.3 选中数据库
注:(1)使用“ use [数据库名];”选中一个数据库;
(2)对某个数据库进行后续增删改查的操作,就必须先明确针对的数据库是哪一个;
2.4 删除数据库
注:(1)使用“ drop database [数据库名]; ”删除一个数据库;
(2)删除数据库一旦删除,难以恢复,故而删除操作需要谨慎;
3.常用数据类型
SQL的数据类型系统与C、java是非常相似的;
3.1 数值类型
数据类型 | 大小 | 说明 | 对应java类型 | 对应c类型 |
BIT[(M)] | M指定数, 默认为1 |
二进制数,M范围1~64, 存储数值范围0~2^M-1 |
常用boolean对应BIT, 即只能存0和1 |
char[] |
TITYINT | 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 | 双精度,M指定长度, D指定小数位数,会发生精度丢失 |
BigDecimal | char[] |
注:(1)由于浮点数的内存存储结构,double和float表示某些数据时存在误差,不能精确表示,比如0.1+0.2==0.3会被判定为flase, 虽然存储空间小,计算速度快但可能存在误差,decimal使用了类似字符串的方式进行保存的,故而更精确,但存储空间更大,计算速度更慢;
(2)虽然MySQL存在无符号类型,但MySQL官方文档明确说明无符号类型不建议使用。
3.2 字符串类型
数据类型 | 大小 | 说明 | 对应java类型 | 对应c类型 |
VARCHAR(SIZE) | 0~65535字节 | 可变长度字符串 | String | char[] |
TEXT | 0~65535字节 | 长文本数据 | String | char[] |
MEDIUMTEXT | 0~16777215字节 | 中等长度文本数据 | String | char[] |
BLOB | 0~65535字节(64KB) | 二进制形式的长文本数据 | byte[] | char[] |
注:(1)对于VARCHAR类型,SIZE指定的是最大长度,单位是字符;,即假定指定name列,类型为varchar(10),即姓名最多可以存储10个字;
(2)BLOB存储的是二进制串,注意区别bit[]只能最多存储64bit,但BLOB可以存更长,如存小图片或小段音频,可以使用BLOB,但如果文件太大,一般会采用将图片存在硬盘上,在数据库中存储图片路径;
3.3 日期类型
数据类型 | 大小 | 说明 | 对应java类型 | 对应c类型 |
DATETIIME | 8字节 | 范围:1000~9999年,不会进行时区的检索及转换 | java.util.Date、java.sql.Timestamp | MYSQL TIME |
TIMESTAMP | 4字节 | 范围:1970~2038年,自动检索当前时区并进行转换 | java.util.Date、java.sql.Timestamp | MYSQL TIME |
4. 表操作
4.1 查看数据库中的表
注:先选中数据库再使用“ show tables; ”查看表,若没有选中数据库就查看表会报错:
4.2 创建表
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| testdemo1 |
+--------------------+
5 rows in set (0.00 sec)
mysql> use testdemo1;
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> create table student (id int, name varchar(20));
Query OK, 0 rows affected (0.14 sec)
mysql> show tables;
+---------------------+
| Tables_in_testdemo1 |
+---------------------+
| student |
+---------------------+
1 row in set (0.00 sec)
注解如下:
注:(1)创建表时,需要指定列以及列的类型;
(2)使用“ create table [表名] (列名 类型,列名 类型...); ”创建表,注意列名在前,类型在后;
(3)创建表时可以使用commend进行注释,但请注意commend只能在创建表时进行注释,相比之下更推荐“ -- ”和“ # ”进行注释;
注释只在源码中存在,在数据库中不会被保存起来;
4.3 查看指定表的表结构
mysql> show tables;
+---------------------+
| Tables_in_testdemo1 |
+---------------------+
| student |
+---------------------+
1 row in set (0.00 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
注解如下:
注:(1)使用“ desc [表名]; ”查看表结构;(desc是description的缩写)
4.4 删除表
mysql> drop table student;
Query OK, 0 rows affected (0.07 sec)
mysql> show tables;
Empty set (0.00 sec)
注:(1)使用“ drop table[表名]; ”删除表;
(2)删除表和删除库都很危险,删除都需要谨慎;
(3)删除前可以增加if操作:存在再删除,不存在则不执行;
5. 简单商店数据库
有一个商店的数据,记录客户及购物情况,由以下三个表组成:
(1)商品goods(商品编号goods_id,商品名goods_name,单价unitprice,商品类别category,供应商provider);
(2)客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id);
(3)购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums);
试创建以下数据库及表,并展示表结构:
mysql> show tables;
+---------------------+
| Tables_in_testdemo1 |
+---------------------+
| customer |
| goods |
| purchase |
+---------------------+
3 rows in set (0.00 sec)
mysql> desc customer;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| customer_id | int(11) | YES | | NULL | |
| name | varchar(50) | YES | | NULL | |
| address | varchar(512) | YES | | NULL | |
| email | varchar(50) | YES | | NULL | |
| sex | varchar(5) | YES | | NULL | |
| card_id | varchar(20) | YES | | NULL | |
+-------------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
mysql> desc goods;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| goods_id | int(11) | YES | | NULL | |
| goods_name | varchar(50) | YES | | NULL | |
| unitprice | int(11) | YES | | NULL | |
| category | varchar(50) | YES | | NULL | |
| provider | varchar(50) | YES | | NULL | |
+------------+-------------+------+-----+---------+-------+
5 rows in set (0.00 sec)
mysql> desc purchase;
+-------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+-------+
| order_id | int(11) | YES | | NULL | |
| customer_id | int(11) | YES | | NULL | |
| goods_id | int(11) | YES | | NULL | |
| nums | int(11) | YES | | NULL | |
+-------------+---------+------+-----+---------+-------+
4 rows in set (0.00 sec)