初识MySQL
sc delete mysql 删除服务!
一:数据库介绍
引入:
我们之前使用的数据都是存储在内存中的!比如说我们写一个注册功能。
我们首先需要在内存中创建一个对象,之后输入注册需要的用户名和密码等数据!
然后登陆时,输入注册的数据即可完成登陆!
注册成功之后 比如用户名是admin 密码是123456
出现的问题:
请问
01.用户的数据放在哪里了?
02.如果放在内存中,下次登陆还使用之前注册的用户名和密码,能登陆吗?
显然是不能的! 因为程序一旦运行完毕,内存中的数据也随之消失!
怎么办?
01使用序列化保存对象到文件中
02.使用xml保存数据到文件中
但是把大量的数据放在文件中,我们对文件数据的读写效率是相对较慢的!
而且也不便于我们管理文件中的数据!这时候就需要有新的存储方式来代替!
就是我们所谓的数据库(存储数据的仓库)!
1.1:什么是数据库
定义:按照数据结构来组织,存储和管理数据的仓库,我们称之为数据库(DataBase,简称:DB)。
这些存储的数据可以是多种形式:如文字,符号,图片,视频,音频等!
从广义上来说,我们的txt文件,word文档,excel文件都可以理解成一个数据库!
在IT的世界里,数据库指的是由专业技术团队开发的用于存储数据的软件系统!
1.2:使用数据库的必要性
1.可以结构化的存储大量的数据信息,方便用户进行访问和操作
数据库可以对数据进行分类保存,提高我们的访问效率。
2.可以保证数据信息的一致性,完整性,降低数据的冗余
数据库中有事务(ACID特性)来保证数据信息的一致性,完整性;
数据库自身也有约束来降低数据的冗余。
数据冗余(Redundance):数据重复的现象!
3.可以满足应用的安全和共享方面的要求
如果我们把员工的所有信息,都保存在一个txt文件中,那么员工的薪水就会暴露出来!很显然这是不允许的!
如果把数据放在数据库中,我们可以限制只有财务人员才能查询薪水!而其他员工只能查询自己的信息!
1.3:常见的关系型数据库
1.SQL Server 官网:http://www.microsoft.com/zh-cn/sql-server/sql-server-2016
是Microsoft公司的关系型数据库管理系统!
2.MySql 官网:https://www.mysql.com/
是一种开放源代码的关系型数据库管理系统!
3.Oracle 官网:http://www.oracle.com/technetwork/database/index.html
是Oracle公司的关系型数据库管理系统!
注意点:
虽然数据库不一样,但是对数据的操作都大同小异,有的操作命令都是一致的!
关系型数据库:是指建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据!
1.4:关系型数据库和非关系型数据库
常见的非关系型数据库:
Mongo DB
Redis
HBase
二维表的介绍:
在关系模型中,数据结构表示为一个二维表,一个关系就是一个二维表(但不是任意一个二维表都能表示一个关系),二维表名就是关系名。表中的第一行通常称为属性名,表中的每一个元组和属性都是不可再分的,且元组的次序是无关紧要的。
常用的关系术语如下:
记录 二维表中每一行称为一个记录,或称为一个元组。
字段 二维表中每一列称为一个字段,或称为一个属性。
域 即属性的取值范围。
两者的优缺点:
关系型数据库:
01.容易理解,存放在数据库中的数据就是以二维表的形式存储的!
二维表就是有行和列组成的,知道行号和列号就能定位到表中的数据!Excel就是二维表!
02.使用方便,基本通用的sql语言使得操作关系型数据库方便!
03.支持sql,所以可以进行复杂的查询!
04.易于维护,丰富的完整性(域完整性,实体完整性,参照完整性和自定义完整性)大大降低了数据的冗余,事务的ACID特性保证了数据的一致性!
05.读写性能低
06.对海量数据的处理不如非关系型数据库
07.分布式不够完善
非关系型数据库:
01.不支持sql,省去了解析sql的步骤,读写性能高
02.基于键值对的形式,数据没有耦合性,扩展性强
03.可以实现数据的分布式处理
04.适用于海量数据的处理
05.持久化的性能低
06.因为没有事务,所以数据的安全性不高
07.出道时间短,功能没有关系型数据库完善
1.5:MySql数据库的特点
版本分类:
01.社区版:
*下载免费!适用于普通用户!
02.企业版:
不能自有下载并且收费!官方提供了完整的技术支持!
适用于对数据库要求比较高的企业用户!
优势:
01.运行速度快,因为MySql体积小,命令执行速度快
02.使用成本低,因为MySql免费开源(相对于大多人而言)
03.易学易用,相对于其他数据库的设置和管理
04.可移植性强,能够运行在windows, linux ,unix中!
1.6:数据库管理系统和数据库系统
数据库管理系统(DataBase Management System,简称DBMS):就是管理数据库的系统!
数据库系统(DataBase System,简称DBS):包含数据库软件,数据库和数据库管理员!
数据库管理员(DataBase Administrator,简称DBA):创建,监控和维护整个数据库的专业管理人员!
数据库( DataBase)
DBA通过DBMS操作DB! 整体就是DBMS
关系型数据库管理系统(Relational DataBase Management System)
1.7:数据库中相关的名词
数据库:数据表的集合!
数据表:数据的集合!
行:一行数据(元组或者记录) 横向
列:一列数据(字段) 纵向
主键(Primary key): 唯一标识数据的字段
外键(Foreign Key):关联两个表之间关系的字段
标识列 是 自增列!
主键是 唯一!
复合主键:
所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。
比如
create table test
(
name varchar(19),
id number,
value varchar(10),
primary key (name,id)
)
上面的name和id字段组合起来就是你test表的复合主键 ,它的出现是因为你的name字段可能会出现重名,所以要加上ID字段这样就可以保证你记录的唯一性 ,一般情况下,主键的字段长度和字段数目要越少越好 。
这里就会有一个疑惑? 主键是唯一的索引,那么为何一个表可以创建多个主键呢?
其实“主键是唯一的索引”这话有点歧义的。举个例子,我们在表中创建了一个ID字段,自动增长,并设为主键,这个是没有问题的,因为“主键是唯一的索引”,ID自动增长保证了唯一性,所以可以。
此时,我们再创建一个字段name,类型为varchar,也设置为主键,你会发现,在表的多行中你是可以填写相同的name值的,这岂不是有违“主键是唯一的索引”这句话么?
所以我才说“主键是唯一的索引”是有歧义的。应该是“当表中只有一个主键时,它是唯一的索引;当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引”。
为什么自增长ID已经可以作为唯一标识的主键,为啥还需要复合主键呢。因为,并不是所有的表都要有ID这个字段,比如,我们建一个学生表,没有唯一能标识学生的ID,怎么办呢,学生的名字、年龄、班级都可能重复,无法使用单个字段来唯一标识,这时,我们可以将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样,就不算重复。
1.8:数据完整性
数据完整性:
存储在数据库中的所有数据值均正确的状态。如果数据库中存储有不正确的数据值,则该数据库称为已丧失数据完整性。
组成部分
1.实体完整性(Entity Integrity)
2.域完整性(Domain Integrity)
3.参照完整性(Referential Integrity)
4.用户自定义完整性(User Defined Integrity)
二:Mysql的配置
MySql默认的端口号是3306
2.1:默认字符集的设置
在mysql的安装目录,会看到my.ini文件!
my.ini文件介绍
01.default-character-set=utf8
设置客户端的字符集
02.character-set-server=utf8 设置服务器端的字符集
character-set-client=utf8 客户端发送的语句字符集
character-set-connection=utf8 设置服务器接收客户端语句的字符集
character-set-results=utf8 服务器将结果转换成对应字符集之后响应给客户端
同时设置字符集 client connection results
set names utf-8;
03.port
mysql的默认端口号是3306
04.basedir
数据库的安装位置
05.datadir
数据存放的位置
06.default-storage-engine
mysql的默认存储引擎
如果修改了配置文件,需要重启mysql服务才会生效!
Utf-8是一种针对unicode的可变长度字符编码,又称为万国码。它是一种用于解决国际上字符不统一的一种编码格式,对英文使用8位(1字节),中文24位(3字节)来编码。包含了世界上所有国家需要的字符,是国际编码,通用性强!
2.2:配置mysql环境变量
01.复制mysql安装位置的bin目录
02.右键我的电脑===》属性===》高级系统设置===》环境变量===》把刚才复制的bin路径放入path变量中即可!
三:命令行连接MySql
在windows操作系统中,命令不区分大小写!
3.1:启动mysql服务
01.win+R 输入 services.msc
02.找到mysql服务 右键点击开启
03.win+R 输入 cmd
04.进入命令窗口之后输入net start mysql 开启服务
05.net stop mysql 停止服务
3.2:连接mysql数据库
01.连接命令
Mysql -h 服务器主机地址 -u 用户名 -p密码
02.如果是本机操作,可以省略-h
03.-p之后也可以不写,密码!回车之后再输入密码
如果-p之后书写密码,则不需要有空格
Root用户连接mysql数据库
Mysql -u root -p密码
-p和密码之间不能有空格
3.3:查询mysql数据库的版本号以及当前登陆的用户
select version(),user();
3.4:MySql中数据库类型
1.用户数据库
用户根据需求自己创建的数据库!是我们研究的重点!
2.系统数据库
安装完mysql之后,默认附带的数据库
01.information_schema:存储了数据库对象的信息。如用户表信息,字段信息,权限信息,字符集信息和分区信息等。
02.performance_schema:存储了数据库服务器性能参数信息。
03.mysql:存储了系统的用户权限信息
04.test:数据库管理系统自动创建的测试数据库,任何用户都可以使用
四:SQL简介
4.1:什么是SQL
SQL的全称是(Structred Query Language)结构化查询语句。
01.1974年被提出,1980年改名为SQL
02.关系型数据库的标准语言
03.数据库脚本文件的扩展名
4.2:SQL的组成
01.DDL(Data Definition Language)数据定义语言。
用来创建数据库中的各种对象。如表,视图,索引,同义词等。
create drop truncate alter
02.DQL(Data Query Language)数据查询语言。
select where group by having order by
03.DML(Data Manipulation Language)数据操作语言。
Insert update delete
04.DCL(Data Control Language)数据控制语言。
grant revoke rollback commit
4.3:SQL中的运算符
01.算术运算符
+ 加法
- 减法
* 乘法
/ 除法
% 取余
02.赋值运算符
= 把=右边的值赋值给左边
03.比较运算符
> 大于
< 小于
<= 小于等于
>= 大于等于
<> 不等于
!= 不等于(不符合sql-92标准)
04.逻辑运算符
And 当两个表达式都为true,返回true
Or 当两个表达式有一个为true,返回true
Not 对表达式取反操作,优先级最高
五:使用DDL语句操作数据库
5.1:创建数据库
create database 数据库名称;
Query ok : 表示sql语句执行成功
1 row affected :表示影响的行数
0.00sec :表示执行时间
5.2:查询数据库列表
show databases;
5.3:选择数据库
use 数据库名称;
5.4:删除数据库
drop database 数据库名称;
5.6:创建用户
01.创建用户 只允许 本机 访问
CREATE USER 'xiaodoufu'@'localhost' IDENTIFIED BY 'xiaodoufu';
其他的机器也可以访问
CREATE USER 'xiaodoufu'@'%' IDENTIFIED BY 'xiaodoufu';
02.给用户授权
GRANT ALL PRIVILEGES ON *.* TO 'xiaodoufu'@'localhost';
03.让权限立即生效
FLUSH PRIVILEGES;
六:使用DDL语句操作数据表
6.1:数据类型
01. 数值类型
tinyint(M) 1字节
smallint(M) 2字节
mediumint(M) 3字节
int(M,D) 4字节
float (M,D) 4字节
double (M,D) 8 字节
Decimal (M,D) M+2字节
M:总位数,取值范围是1-65,默认值10.
D:小数位,取值范围是0-30,不能超过M的值!
Tinyint,smallint,mediumint,int都是整数类型!
Float,double 都是浮点类型!
Decimal 是精度最高的数值类型!
薪水存储一般都是用decimal来存储,因为精确性高!
如果定义了一个字段的类型是decimal(3,1)
那么这个字段的取值返回是 -99.9 到 99.9
02. 字符串类型
Char(M) M字节 固定长度的字符串,M的取值返回是0-255
如果插入的数据字节数不够,空格补全!
如果插入的数据字节数超过了M,自动截取多余的字节!
Varchar(M) 可变长度 M的取值返回是0-65535
如果插入的数据字节数不够不需要补全!
如果插入的数据字节数超过了M,自动截取多余的字节!
Tinttext: 取值返回是0-255! 微型文本串
Text :取值返回是0-65535! 文本串
03. 日期类型
Date YYYY-MM-DD current_date这个函数可以获取当前系统的年月日
Datetime YY-MM-DD hh:mm:ss
Timestamp YY-MM-DD hh:mm:ss CURRENT_TIMESTAMP这个函数也是设置系统默认时间
Time hh:mm:ss
Year YYYY 得到年份
注意点:
001.如果一个字段是日期类型,那么任何符号都可以作为日期的分隔符
比如
2017-02-01
2017+02+01
2017/02/01
2017.02.01
等 都是可以正确给日期类型的字段赋值成功!
002.CURRENT_DATE 这个函数获取当前系统的年月日
003. CURRENT_TIMESTAMP 这个函数获取系统 年月日 时分秒
004.CURRENT_TIME 这个函数获取系统 时分秒
005.有需求是创建一个字段来记录某条信息的最近修改时间,
那么我们可以在创建表的时候,就定义为
字段名称 timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
意思是说,只要有人修改这条信息的时候,这条信息的这个日期字段就会自动更新!
示例:
1. 创建表
2.新增两条数据
3.修改id为2的id为3
4.时间会自动更新
Enum类型
# 创建一个student表
CREATE TABLE IF NOT EXISTS student(
id INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学生编号',
`name` VARCHAR(10) NOT NULL UNIQUE KEY COMMENT '学生姓名',
sex ENUM('男','女') DEFAULT '男' COMMENT '学生性别'
)ENGINE='InnoDB' DEFAULT CHARSET='utf8' COMMENT '学生表';
6.2:创建表
1.语法
Create table [if not exists] 表名(
字段名称 数据类型 [字段属性|约束 ] [索引] [注释],
字段名称 数据类型 [字段属性|约束 ] [索引] [注释]
)[表类型][表字符集][注释];
2.注意点
01.如果创建的表名,字段等与数据库中的保留字冲突,建议使用 反引号(`)括起来!
Mysql自动生成的代码中,数据库,表名和字段都会使用 反引号(`)括起来!
02.DDL语句创建表的时候,多个字段之间使用逗号(,)隔开!最后一个字段无需逗号(,)
03. 单行注释 #
多行注释 /**/
04.表中的字段我们也称之为 列!
3. 有符号类型 和 无符号类型
有符号类型 :可以取负值
无符号类型:默认是0! 0--类型的长度
ZEROFILL属性:如果位数不够,前面用零补齐!
若某数值字段指定了ZEROFILL属性,
将自动添加UNSIGNED属性!
# 创建一个student表
CREATE TABLE IF NOT EXISTS student(
id INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学生编号',
`name` VARCHAR(10) NOT NULL UNIQUE KEY COMMENT '学生姓名',
sex VARCHAR(2) NOT NULL DEFAULT '男' COMMENT '学生性别'
)ENGINE='InnoDB' DEFAULT CHARSET='utf8' COMMENT '学生表';
# 新增字段
INSERT INTO student(id,`name`,sex) VALUES(10,'小白',DEFAULT);
INSERT INTO student(`name`,sex) VALUES('小黑',DEFAULT);
INSERT INTO student(`name`,sex) VALUES('小黑2',DEFAULT);
# 如果我们手动的更改了自动增长的列,那么下次自动增长的起点就变了
# 01.同时增加多条数据
INSERT INTO student(`name`,sex) VALUES('小黑1',DEFAULT);
INSERT INTO student(`name`,sex) VALUES('小黑2',DEFAULT);
INSERT INTO student(`name`,sex) VALUES('小黑3',DEFAULT);
INSERT INTO student(`name`,sex) VALUES('小黑4',DEFAULT);
# 02.同时增加多条数据
INSERT INTO student(`name`,sex) VALUES('小黑1',DEFAULT),('小黑2',DEFAULT),('小黑3',DEFAULT),('小黑4',DEFAULT);
# 查询当前数据库中所有的表
SHOW TABLES;
# 查询表的定义
DESC student;
DESCRIBE student;
6.3:字段的约束
为了保证数据的完整性,mysql中提供了约束机制!
常用的属性约束:
1.非空约束 not null
字段不允许为空!
2.默认约束 default
给字段设置默认值
3.唯一约束 unique key(UK)
设置字段的值是唯一。的允许有空值,但只能有一个!
4.主键约束 primary key(PK)
设置表中记录的唯一标识!一个表中不允许重复!
5.外键约束 foreign key(FK)
用于两个表之间建立关联关系!
注意点:
01.InnoDB引擎支持外键,MYISAM引擎不支持!
02.外键只能建立在从表中!
6.自动增长 auto_increment
01.一般用于主键,默认自增1
02.是整数类型
03.可设置初始值和步长
6.4:表和字段的注释
Create table 表名(
字段1 类型 comment 注释内容,
字段2 类型 comment 注释内容
)comment=’表的注释内容’
6.5:表的引擎
Create table 表名(
字段1 类型 comment 注释内容,
字段2 类型 comment 注释内容
)engine=’表的引擎’
6.6:表的编码
Create table 表名(
字段1 类型 comment 注释内容,
字段2 类型 comment 注释内容
)charset=’表的编码格式’
6.7:查询表
01.查询数据库的所有表
Show tables;
注意点: show tables之前必须先选择数据库!
02.查询表的定义
describe 表名; 或者 desc 表名;
6.8:修改表
01.修改表名
Alter table 旧表名 rename [to] 新表名;
02.给表中添加字段
Alter table 表名 add 字段名 数据类型[属性];
03.修改表中的字段
Alter table 表名 change 原字段名 新字段名 数据类型[属性];
04.删除字段
Alter table 表名 drop 字段名;
05.添加主键约束
Alter table 表名 add constraint 主键名 primary key 表名(字段名);
复合主键
将多列设置成主键!
-- 给成绩表设置复合主键
ALTER TABLE result ADD PRIMARY KEY pk_result (studentno,subjectno,examdate);
06.添加外键约束
Alter table 表名 add constraint 外键名 foreign key (外键字段名) references 关联表名(关联字段);
如果 现在有 两个表 ,比如说 一个是 teacher 一个是 Student
两表存在主外键关系!那么 不能直接删除teacher表!哪怕删除teacher表中的数据
也要考虑student表中是否有和老师对应的数据!
6.9:删除表
Drop table [if exists]表名;
七:MySql系统帮助
Help 查询内容;
上一篇: nodejs个人博客开发第六步 数据分页
下一篇: webpack构建的详细流程探底