MySQL简介

- 使用MySQL
- 设计数据库
数据库定义: 对大量数据进行管理的高效解决方案, 按照数据结构来组织, 存储和管理数据的库
DBS = DBMS + DBA
DBS: database system
DBMS datebase management system
DBA: database administrator
SQL: 结构化查询语言(Structured Query Language)
CRUD: Create, read, update and delete
数据库系统(DBS) = 数据库管理系统(DBMS) + 数据库(DB) + 数据库管理员(DBA)

MySQL
- 开源, 常用于web应用
- 关系型数据库(RDBMS)
- 基于C/S架构(客户端/服务器端)
关系型数据库关键概念
关系模型
- 数据结构可以规定, 同类数据, 结构一致, 就是一个二维表格
- 数据之间的关系可以设定, 实体之间的联系
MySQL中的TABLE的索引从 0 开始
数据库:数据仓库
表: 数据保存在表类, 保存在一个表内的数据应该有相同的格式
记录: 表的某一行数据, 行记录数据, \(\color {red}{关系型数据库必须以行为单位进行数据读写}\)
字段: 表的某个列, 列规定数据格式
SQL语句
SQL: DBMS 管理数据库的语言, 结构化查询语言, SQL语句以分号 ";" 结尾
请注意,SQL 语句不区分关键字大小写,因此 SELECT 与 select 是相同的。同样,写成 Select 也没有关系。许多SQL开发人员喜欢对所有SQL关键字使用大写,而对所有列和表名使用小写,这样做使代码更易于阅读和调试。但是插入表中的数据时区分大小写的.
DDL(Data Definition Language, 数据定义语言): create, drop, alter 数据库,表等对象
DML(Data Manipulation Language, 数据操纵语言): select, insert,update,delete 表中数据
DCL(Data Control Language, 数据控制语言):确认或者取消对数据库中的数据进行更改操作, 如 commit, rollback, grant, revoke
注释语句
- 一行注释: 书写在 "--" 之后, 只能写在同一行.
- 多行注释: 书写在"/" 与 "/"之间, 可以跨多行
实体之间的关系
1:1 :
学生常用信息表 <-> 学生详细信息表
两个实体类, 存在相同的主键
如果记录的主键值与另一个表内记录的主键值一一对应, 则两条记录对应.
(优化)垂直分割
1:n :
一个实体, 对应多个其他实体
如 班级对应学生
设计:
在多的那端, 增加一个字段, 用于指向该实体所属的另外实体标识(主键).
m:n:
多对多
如: 老师和班级的对应关系
设计:
典型的, 利用一个中间表表示实体之间的对应关系
中间表设计:
将多对多分解为 1对多
中间表的每个记录表示一个关系;
n ----> 1
Mac 上开启 MySQL
将 MySQL_HOME 加入到 .bash_profile 文件系统路径PATH
中
启动MySQL服务
sudo /usr/local/MySQL/support-files/mysql.server start
停止MySQL服务
sudo /usr/local/mysql/support-files/mysql.server stop
重启MySQL服务
sudo /usr/local/mysql/support-files/mysql.server restart
cat ~/.mysql_history 即可以看到以前的命令历史。
基本命令 SHOW
HELP SHOW;
CREATE DATABASE crashcourse;
USE crashcourse;
SHOW DATABASES;
SHOW TABLES;
SHOW COLUMNS FROM customers;
DESCRIBE customers;
SHOW GRANTS;
SHOW STATUS;
MySQL 数据库操作
连接 MySQL Sever端
mysql -uroot -p
show databases
SQL:
针对操作对象不同, 分成不同语言
- 数据操作(管理)语言(DML)
- 查询 DQL 数据查询语言
- 增删改 DML 数据管理语言
- 数据定义语言(对保存数据的格式进行定义)(DDL)
- 数据库控制语言(针对数据库软件服务进行操作)(DCL)
数据库(表(记录))
创建数据库操作
语句使用分号;
语句结束符
创建数据库
create database db_name [数据库选项];
每创建一个数据库, 就会在 MySQL 的 data
目录下形成一个目录, 目录名是数据库名
有一个文件 db.opt, 保存数据库的选项信息.
标识符(数据库名)命名规则:
- 大小写敏感性取决于当前操作系统(认为是区分的)(windows不区分, linux区分)
- 见名知意, 推荐使用下划线方式
- 使用任意字符, 数字, 符号, 甚至是中文, 但是一些特殊的特殊组合, 例如纯数字, 特殊符号, 关键字, 应该使用标识符限定符(反引号)包裹
create database `1234`;
create database `create`;
create database `阿猫`;
设置字符集
set names gbk;
显示数据库
show databases;
并非只有用户才能设置数据库, MySQL内部有自己的维护的数据库
查看数据库的创建语句
show create database db_name
删除数据库
drop database db_name
修改数据库属性
alter database db_name
重命名数据库
创建新数据库->所有表复制到新数据库->删除旧数据库
校对规则
show variables like character_set%
character_set_client 客户端发送数据编码
character_set_result 客户端接收数据编码
character_set_database 当前默认数据库的编码
character_set_server 服务器编码
character_set_syatem 标识符编码
校对规则
每一套编码字符集都有与之相关的校对规则.
什么是校对规则? 在当前编码下, 字符之间的比较顺序是什么.
每个字符集都提供一个或者多个校对规则. 通常的命名规则是:
字符集_语言名_ci|cs|bin
常见ci, 不区分大小写; cs 区分大小写; bin编码比较
每个字符集都有默认的校对规则, 不指定, 就是用该默认规则.
查看校对规则
show collation
设置字符集时, 可以设置当前字符集所采用的校对规则, 如果不设置采用默认.
create table kitty(
name varchar(20)
) character set gbk collate gbk_chinese_ci;
create table hello(
name varchar(20)
) character set gbk collate gbk_bin;
insert into kitty values("a");
insert into kitty values("B");
insert into kitty values("c");
insert into hello values("a");
insert into hello values("B");
insert into hello values("c");
select * from kitty order by name;
select * from hello order by name;
备份
方案一
Myisam
拷贝备份, 还原时拷贝到相应数据库目录就好了
只适用于 Myisam
方案二
通用方案:
将建立表结构与插入数据的sql语句保存, 下次如果需要该结构和数据直接将数据语句执行即可
利用MySQL工具集完成 mysqldump.sh
备份数据库
mysqldump -uroot -p php_one> 'e:/php_one.sql'
备份数据库表
mysqldump -uroot -p php_one teacher_class> 'e:/php_one_teacher_class.sql'
还原
将之前的sql语句执行一次
- 在 MySQL 客户端直接创建语句就行了
- 使用 source 语句可以执行sql脚本
NoSQL
Not Only SQL
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
NoSQL数据库的四大分类表格分析
分类 | Examples举例 | 典型应用场景 | 数据模型 | 优点 | 缺点 |
---|---|---|---|---|---|
键值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 内容缓存,主要用于处理大量数据的高访问负载,也用于一些日志系统等等。 | Key 指向 Value 的键值对,通常用hash table来实现 | 查找速度快 | 数据无结构化,通常只被当作字符串或者二进制数据 |
列存储数据库 | Cassandra, HBase, Riak | 分布式的文件系统 | 以列簇式存储,将同一列数据存在一起 | 查找速度快,可扩展性强,更容易进行分布式扩展 | 功能相对局限 |
文档型数据库 | CouchDB, MongoDb | Web应用(与Key-Value类似,Value是结构化的,不同的是数据库能够了解Value的内容) | Key-Value对应的键值对,Value为结构化数据 | 数据结构要求不严格,表结构可变,不需要像关系型数据库一样需要预先定义表结构 | 查询性能不高,而且缺乏统一的查询语法。 |
图形(Graph)数据库 | Neo4J, InfoGrid, Infinite Graph | 社交网络,推荐系统等。专注于构建关系图谱 | 图结构 | 利用图结构相关算法。比如最短路径寻址,N度关系查找等 | 很多时候需要对整个图做计算才能得出需要的信息,而且这种结构不太好做分布式的集群方案 |
对象型数据库
ORM: 对象关系映射