Java全栈数据库技术:1.数据库之MysqlL上

Posted new nm个对象

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java全栈数据库技术:1.数据库之MysqlL上相关的知识,希望对你有一定的参考价值。

第一章 数据库概述

1.1 数据库概述

  • DBMS:数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,例如建立、使用和维护数据库。

  • DB:数据库(Database)

  • SQL:结构化查询语言,(Structure Query Language),专门用来操作/访问数据库的通用语言。

  • 如果把数据库比作盘子,那数据就是盘子里的SQL则是你的筷子

  • 数据库类型:数据库经过几十年的发展,出现了多种类型。目前最常见的数据库模型主要是:关系型数据库和(noSQL)非关系型数据库。

  • mysql:其中的一款关系型数据库管理系统

以下是2020年DB-Engines Ranking 对各数据库受欢迎程度进行调查后的统计结果:(查看数据库最新排名:)

关系型数据库模型是将复杂的数据结构用较为简单的二元关系(二维表)来表示,如图所示。在该类型数据库中,对数据的操作基本上都建立在一个或多个表格上,我们可以采用结构化查询语言(SQL)对数据库进行操作。关系型数据库是目前主流的数据库技术,其中具有代表性的数据库管理系统有:Oracle、DB2、SQL Server、MySQL等。

非关系型数据库:

随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS( 社交网络服务 )类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。 例如:redis MongoDB

关系型数据库设计规则

  • 遵循ER模型

    • E entity 代表实体的意思 对应到数据库当中的一张表
    • R relationship 代表关系的意思
  • 具体体现

    • 将数据放到表中,表再放到库中。
    • 一个数据库中可以有多个表,每个表都有一个名字,用来标识自己。表名具有唯一性。
    • 表具有一些特性,这些特性定义了数据在表中如何存储,类似java和python中 “类”的设计。
    • 表由列组成,我们也称为字段。每个字段描述了它所含有的数据的意义,数据表的设计实际上就是对字段的设计。创建数据表时,为每个字段分配一个数据类型,定义它们的数据长度和字段名。每个字段类似java 或者python中的“实例属性”。
    • 表中的数据是按行存储的,一行即为一条记录。每一行类似于java或python中的“对象”。

1.2 MySQL概述

MySQL数据库最初是由瑞典MySQL AB公司开发,2008年1月16号被Sun公司收购。2009年,SUN又被Oracle收购。MySQL是目前IT行业最流行的开放源代码的数据库管理系统,同时它也是一个支持多线程高并发多用户的关系型数据库管理系统。MySQL之所以受到业界人士的青睐,主要是因为其具有以下几方面优点:

1. 开放源代码

MySQL最强大的优势之一在于它是一个开放源代码的数据库管理系统。开源的特点是给予了用户根据自己需要修改DBMS的自由。MySQL采用了General Public License,这意味着授予用户阅读、修改和优化源代码的权利,这样即使是免费版的MySQL的功能也足够强大,这也是为什么MySQL越来越受欢迎的主要原因。

2. 跨平台

MySQL可以在不同的操作系统下运行,简单地说,MySQL可以支持Windows系统、UNIX系统、Linux系统等多种操作系统平台。这意味着在一个操作系统中实现的应用程序可以很方便地移植到其他的操作系统下。

3. 轻量级

MySQL的核心程序完全采用多线程编程,这些线程都是轻量级的进程,它在灵活地为用户提供服务的同时,又不会占用过多的系统资源。因此MySQL能够更快速、高效的处理数据。

4. 成本低

MySQL分为社区版和企业版,社区版是完全免费的,而企业版是收费的。即使在开发中需要用到一些付费的附加功能,价格相对于昂贵的Oracle、DB2等也是有很大优势的。其实免费的社区版也支持多种数据类型和正规的SQL查询语言,能够对数据进行各种查询、增加、删除、修改等操作,所以一般情况下社区版就可以满足开发需求了,而对数据库可靠性要求比较高的企业可以选择企业版。

1.3 Mysql软件的卸载、安装和配置

不讲解,用到时百度搜索就行

第二章 MySQL的使用

2.1 MySQL服务的启动

“我的电脑/计算机”–>右键–>“管理”–>“服务”–>启动和关闭MySQL服务

“开始菜单”–>“控制面板”–>“管理工具”–>“服务”–>启动和关闭MySQL

“任务管理器”–>“服务”–>启动和关闭MySQL

或者

命令行(使用命令行的前提需要配置mysql的环境变量)

net  start  MySQL服务名
net  stop  MySQL服务名

2.2 客户端连接MySQL

1、命令行客户端:

mysql -h 主机IP地址 -P 端口号	-u 用户名	-p回车
Enter Password:密码

如果访问本机,-h localhost可以省略

如果端口号没有修改,-P 3306可以省略

