赞
踩
数据库是一个以某种有组织的方式存储的数据集合。
数据库软件:DBMS(数据库管理系统)
数据库模型有:
- 关系型数据库:Oracle、MySQL
- NOSQL数据库(非关系型数据库):Redis
关系型数据库国内常用的有:
- Oracle
- MySQL
- MSSQLServer
- PostgreSQL
- Db2
SQL (发音为字母S-Q-L或sequel) 是结构化查询语言 (Structured Query Language)的缩写。SQL是一种专门用来与数据库通信的语言。
数据库是存储数据的仓库。
在数据库中这种文件称为表,用于存储各种数据。
横着的是行,在一行中所有竖着的就是列。
水平为行;垂直为列
列: 存储数据不同的属性
行: 根据列对对应列书写的一行数据
注意:
- 每一行都是由数量不等的列组成的。
- 一列称为一个「字段」
- 一行称为一条「数据」
数据类型就是在列中允许写的数据种类。
作用:
- 限制输入的内容,防止数据格式输入错误
- 还帮助正确地排序数据,并在优化磁盘使用方面起重要的作用。
- 表中每一行都应该有可以唯一标识自己的一列(或一组列) 。
- 将主键作为一张表中所有行数据的唯一标识符。
MySQL 是数据库软件(DBMS)的一种,属于关系型数据库。
为什么选择MySQL?
从公司运营角度来说,选择MySQL有多种原因,主要就是Oracle太贵,MySQL一开始并不是功能强大的数据库,但随着阿里巴巴将数据从Oracle数据库迁移到MySQL后,国内的社区和互联网公司就迅速开始对MySQL的应用和技术升级。到现在为止,国内公司使用MySQL主要从数据安全,稳定,技术服务,以及非常重要的价格上综合考虑成本问题,最终大多选择了MySQL。
从技术角度来看,MySQL 由于开源,可以带来两大优势:
- 可以更加了解软件运作的原理,更好的设置MySQL。一旦出了故障也可以准确定位。
- 可以更容易开发周边产品。
所以MySQL对于初创公司、互联网公司和很多传统行业不管从功能还是性能,又或者从成本角度考虑都是一个很好的选择。
数据库引擎是用于存储、处理和保护数据的核心服务 。MySQL的数据库引擎非常多,使用
SHOW ENGINES
就可以查看当前的数据库引擎信息。
SHOW ENGINES; --查看MySQL的数据库引擎
InnoDB与MyISAM数据库引擎的区别
- 存储结构
- MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
- InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。
- 存储空间
- MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
- InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。
- 可移植性、备份及恢复
- MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
- InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。
- 事务支持
- MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
- InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
- AUTO_INCREMENT
- MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
- InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。
- 表锁差异
- MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
- InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。
- 全文索引
- MyISAM:支持 FULLTEXT类型的全文索引
- InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
- 表主键
- MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
- InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。
- 表的具体行数
- MyISAM:保存有表的总行数,如果select count(*) from table;会直接取出出该值。
- InnoDB:没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。
- CURD操作
- MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
- InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。
- 外键
- MyISAM:不支持
- InnoDB:支持
MySQL 版本分为四种:Alpha版、Beta版、RC版(Release Candidate)、GA版(Generally Available)。
- 1. Alpha版
Alpha版软件,这是软件工程对软件开发过程软件版本定义使用的版本说明。Alpha是内部测试版,一般不向外部发布,会有很多Bug.除非你也是测试人员,否则不建议使用.是希腊字母的第一位,表示最初级的版本,alpha 就是α。- 2. Beta版
Beta版软件,这也是软件工程中对软件开发测试版本控制的版本说明。Beta一般是Alpha后面的版本。该版本相对于α版已有了很大的改进,消除了严重的错误,但还是存在着一缺陷,需要经过多次测试来进一步消除。这个阶段的版本会一直加入新的功能。beta 就是β。- 3. RC版
RC版,RC即Release Candidate的简写。这是Beta后面的版本,一般RC版并没有新增功能,而是修复了一些反馈的Beta中存在的BUG。所以RC版更接近最终发行版即稳定版(GA版)- 4. GA版
GA版,GA即Generally Available的简写。这就是软件最终的发行版。这个版本一般BUG相对较少。这个发行版也可以叫稳定版。- Release版
Release版,在有些软件存在,在MySQL中一般没有这个版本。该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本。该版本有时也称为标准版。一般情况下,Release不会以单词形式出现在软件封面上,取而代之的是符号®。
1. MySQL Community Server
- MySQL Community Server是社区版本,开源免费,但不提供官方技术支持。
- 遵循GPL协议。MySQL Community Server也是我们通常用的MySQL的版本。根据不同的操作系统平台细分为多个版本。
2. MySQL Enterprise Edition
- MySQL Enterprise Edition企业版本,需付费,可以试用30天。
3. MySQL Cluster
- MySQL Cluster集群版,开源免费。
- 可将几个MySQL Server封装成一个Server。MySQL Cluster CGE 高级集群版,需付费。
4. MySQL Workbench(GUI TOOL)
- MySQL Workbench(GUI TOOL)一款专为MySQL设计的ER/数据库建模工具。它是著名的数据库设计工具DBDesigner4的继任者。
- MySQL Workbench又分为两个版本:
①、社区版(MySQL Workbench OSS)
②、商用版(MySQL Workbench SE)
选择操作系统,然后选择最下面的下载版本。这里直接选择 Windows (x86, 64-bit), ZIP Archive 版本。
同意许可,点击NEXT
只安装MySQL服务器,然后点击NEXT
选择第一个独立的MySQL服务器,点击NEXT
配置默认即可。
- 注意:Port端口号为3306,在以后访问 MySQL 服务器的时候是需要这个端口号,因此端口号绝对不要记错。
- Open Windows Firewall ports for network access默认是将网络访问许可添加到防火墙规则的,请不要取消。
这里的密码,在之后的数据库连接和JDBC的连接时都会用到。
默认的服务名是 MySQL57 (), 随着系统开机自动启动。在这里可修改这2个选项。但是需要注意的是,服务名在启动服务的时候是需要的。
如果全部都是绿色对勾,就说明配置正常应用并且正常启动 MySQL 服务器了。(当绿色对勾到Starting the server时,即使后边报红,MySQL也算安装完成可以使用)
MySQL 服务器自带了 CLI 客户端,其中一个使用 Unicode 编码进行连接,可以防止出现乱码
启动任意一个客户端,在提示下输入密码(该密码为管理员账户root的密码)
密码验证通过后,即可使用 MySQL
查看 MySQL 服务器的版本
在提示符下,输入 SQL:
select version(); --这个SQL是用于查看安装的MySQL服务器版本
环境变量的设置是为了让我们在任意位置,通过 cmd 可以直接访问 mysql.exe程序。如果没有这个需求就不用配置了。
此电脑 —> 属性 —> 高级系统配置 —> 环境变量
选择下面
系统变量
中的 Path,双击或者点击编辑按钮
添加 MySQL 服务器的安装路径,然后在最后加上 bin 文件夹
配置完成后,点击确定按钮。然后重新打开一个 cmd 程序,输入 mysql ,如果有提示就证明配置正确。
分类:
- Navicat for MySQL(看名字只能连接MySQL)
- Navicat premium(可以连接各种数据库)
- DataGrip (功能强大,但是安装包体积也大,有300多M,需要JRE才能运行)
- SQLyog
- phpMyAdmin ( 网页版,需要有PHP环境 )
- workbench
…
这里选择的是 Navicat premium ,这是一款收费软件。默认可以全功能试用 30 天。
安装过程略… ,一路下一步即可
打开 Navicat,建立一个连接
从图上可以看到,这款程序支持很多数据库,这里我们选择 MySQL
输入完成后,可以点击左侧连接测试按钮,查看连接是否成功。没有问题的话,点击确定,设置就会进行保存。
MySQL支持多种不同的编码,我们常用的是UTF8和UTF8MB4,如果是已经存在的数据库,根据数据库编码存储格式即可,如果是新创建的数据库,还是建议使用UTF8MB4。
UTF8支持长度3的汉字,但是不支持长度4的汉字,是不完全的UTF8解决方案。MySQL团队并没有对其进行修改,而是使用UTF8MB4支持了完整的UTF8。
参数名称 | 参数说明 | 缺省值 | 最低版本要求 |
---|---|---|---|
user | 数据库用户名(用于连接数据库) | ||
password | 用户密码(用于连接数据库) | ||
useUnicode | 是否使用Unicode字符集,如果参数characterEncoding设置为gb2312 或 utf8 ,本参数值必须设置为true | false | 1.1g |
characterEncoding | 当useUnicode设置为true时,指定字符编码。比如可设置为gb2312 或 utf8mb4 | false | 1.1g |
autoReconnect | 当数据库连接异常中断时,是否自动重新连接? | false | 1.1 |
autoReconnectForPools | 是否使用针对数据库连接池的重连策略 | false | 3.1.3 |
failOverReadOnly | 自动重连成功后,连接是否设置为只读? | true | 3.0.12 |
maxReconnects | autoReconnect设置为true时,重试连接的次数 | 3 | 1.1 |
initialTimeout | autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒 | 2 | 1.1 |
connectTimeout | 和数据库服务器建立socket连接时的超时,单位:毫秒。 0表示永不超时,适用于JDK 1.4及更高版本 | 0 | 3.0.1 |
socketTimeout | socket操作(读写)超时,单位:毫秒。 0表示永不超时 | 0 | 3.0.1 |
allowMultiQueries | mysql驱动开启批量执行sql的开关 | false | |
allowMultiQueries | mysql驱动开启批量执行sql的开关 | false | |
serverTimezone | mysql8增加的时区属性,开发时必须指定 |
常用的参数:
useUnicode=true
characterEncoding=utf8 / characterEncoding=utf8mb4 如果是新创建的数据库,请用 utf8mb4 编码
serverTimezone=Asia/Shanghai 开发的时候指定上海时区,连接MySQL8必填参数
my.ini是MySQL数据库中使用的配置文件,修改这个文件可以达到更新配置的目的
windows (win7 以后)
如果找不到,就打开
隐藏的项目
,可能ProgramData文件夹被隐藏了
Date文件夹中存放的是数据库存储的数据,一般由my.ini进行配置
或者在C:\ProgramData\MySQL\MySQL Server 5.7
内部会保存默认的表文件以及文件夹(每新建表都会创建新的对应文件夹)
每创建一个表都会创建对应的3个文件
- .frm文件存储表定义。
- 数据文件的扩展名为.MYD (MYData)。
- 索引文件的扩展名是.MYI (MYIndex)。
[mysqld] ; 设置3306端口 port=3306 ; 设置mysql的安装目录 basedir="C:/Program Files/MySQL/MySQL Server 5.7/" ; 设置mysql数据库的数据的存放目录 datadir=C:/ProgramData/MySQL/MySQL Server 5.7/Data ; 允许最大连接数 max_connections=200 ; 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统 max_connect_errors=10 ; 服务端使用的字符集默认为UTF8 character-set-server=utf8 ; 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB ; 默认使用“mysql_native_password”插件认证 default_authentication_plugin=mysql_native_password [mysql] ; 设置mysql客户端默认字符集 default-character-set=utf8 [client] ; 设置mysql客户端连接服务端时默认使用的端口 port=3306 default-character-set=utf8
1.手动。
2.cmd–> services.msc 打开服务的窗口
3.使用管理员打开cmd
- net start mysql : 启动mysql的服务
- net stop mysql:关闭mysql服务
mysql -h连接Ip -u账号 -p密码
- -uroot : 其中 root 是账号名
- -p0000:后面的 4个0是登陆密码
- -h 连接数据库的Ip(默认为localhost)
1.exit
2.quit
3.直接退出
如果连接非本机ip数据库连接失败,可能是没有开启远程访问的关系
在本机连接成功后执行如下sql 开启远程连接
- 1.把root的host字段设置成 %,表示所有ip都可以连接
update user set host='%' where user='root';
- 2.刷新权限
flush privileges;
打开连接后,在图形客户端可以直接看到4个数据库,这是 MySQL 服务器安装后的默认数据库:
数据库 | 说明 |
---|---|
infomation_schema | 记录了数据库当中大部分我们需要了结的信息,比如字符集,权限相关,数据库实体对象信息,外检约束,分区,压缩表,表信息,索引信息,参数,优化,锁和事物等 |
mysql | 核心数据库 !主要负责存储数据库的用户、权限设置、关键字等mysql自己需要使用的控制和管理信息,不可以删除 |
performance_schema | 用于监控MySQL server在一个较低级别的运行过程中的资源消耗、资源等待等情况 |
sys | 快速的了解系统的元数据信息 |
show databases;
由于拥有多个库,所以在使用时不知道对那个库进行使用,所以在执行使用的语句之前,先执行选择对应库的语句
use `数据库名`
# 查询某个数据库中所有的表名称
show tables;
# 查询表结构
desc 表名;
关系型数据库操作数据需要使用 SQL 语言(结构化查询语言 Structured Query Language)。
名称 | 作用 |
---|---|
数据定义语言(Data Definition Language,DDL) | 用于创建、修改和删除数据库对象,如CREATE TABLE、ALTER TABLE、DROP TABLE等。DDL语句会自动提交事务 |
数据操纵语言(Data Manipulation Language,DML) | 用于操纵数据库,包括INSERT、UPDATE、DELETE等 |
数据查询语言(Data query Language,DQL) | 用于执行SELECT查询操作 |
数据控制语言(Data Control Language,DCL) | 用于执行授予权限和撤销权限的操作,包括GRANT(授予权限)、REVOKE(撤销权限)两条命令。DCL语句会自动提交事务 |
事务控制语言(Transactional Control Language,TCL) | 用于维护数据的一致性,包括COMMIT(提交事务)、ROLLBACK(回滚事务)和SAVEPOINT(设置保存点)3条语句 |
通过以上 4 类 SQL 语言进行数据库和数据的操作
- SQL 语句可以单行或多行书写,以分号结尾。
- 可使用空格和缩进来增强语句的可读性。
- MySQL 数据库的 SQL 语句不区分大小写,关键字建议使用大写。
- 3 种注释
* 单行注释: – 注释内容 或 # 注释内容(mysql 特有)
* 多行注释: /* 注释 */
- (Data Definition Language,DDL)数据库定义语言
- 用于对数据库、表创建、修改、删除操作
# 创建数据库:
create database 数据库名称;
# 创建数据库,判断不存在,再创建:
create database if not exists 数据库名称;
# 创建数据库,并指定字符集
create database 数据库名称 character set '编码';
CHARACTER SET ‘编码’;可以省略,会使用默认编码
# 删除数据库
drop database 数据库名;
# 判断数据库存在,存在再删除
drop database if exists 数据库名称;
# 修改数据库的字符集
alter database 数据库名称 character set 字符集名称;
# 创建表
create table 表名(
第1列名 数据类型(长度) 其他,
第2列名 数据类型(长度) 其他,
第n列名 数据类型(长度) 其他
);
# 复制表:
create table 表名 like 被复制的表名;
注意:最后一列,不需要加逗号(,)
drop table 表名;
drop table if exists 表名 ;
# 修改表名
alter table 表名 rename to 新的表名;
# 修改表的字符集
alter table 表名 character set 字符集名称;
# 添加一列
alter table 表名 add 列名 数据类型;
# 修改列名称 类型
alter table 表名 change 列名 新列别 新数据类型;
alter table 表名 modify 列名 新数据类型;
# 删除列
alter table 表名 drop 列名;
- (Data Manipulation Language,DML)数据库操作语言
- 用于数据库中表数据的添加、修改、删除操作
为所有列进行数据赋值,也可以只为某些列进行赋值,其他没有设置的列设置为null
insert into 表名(列名1,列名2,列名n) values(列名1的值,列名2的值,列名n的值)
如果在进行赋值时就是为所有的列赋值,那么乐意省略列名直接赋值
insert into 表名 values(列名1的值,列名2的值,列名n的值)
如果一次想进行多条语句的赋值,那么可以在values后面继续书写
insert into 表名(列名1,列名2,列名n) values(列名1的值,列名2的值,列名n的值),(列名1的值,列名2的值,列名n的值),(列名1的值,列名2的值,列名n的值);
如果没有书写where 会将所有数据对应列都改为指定数据
update 表名 set 更新数据的列名 = 新值,更新数据的列名 = 新值... where 条件;
delete from 表名 where 条件;
- (Data Control Language)数据库控制语言
- 用于数据库账号的创建以及相应权限的添加
(在实际开发中一般不会书写这类语言)
管理用户
1. 添加用户: * 语法:CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; 2. 删除用户: * 语法:DROP USER '用户名'@'主机名'; 3. 修改用户密码: UPDATE USER SET PASSWORD = PASSWORD('新密码') WHERE USER = '用户名'; UPDATE USER SET PASSWORD = PASSWORD('abc') WHERE USER = 'lisi'; SET PASSWORD FOR '用户名'@'主机名' = PASSWORD('新密码'); SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123'); * mysql中忘记了root用户的密码? 1. cmd -- > net stop mysql 停止mysql服务 * 需要管理员运行该cmd 2. 使用无验证方式启动mysql服务: mysqld --skip-grant-tables 3. 打开新的cmd窗口,直接输入mysql命令,敲回车。就可以登录成功 4. use mysql; 5. update user set password = password('你的新密码') where user = 'root'; 6. 关闭两个窗口 7. 打开任务管理器,手动结束mysqld.exe 的进程 8. 启动mysql服务 9. 使用新密码登录。 4. 查询用户: -- 1. 切换到mysql数据库 USE mysql; -- 2. 查询user表 SELECT * FROM USER; * 通配符: % 表示可以在任意主机使用用户登录数据库
权限管理
1. 查询权限:
-- 查询权限
SHOW GRANTS FOR '用户名'@'主机名';
SHOW GRANTS FOR 'lisi'@'%';
2. 授予权限:
-- 授予权限
grant 权限列表 on 数据库名.表名 to '用户名'@'主机名';
-- 给张三用户授予所有权限,在任意数据库任意表上
GRANT ALL ON *.* TO 'zhangsan'@'localhost';
3. 撤销权限:
-- 撤销权限:
revoke 权限列表 on 数据库名.表名 from '用户名'@'主机名';
REVOKE UPDATE ON db3.`account` FROM 'lisi'@'%';
(Transactional Control Language)事务控制语言
TCL 用于维护数据的一致性,共有3条语句:
- 1.COMMIT(提交事务)
- 2.ROLLBACK(回滚事务)
- 3.SAVEPOINT(设置保存点)
在开发中一般会通过书写java代码的形式进行事务的操作,一般不会通过sql语句进行事务的操作
CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), balance DOUBLE ); -- 添加数据 INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000); SELECT * FROM account; UPDATE account SET balance = 1000; -- 张三给李四转账 500 元 -- 0. 开启事务 START TRANSACTION; -- 1. 张三账户 -500 UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan'; -- 2. 李四账户 +500 -- 出错了... UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi'; -- 发现执行没有问题,提交事务 COMMIT; -- 发现出问题了,回滚事务 ROLLBACK;
- (Data query Language)数据查询语言
- 是sql中最常用的语法,用于数据库的数据查询,可以根据查询语法的不同返回相应的不同数据
select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 order by 排序 limit 分页限定
每日一点点进步
不进则退
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。