# MySql
# 什么是数据库
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库
热门数据库
- Oracle
 - SQLServer
 - MySQL
 - MongoDB
 - SQLite
 - access
 - DB2
 
# 结构化的数据
小明的自我介绍:
我是一个热爱生活的人,很乐观,我今年刚从清华大学毕业,我学的专业是前端开发,我目前还是单身,并没有女朋友,欢迎大家跟我交朋友,谢谢!
仔细阅读上面这段话,如果让你提取这段文字的中心意思,你能做到吗?
我相信对一个正常人来说都不是难事。可是,这段话如果交给计算机去处理呢? 计算机没有人类的思维,这件事对它来讲恐怕就太难了,因此,有时候我们才需要将数据结构化。
结构化的数据是什么样子呢?以上面那段话为例,我们将它的信息提取出来,以表格的形式展现:
| 姓名 | 年龄 | 性别 | 性格 | 所在地 | 毕业院校 | 专业 | 
|---|---|---|---|---|---|---|
| Lucy | 20 | 女 | 乐观 | 广州 | 清华大学 | 前端开发 | 
| Marco | 18 | 男 | 完美 | 广州 | 蓝翔职业技术学校 | 挖掘机 | 
这样一来,我们把一段复杂的信息,进行了结构化处理,瞬间显得清爽多了。计算机处理起来也相当方便。 因此,这样的数据,我们就称之为结构化数据。
# 关系型数据库
是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据
| 姓名 | 身份证 | 银行卡号 | 余额 | 消费记录 | 
|---|---|---|---|---|
| Marco | 450721200205012611 | 888869689898 | 865424.00 | 2016.11.1 6000买iphone7  2016.12.20 5800买note7 2017.1.1 1665800买飞机  | 
这样的数据看起来是不是很别扭呢? 因为它查询起来极不方便。
因此我们把它改造一下(把用户和消费记录分开):
| 编号 | 姓名 | 身份证 | 银行卡号 | 余额 | 
|---|---|---|---|---|
| 1 | Marco | 450721199805012611 | 888869689898 | 865424.00 | 
| 2 | Lucy | 460751198007125628 | 888869689898 | 26424.00 | 
| 编号 | 时间 | 消费金额 | 备注 | 用户编号 | 
|---|---|---|---|---|
| 1 | 2016.11.1 | 6000 | 买iphone7 | 1 | 
| 2 | 2016.12.20 | 5800 | 买note7 | 1 | 
| 3 | 2017.1.1 | 1665800 | 买飞机 | 2 | 
我们把用户账号的信息,和消费记录信息分离开来,通过用户编号进行了关联 既把不同的数据进行了分离,使得查询数据更加方便。同时又保证了它们关系的正确性。
这就是传统的关系型数据库。 其中 <用户编号> 我们称之为外键
# 表(table)
一个数据库通常包含一个或多个表,一个数据表有一个唯一名称,并由行和列组成。
表(table) 是数据库中一个重要的组成部分, 数据库只是一个框架,数据表才是其实质内容。
- 表结构
身份ID 姓名 性别 年龄 1 刘备 男 40 2 关羽 男 36 3 貂蝉 女 18 4 张飞 男 30  
# MySql的特点
MySql是目前最流行的关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司
- MySQL是开源的,免费。
 - MySQL支持标准的SQL数据语句
 - MySQL可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
 - MySQL对PHP有很好的支持,PHP是目前最流行的Web开发语言。
 - MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
 
# 数据库操作
# 表操作
- 连接数据库 
格式:mysql -h主机地址 -u用户名 -p用户密码 - 显示所有数据库 
格式:show databases; - 创建数据库 
格式:create database <数据库名>; - 使用数据库 
格式:use <数据库名>; - 显示当前数据库所有表 
格式:show tables; - 创建数据表 
格式:create table <表名> (<字段名1> <类型1> [,..<字段名n> <类型n>]);以上创建一个名为 “MyGuests” 的表,包含5个列: “id”, “firstname”, “lastname”, “email” 和 “reg_date”,参数如下:create table MyGuests ( id int(6) unsigned auto_increment primary key, firstname varchar(30) not null, lastname varchar(30) not null, email varchar(50), reg_date timestamp )- 数据类型:
- INT(整型),
 - FLOAT(浮点),
 - CHAR(固定长度字符串),
 - VARCHAR(可变长度字符串),
 - BLOB(二进制),
 - TEXT(字符串)
 - TIMESTAMP(时间戳)
 
 - 列的其他属性