除了-p与密码之间不要空格外,其他的-h,-P,-u与后面的参数值之间可以有空格

想要连接成功,必须保证服务开启的

2、其他客户端,例如:可视化工具Navicat或SQLyog等

第三章 MySQL数据类型和运算符

3.1 MySQL数据类型

1、数值类型

  • 整型系列:xxxInt3

int(M),必须和unsigned zerofill一起使用才有意义

* 1个字节(byte) = 8比特(bit),可以表示256个数。一个bit就是一位二进制数
* TINYINT:有符号(-128~127);无符号(0~255)
* 其他类似
* int(4)字段仍然可以接收超过4位的整数,因为mysql默认使用的是有符号类型。而在有符号类型的字段中,整数类型设置的宽度不生效。
* int(M),必须和`unsigned zerofill`一起使用才有意义。unsigned zerofill表示无符号字段,不符合要求的地方以0填充,例如:宽度为3,数值为10,则显示为010.当然还是可以接收超过3位的整数
  • 浮点型系列:float,double(或real)

double(M,D):表示最长为M位,其中小数点后D位

例如:double(5,2)表示的数据范围[-999.99,999.99],如果超过这个范围会报错。

  • 定点型系列:decimal(底层实际上是使用字符串进行存储)

decimal(M,D):表示最长为M位,其中小数点后D位
如果decimal没有指定宽度,则只保留整数,且会对小数四舍五入
如果指定了宽度,则按宽度输出,多出的小数也会按照四舍五入

  • 位类型:bit

字节范围是:1-8,值范围是:bit(1)~bit(64),默认bit(1) 将传入的数值转为二进制存入

用来存储二进制数。对于位字段,直接使用select命令将不会看到结果。可以使用bit()函数进行插入。插入bit类型字段时,使用bit()函数转为二进制值再插入,使用bin()函数进行读取。

2、日期时间类型

日期时间类型:year, date, datetime, timestamp

注意一下每一种日期时间的表示范围

timestamp和datetime的区别:

  • timestamp范围比较小

  • timestamp和时区有关

    • show variables like ‘time_zone’;
    • set time_zone = ‘+9:00’;
  • 表中的第一个非空的timestamp字段如果插入和更新为NULL则会自动设置为系统时间


案例:

create table test2(time1 datetime,time2 timestamp); # 创建表
insert into test2 values(now(),now()); # 插入数据
select * from test2; // 查询数据
+---------------------+---------------------+
| time1               | time2               |
+---------------------+---------------------+
| 2021-11-26 02:09:52 | 2021-11-26 02:09:52 |
+---------------------+---------------------+
1 row in set (0.01 sec)

insert into test2 values(null,null);
select * from test2;
+---------------------+---------------------+
| time1               | time2               |
+---------------------+---------------------+
| 2021-11-26 02:09:52 | 2021-11-26 02:09:52 |
| NULL                | NULL                |
+---------------------+---------------------+

# 修改时区
set time_zone="+9:00";
select * from test2;
+---------------------+---------------------+
| time1               | time2               |
+---------------------+---------------------+
| 2021-11-26 02:09:52 | 2021-11-26 11:09:52 |   # 修改时区后,timestamp日期类型的数据也会自动改变。datetime类型的不会
| NULL                | NULL                |
+---------------------+---------------------+

3、字符串类型

MySQL中提供了多种对字符数据的存储类型,不同的版本可能有所差异。常见的有:

char,varchar,xxtext,binary,varbinary,xxblob,enum,set等等

在mysql中,单引号和双引号都表示字符串

  • 字符串类型char,varchar(M)

char如果没有指定宽度,默认为1个字符。定长字符串