- NOT NULL - 每一行都必须含有值(不能为空),null 值是不允许的。
 - DEFAULT value - 设置默认值
 - UNSIGNED - 使用无符号数值类型,0 及正数
 - AUTO_INCREMENT - 设置 MySQL 字段的值在新增记录时每次自动增长 1
 - PRIMARY KEY - 设置数据表中每条记录的唯一标识。 通常列的 PRIMARY KEY 设置为 ID 数值,与 AUTO_INCREMENT 一起使用。
 
 
 - 数据类型:
 - 删除表: 
格式:drop table <表名>;drop table MyGuests; drop table if exists MyGuests - 查询表结构: 
desc MyGuests - 修改表名。 
rename table MyClass to YouClass; - 增加字段 
alter table MyGuests add sku_id bigint(20) unsigned DEFAULT NULL COMMENT '商品销售码'; - 复制表结构: 
create table table1 like table; 
# 数据操作
- 插入数据 
格式:insert into <表名> [(<字段名1>[,..<字段名n > ])] values ( 值1 )[, (值n )];//单条数据 insert into MyGuests (firstname, lastname, email) values ('John', 'Doe', 'john@example.com') - 删除表数据 
格式:delete from 表名 where 表达式//删除MyGuests表中id为1的数据 DELETE FROM MyGuests where id=1; //删除所有数据 DELETE FROM MyGuests - 查询表中的数据 
格式:select <字段1, 字段2, …> from < 表名 > where < 表达式 >;//查看表 MyGuests 中所有数据 select * from MyGuests; //查看表 MyGuests 中前10行数据: select * from MyGuests order by id limit 0,10;select一般配合where使用,以查询更精确更复杂的数据。
 - 修改表中的数据。 
格式:update 表名 set 字段=新值,… where 条件;update MyGuests set name='Mary' where id=1; - 条件控制语句 
- WHERE 语句:
SELECT * FROM tb_name WHERE id=3; - HAVING 语句:
SELECT * FROM tb_name GROUP BY score HAVING count(*)>2 - 相关条件控制符:
- =、>、<、<>、IN(1,2,3......)、BETWEEN a AND b、NOT
 - AND 、OR
 - LIKE用法中
- % 匹配任意、
 - _ 匹配一个字符(可以是汉字)
 
 
 - IS NULL 空值检测
 
 - WHERE 语句:
 
# php操作数据库
# 连接 MySQL
PHP 5 及以上版本建议使用以下方式连接 MySQL :
- MySQLi extension (“i” 意为 improved) 
安装:Linux 和 Windows: 在 php5 mysql 包安装时 MySQLi 扩展多数情况下是自动安装<?php $servername = "localhost"; $username = "username"; $password = "password"; $dbname = 'user'; // 创建连接 $conn = new mysqli($servername, $username, $password, $dbname); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } //查询前设置编码,防止输出乱码 $conn->set_charset('utf8'); echo "连接成功"; ?> - 执行sql语句查询结果集
//编写sql语句 $sql = 'select * from student'; //获取查询结果集 $result = $conn->query($sql); //使用查询结果集 //得到json字符串 $row = $result->fetch_all(MYSQLI_ASSOC); //释放查询结果集,避免资源浪费 $result->close(); //把结果输出到前台 echo json_encode($row); // 关闭数据库,避免资源浪费 $conn->close(); 
# 插入数据
INSERT INTO 
- 单条数据
$sql = "INSERT INTO MyGuests (firstname, lastname, email) VALUES ('John', 'Doe', 'john@example.com')"; if ($conn->query($sql) === TRUE) { echo "新记录插入成功"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } - 多条数据
$sql = "INSERT INTO `projects` (`name`, `url`, `description`) VALUES "; foreach ($projects as $item) { $sql .= "('$item',NULL, NULL),"; } $sql = substr($sql,0,-1); if ($conn->query($sql) === TRUE) { echo "新记录插入成功"; } else { echo "Error: " . $sql . "<br>" . $conn->error; } 
# 读取数据
SELECT…FROM
$sql = "SELECT id, firstname, lastname FROM MyGuests";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
  // 输出每行数据
  while($row = $result->fetch_assoc()) {
    echo "<br> id: ". $row["id"]. " - Name: ". $row["firstname"]. " " . $row["lastname"];
  }
} else {
  echo "0 个结果";
}