varchar(M),必须指定宽度。可变字符串

  • binary和varbinary类似于char和varchar,不同的是它们包含二进制字符串,不支持模糊查询之类的。

  • 一般在保存少量字符串的时候,我们会选择char和varchar;而在保存较大文本时,通常会选择使用text或blob系列。blob和text值会引起一些性能问题,特别是在执行了大量的删除操作时,会在数据表中留下很大的“空洞”,为了提高性能,建议定期时候用optimize table功能对这类表进行碎片整理。可以使用合成的(Synthetic)索引来提高大文本字段的查询性能,如果需要对大文本字段进行模糊查询,MySql提供了前缀索引。但是仍然要在不必要的时候避免检索大型的blob或text值。

  • enum枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对于1~255个成员的枚举需要1个字节存储;对于255`65535个成员需要2个字节存储。例如:gender enum(‘男’,‘女’)。一次只能从枚举值中选择一个。

  • set集合类型,可以包含0~64个成员。一次可以从集合中选择多个成员。如果选择了1-8个成员的集合,占1个字节,依次占2个,3个。。8个字节。例如:hoppy set(‘吃饭’,‘睡觉’,‘玩游戏’,‘旅游’),选择时’吃饭,睡觉’或’睡觉,玩游戏,旅游’

4、示例

+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| eid            | int(11)      | NO   | PRI | NULL    | auto_increment |
| ename          | varchar(20)  | NO   |     | NULL    |                |
| tel            | char(11)     | NO   |     | NULL    |                |
| gender         | char(1)      | YES  |     ||                |
| salary         | double       | YES  |     | NULL    |                |
| commission_pct | double(3,2)  | YES  |     | NULL    |                |
| birthday       | date         | YES  |     | NULL    |                |
| hiredate       | date         | YES  |     | NULL    |                |
| job_id         | int(11)      | YES  |     | NULL    |                |
| email          | varchar(32)  | YES  |     | NULL    |                |
| mid            | int(11)      | YES  |     | NULL    |                |
| address        | varchar(150) | YES  |     | NULL    |                |
| native_place   | varchar(10)  | YES  |     | NULL    |                |
| did            | int(11)      | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+
# char varchar练习
create table test2(
	name1 char, # 未指定宽度,则只能放一个字符
	name2 char(20), # 指定宽度时,与varchar一样。都可以存放宽度以内的字符串,但是char底层是定长的,即只放2个字符底层仍然会占用20个字符的空间
	name3 varchar(20) # 必须指定宽度,底层是可变的,即存放多少字符就占用多少空间。只要不超过宽度
);
insert into test2 values("男","嘿嘿","哈哈哈");
select * from test2;
+-------+--------+-----------+
| name1 | name2  | name3     |
+-------+--------+-----------+
|| 嘿嘿   | 哈哈哈    |
+-------+--------+-----------+

# enum练习
create table test2(
	sex enum("男","女","不男不女") # 只能在待选项中选择一个值
);
insert into test2 values("不男不女");
select * from test2;
+--------------+
| sex          |
+--------------+
| 不男不女     |
+--------------+
insert into test2 values("公");
ERROR 1265 (01000): Data truncated for column 'sex' at row 1

# set练习
create table test2(
	// 1.可以选择集合中的一个或多个待选项
	// 2.也可以使用数字选择待选项,从左到右依次是1,2,4,8,...(如果是5则表示:第一个和第三个待选项)
	habby set("吃饭","睡觉","玩游戏","运动") 
);
insert into test2 values("吃饭");
insert into test2 values("吃饭,睡觉");
select * from test2;
+---------------+
| habby         |
+---------------+
| 吃饭          |
| 吃饭,睡觉     |
+---------------+
insert into test2 values(4); # 选择第三个待选项
insert into test2 values(12); # 选择第三、第四个待选项。(12=4+8)
select * from test2;
+------------------+
| habby            |
+------------------+
| 吃饭             |
| 吃饭,睡觉        |
| 玩游戏           |
| 玩游戏,运动      |
+------------------+

3.2 数据库编码方式

1.查看当前数据库的编码方式

show variables like 'character%';


2.指定编码方式创建数据库

create database 数据库名 CHARSET "utf8";

3.一劳永逸的解决编码问题

1.找到数据库安装目录下的my.ini文件
2.将ini文件中的`default-character-set`设置为`utf8`
3.将ini文件下的`character-set-server`改为`utf8`

第四章 SQL

4.1 MySQL的语法规范和要求

(1)mysql的sql语法不区分大小写

MySQL的关键字和函数名等不区分大小写,但是对于数据值是否区分大小写,和字符集与校对规则有关。

show variables like "coll%"; // 显示mysql的校验规则,查看数据值是否区分大小写
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8_general_ci    |
| collation_database   | utf8_general_ci    |
| collation_server     | utf8mb4_0900_ai_ci |
+----------------------+--------------------+
/**
\\_ci(大小写不敏感),\\_cs(大小写敏感),_bin(二元,即比较是基于字符编码的值而与language无关,区分大小写)
*/

(2)命名时:尽量使用26个英文字母大小写,数字0-9,下划线,不要使用其他符号

(3)建议不要使用mysql的关键字等来作为表名、字段名等,如果不小心使用,请在SQL语句中使用`(飘号)引起来

(4)数据库和表名、字段名等对象名中间不要包含空格

(5)同一个mysql软件中,数据库不能同名,同一个库中,表不能重名,同一个表中,字段不能重名

(6)标点符号:

必须成对

必须英文状态下半角输入方式

字符串和日期类型可以使用单引号’’

列的别名可以使用双引号"",给表名取别名不要使用双引号。取别名时as可以省略

如果列的别名没有包含空格,可以省略双引号,如果有空格双引号不能省略。

(7)SQL脚本中如何加注释

单行注释:#注释内容

单行注释:–空格注释内容 其中–后面的空格必须有

多行注释:/* 注释内容 */

#以下两句是一样的,不区分大小写
show databases;
SHOW DATABASES;

#创建表格
#create table student info(...); #表名错误,因为表名有空格
create table student_info(...); 

#其中name使用``飘号,因为name和系统关键字或系统函数名等预定义标识符重名了。
CREATE TABLE t_stu(
    id INT,
    `name` VARCHAR(20)
);

select id as "编号", `name` as "姓名" from t_stu; #起别名时,as都可以省略
select id as 编号, `name` as 姓名 from t_stu; #如果字段别名中没有空格,那么可以省略""
select id as 编 号, `name` as 姓 名 from t_stu; #错误,如果字段别名中有空格,那么不能省略""

4.2 SQL分类

DDL (Data Definition Language) :数据定义语言,定义库,表结构等,包括create,drop,alter等

DML (Data Manipulation Language) :数据操作语言,增删改查数据,包括insert,delete,update,select等

DQL(Data query Language):数据查询语言 select

DCL(Data Control Language) :数据控制语言,权限,事务等管理。

4.3 DDL(v1.0)

1、查看所有数据库

show databases;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test1              |
+--------------------+
5 rows in set (0.01 sec)

2、指定使用某个数据库

use 数据库名;
mysql> use test1;
Database changed

3、创建数据库

create database 数据库名;

create database 数据库名 charset 'utf8'; #在mysql中字符集名称不要使用utf-8

create database 数据库名 charset 'gbk';
create database test2;
Query OK, 1 row affected (0.02 sec)

4、删除数据库

drop database 数据库名;
mysql> drop database test2;
Query OK, 0 rows affected (0.02 sec)

5、查看某个库下的所有表格

show tables ;  #前提是前面有use 数据库名;的语句
show tables from 数据库名;
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| test1           |
| test2           |
+-----------------+
2 rows in set (0.01 sec)

6、创建表格

create table 【数据名.】表名(
	字段名1 数据类型,
	字段名2 数据类型,
	....
);
create table stu(
	id int,
	name varchar(10)
);

7、删除表格

drop table 【数据库名.]表名称;
mysql> drop table test2;
Query OK, 0 rows affected (0.04 sec)

8、查看某个表结构

describe 【数据库名.]表名称;
desc 【数据库名.]表名称;
mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

9、增加一列

alter table 【数据库名.]表名称 add 【column】 字段名 数据类型; 
alter table 【数据库名.]表名称 add 【column】 字段名 数据类型 first;
alter table 【数据库名.]表名称 add 【column】 字段名 数据类型 after 另一个字段;
mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

alter table stu add school char(10); # 默认增加到末尾列
alter table stu add sex enum("男","女") first; # 增加到第一列
alter table stu add age int after id; # 增加到id字段后面

mysql> desc stu;
+--------+-------------------+------+-----+---------+-------+
| Field  | Type              | Null | Key | Default | Extra |
+--------+-------------------+------+-----+---------+-------+
| sex    | enum('男','女')   | YES  |     | NULL    |       |
| id     | int               | YES  |     | NULL    |       |
| age    | int               | YES  |     | NULL    |       |
| name   | varchar(10)       | YES  |     | NULL    |       |
| school | char(10)          | YES  |     | NULL    |       |
+--------+-------------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

10、删除一列

alter table 【数据库名.]表名称 drop 【column】 字段名;
alter table stu drop school; # 删除school列字段
mysql> desc stu;
+-------+-------------------+------+-----+---------+-------+
| Field | Type              | Null | Key | Default | Extra |
+-------+-------------------+------+-----+---------+-------+
| sex   | enum('男','女')   | YES  |     | NULL    |       |
| id    | int               | YES  |     | NULL    |       |
| age   | int               | YES  |     | NULL    |       |
| name  | varchar(10)       | YES  |     | NULL    |       |
+-------+-------------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

11、修改列数据类型

alter table 【数据库名.]表名称 modify 【column】 字段名 新数据类型;
 alter table stu modify name char(6); # 修改name字段数据类型
 mysql> desc stu;
+-------+-------------------+------+-----+---------+-------+
| Field | Type              | Null | Key | Default | Extra |
+-------+-------------------+------+-----+---------+-------+
| sex   | enum('男','女')   | YES  |     | NULL    |       |
| id    | int               | YES  |     | NULL    |       |
以上是关于Java全栈数据库技术:1.数据库之MysqlL上的主要内容,如果未能解决你的问题,请参考以下文章

Java全栈数据库技术:3.数据库之JDBC上

Java全栈数据库技术:4.数据库之JDBC下

Java全栈数据库技术:2.数据库之Mysql下

Java全栈JavaSE:3.数据库之JDBC上

我的全栈之路-Java基础之Java概述与开发环境搭建

原创 | Java全栈大联盟RabbitMQ系列之主流消息中间件介绍