FavoriteLoading
0

重蔚自留地php学习第三十五天——mysql基础1

文件操作:目录操作,文件操作

目录操作步骤:

  1. 准备一个目录(路径)
  2. 判断一个路径是否是一个目录
  3. 打开目录opendir,返回一个目录资源,包含当前目录下所有的文件
  4. 遍历目录资源,循环+readdir,每次获得一个文件名,将资源指针下移一位
  5. 关闭资源closedir

 

文件操作步骤:

  1. 准备一个文件路径
  2. 判断一个路径是否是一个文件
  3. 打开文件,获得其中内容
  4. a) PHP5:file_get_contents,file将文件按照行进行获取返回一个数组
  5. b) PHP4:打开资源fopen(文件名,Mode),fgetc获取一个字符,fgets获取指定长度或者一行,fread获取指定长度
  6. 写入内容
  7. a) PHP5:file_put_contents(文件名,字符串,Mode),Mode:追加,起始位置插入
  8. b) PHP4:fwrite,fputs,往文件中插入数据(数据插入位置默认由fopen决定)
  9. c) Fseek:将文件的指针指向指定的位置。
  10. 关闭文件,fclose

 

文件操作相关函数

 

Scandir:获取指定目录下所有的文件,以数组形式返回

如果自定义遍历目录?(笔试的时候经常出现)

  1. 写一个函数遍历一个文件夹下的所有文件
Function myScandir($dir = “.”){

//定义一个数组,接收遍历的所有结果

$arr = array();

 

//循环遍历当前文件夹下所有文件

$o = opendir($dir);

While($filename = readdir($o)){

//每次得到一个文件

$arr[] = $filename;

}

 

//返回

Return $arr;

}
  1. 如果当前文件夹内,还有子文件夹,需要进入子文件夹再次进行遍历
//可以采用遍历当前文件夹的内容的形式来判断,但是很难做到全部遍历

Foreach($arr as $value){

//拼凑一个路径

$dir .= ‘/’ . $value;

//判断路径

If(is_dir($dir)){

//是一个路径

$subarr = myScandir($dir);

}

}

 

递归调用函数本身

Function myScandir($dir = “.”){

//定义一个数组,接收遍历的所有结果

Static $arr = array();

 

//循环遍历当前文件夹下所有文件

$o = opendir($dir);

While($filename = readdir($o)){

//将.和..必须去除

If($filename == ‘.’ || $filename == ‘..’)

{

$arr[] = $filename;

}else{

//每次得到一个文件

$arr[] = $filename;

//也许当前文件是一个文件夹,那么需要更深层次的遍历

If(is_dir($dir . ‘/’ . $filename)){

//子文件夹与当前文件夹有同样的结构,只需要调用当前函数本身即可

myScandir($dir . ‘/’ . $filename);

}

}

}

//返回

Return $arr;

}

 

递归:函数内部调用自己

递归有两个要素:递归出口,递归点

递归出口:当条件达到指定要求时,函数不在进行递归调用

递归点:子问题与父问题结构一

Mysql基础知识和应用

Mysql课程体系

Mysql基础知识和应用

这部分最重要,主要了解数据的操作和基本原理

大型数据库优化

主要是讲如何提高数据库的效率,索引,分表(垂直分表,水平分表)

数据库部署

如何对大型数据库进行服务器部署,服务器集群,负载均衡

 

有几个概念需要了解:

数据库:Database存放数据的仓库,高效率存储和处理数据的软件(狭义的理解)

广义的讲,凡是能够存储数据的介质都称之为数据库

数据库管理系统:Database Management System,DBMS,管理数据库的系统

数据库系统:Database System = DBMS + DB

系统管理员:Database Administrator DBA,负责日常数据库的维护(部署)

 

数据库有两大阵营:关系型数据和非关系型数据库

 

关系型数据库:建立在关系模型上的数据库

关系模型:通过数据结构,数据关系,数据约束三部分构成

关系模型可以理解为是一张二维表,关系指的是二维表(实体)内部的数据联系,以及(实体)表与表之间的联系

实体:人类世界中,所能看到的各种单位

 

设计一个教学系统

实体:老师,学生,教室,科目。。。

 

设计一个学生表

学号 姓名 性别 年龄
PHP1001 李商隐 28
PHP1002 屈原 34

 

注意:一个实体创建一张数据表保存,数据表保存的都是一个实体的相关属性,与实体无关的不放到一起

 

设计一个班级表

班级名字 教室名字 开班时间 结束时间
PHP1405 B2302M 20140510 20140925
PHP1402 D306 20140320 20140805

 

班级表里面维护与班级相关的信息

 

实体与实体间的联系

如何将学生和班级进行关联?

学号 姓名 性别 年龄 班级名字
PHP1001 李商隐 28 PHP1405
PHP1002 屈原 34 PHP1402
PHP1003 李清照 PHP1403

 

实体与实体之间,通过某一个关系进行管理。

对应数据表,如果进行关联呢?怎么表示实体与实体之间是有关系的?

在一个实体中,维护一个信息,该信息指向另外一个实体。

 

世面上有哪些关系型数据库?

几乎所有看到数据库都是关系型数据,Mysql,Oracle,SQLServer,Access。。。

 

关系型数据库特点:

  1. 都是保存在硬盘
  2. 都是使用二维表保存数据
  3. 关系型数据库即便表中的某个字段数据不存在,但是数据库也会为该字段保留空间,关系型数据库比较浪费硬盘空间。

 

非关系型数据库:不是关系型数据库的都叫非关系型数据

NOSQL:NOT ONLY SQL

 

非关系型数据库中数据的存在形式

  1. 数据运行在内存中,有一个同步机制,将内存中的内容保存硬盘
  2. 存在形式:以键值对形式存在,学号=>PHP1001

 

非关系型数据:memcache,mongodb,redis

 

关系型与非关系型数据比较:

  1. 非关系型数据库效率高
  2. 关系型数据库更安全

关系型数据库的几个典型概念

行(row):指的是数据表中的横向结构,行也称之为记录(record),表示一条数据(代表一个实体信息)

行和记录没有本质区别,行是从结构的角度出发,记录从数据(内容)角度出发

列(col):指的数据表中的纵向结构,列也称之为字段(field),表示一列数据

列和字段也没有本质区别,一个从结构出发,一个从数据出发

 

SQL:Structured Query language,结构化查询语言。

指的是关系型数据库中对数据库进行管理的语言。SQL虽然是关系型数据库,但是在不同的关系型数据库中有那么一点点微小的区别。

 

SQL:DDL,DML,DCL

DDL:Data Definition Language,数据定义语言,定义结构,通常指的是结构的操作,如数据库的创建和删除,数据表的创建、删除和修改,create,drop

DML:Data Manipulation Language:数据操作语言,对数据的增删改查,查询是一门专门的语言:DQL,Data query Language,数据查询语言,select,insert,update,delete

DCL:Data Control Language:数据控制语言,主要是实现对系统用户的权限管理,grant,revoke,flush

 

Mysql

Mysql是一种关系型数据库,是一种管理数据的软件。

 

软件结构:b/s和c/s

b/s:browser/server,浏览器服务器,指的是只要服务器运行,在客户端(PC)通过浏览器就可以实现访问

c/s:client/server,客户端服务器,如果用户(PC)希望访问服务器,必须要安装对应的客户端,还要保证客户端和服务端同时运行。

飞秋是c/s结构,飞秋已经扁平化了,没有严格的客户端和服务端。

 

Mysql是一种c/s结构

  1. 安装必须要有客户端和服务端,mysql.exe是客户端,mysqld.exe是服务端
  2. 进行通信,必须保证两个端都同时在运行

 

Mysql是如何实现mysql.exe与mysqld.exe进行通信的呢?

  1. 连接认证,客户端发送连接请求,同时服务端对客户端进行身份认证
  2. a) 保证找到对应的服务端:-h host,服务器所在的地址 –hlocalhost,-h192.160.3.1
  3. b) 指定端口,找到对应的应用软件:-P port,端口 –P3306,3306是数据库的默认端口
  4. c) 还要提供身份:用户名和密码,-u username,-p password
  5. d) exe –h192.168.3.1 –P3306 –uroot –proot

登录成功

  1. 客户端准备和发送SQL语句,发给服务端
  2. 服务端执行SQL语句,将执行结果返回给客户端
  3. 客户端要解析结果,并负责显示

以上三个步骤,是没有办法分离显示,因为操作太快

  1. 退出客户端
  2. a) Quit
  3. b) Exit
  4. c) q

Mysql操作原理

如何维护mysql服务?

  1. 安装的过程中加入到系统服务,系统在启动的时候自动加载mysql服务,在控制台运行

在windows下,服务的管理,使用命令:net [stop,start,restart] [服务名]

关闭mysql服务:net stop mysql

开启mysql服务:net start mysql

  1. 进入服务列表进行操作

3.Mysqld.exe的启动

 

Mysql服务端,用户没有办法直接查看里面到底有哪些东西。

Mysql服务端有四层对象

服务端:最终管理数据,数据最终是落到字段上进行管理

SQL基本操作

基本操作指的是增删改查:C(create新增)R(read/retrieve,查询)U(update修改)D(delete删除)

库操作

创建数据库

语法:create Database 数据库名字 [库选项]

库选项

字符集:charset/character set,指定数据库内容的编码

校对集:collate,指的是数据库数据的比较方式

这条语句执行后,mysql服务端做了哪些工作?

  1. 在服务器端的数据文件夹内创建一个名为shop的文件夹

如何找到该路径呢?

My.ini文件中的datadir配置项

  1. 创建一个库选项文件,在对应的数据库文件夹里,有一个db.opt文件,保存数据库的库选项

内容就是保存的库选项

数据库命名规则

1.使用字母,下划线和数字来命名,通常,以字母开头(数据库名字命名并没有非常严格的要求)

2.如果出现关键字或者保留字当做数据库名字,应当使用反引号对库名进行包裹,反引号是esc下面的那个键,在英文输入状态下输出的内容

Syntax错误:语法错误,提示错误的范围

正确使用

  1. 数据可以使用中文做名字,但是需要使用反引号

但是中文数据库下创建的数据库文件夹名字,会以额外的编码形式存在

规范:

  1. 通常数据库的命名,要做到见名之意
  2. 不使用中文
  3. 通常,数据库会有前缀ecs_

查看数据库

语法1:show databases,显示所有数据库

语法2:show databases like [‘pattern’],模糊查询,指定查询条件

%:通配符,匹配所有字符,所有数量

_:匹配所有字符,一次

Show databases like “my%”; -- 查找以my开头的所有的数据库

Show databases like “my_”;  -- 查找以my开头,后面跟一个字符的数据库

原因:下划线匹配一个字符,%匹配所有字符  ==》以information开始的所有数据

如果要得到下划线,必须对下划线进行转义

查看数据库创建语句

语法:show create database 数据库名字

修改数据库

数据库名字不可以修改。

修改的是数据库库选项

语法:alter database 数据库名字 [库选项]

效果

删除数据库

结构的删除都是使用drop关键字,而数据库是一种结构

语法:drop Database 数据库名字

效果

注意:不能轻易的删除任何数据,数据库也不能随意删除,因为数据的删除是不可逆的。如果非要删除数据库,那么请先对数据库进行备份

表操作

对数据库内的数据表进行CRUD操作,该操作仍然是结构上的。

表应该对应结构才能称之为表。

表操作包含自身操作以及字段的操作。表跟字段是密不可分的。

创建表

语法:create table 表名(

--字段列表

字段1 字段类型,

字段2 字段类型,

字段N 字段类型

)[表选项];

表选项:字符集和存储引擎

字符集:该表存储数据所采用的字符集

存储引擎:当前表按照上面数据格式来存储数据

 

字段为什么需要字段类型?

SQL是一门强类型语言,对于数据必需要指定其数据类型,不是同一个数据类型的内容不能存放。

创建数据表

错误:没有选择数据库

原因:数据表是依赖数据库存在的,是数据库的子对象,所以创建的数据表必须指定数据库

  1. 显示指定数据库,指的是在创建表的时候,明确指定该表应该放到哪个数据库下

语法:数据库.数据表

  1. 默认使用数据库,前提是当前环境已经进入到某个指定的数据库。

进入数据库语法:use 数据库名字

所有创建语法,都可以先对要创建的对象进行是否存在判断。

如不能创建已经存在的数据库

防止冲突的办法:

If not exists:如果不存在

If exists:如果存在

If not exists使用

If exists使用

数据表的命名规则:跟数据库基本一致

一般数据表的命名采用下划线方式。

R:查询表

  • 语法:show tables;查询当前数据库中所有的表
  • 语法:show tables like “c%”;模糊查询
  • 语法:show create table 数据表名,查看表的创建语句
  • 语法:desc 表名;查看表中的字段信息,describe 表名;show columns from 表名

U:更新表结构

语法:alter table 表名 add/modify/change/drop [column] 字段名 [字段类型] [位置]

Add:添加一个字段:add 字段名字 字段类型 [位置]

指定位置

Modify:修改一个字段类型:modify 字段名 字段类型 [位置]

Change:修改一个字段名字:change 旧字段名 新字段名 字段类型 [位置]

Drop:删除一个字段:drop 字段名

位置:有两个选项的

First:表示放到表的第一个位置,语法:first

After:表示放到哪个字段的后面,语法:after 字段名

修改表的名字

语法:rename table 旧表名 to 新表名

D:删除数据表

语法:drop table 表名

注意:删除要慎用,表的删除会将整个表中的数据全部干掉,而这种操作不可逆。

数据操作

对数据表里保存的数据进行增删改查操作

C:新增数据

语句:insert into 表名 [(字段列表)] values (值列表)

如果没有字段列表,值列表的数量必须跟表字段数目完全一致,顺序要完全对应

如果有字段列表,那么字段列表与值列表的字段数据必须完全一致,顺序要完全对应

如果使用字段列表,该字段列表可以不与数据表的字段列表顺序一致

错误1:字段类型与值类型不匹配

错误2:待插入的字段列表与当前插入的值列表的数量不匹配

R:查询数据

语法:select [字段列表] from 表名 [where条件]

查询所有数据

查询指定字段

查询指定条件数据

U:更新数据

语法:update 表名 set 字段 = 值 [where条件]

多字段修改

D:删除数据

语法:delete from 表名 [where条件]

注意:通常update和delete都必须匹配where条件,否则不允许操作,因为更新和删除都是永久性的,不可逆的。

中文数据插入

Windows下,命令行模式里,只识别gbk编码,而且该编码不可以改变

要保证mysql.exe在控制台可以输入中文并且让服务端识别的话,有一个快捷方式

Set names gbk; //告诉服务器,客户端给服务器传递数据是gbk编码的

查看mysql支持的字符集

语法:show character set;

一共支持39种字符集,除了这39种之外,其他的字符集就不能支持。

查看mysql服务器对外设置的默认的字符集

语法:show variables like ‘character_set%’;

保证服务器端能够识别客户端的数据,只需要修改character_set_client = gbk;

Set character_set_client = gbk;

就可以使用gbk编码的数据传输给服务器

修改结果集的字符集

Mysql.exe就可以解析数据

客户端与服务端进行不同字符集编码数据通信的原理

Set names gbk做了什么事情?

数据库数据存储的最终编码?

  1. DBMS:安装数据库时指定编码
  2. DB:创建数据库时指定
  3. Table:创建表时指定
  4. Field:创建字段的时候指定

最终数据的存储编码,受最近的字符集影响,如果没有强制指定,那么顺序依次是:字段à表à数据库àDBMS

注意:

1           只要用户设定好了,客户端的编码(character_set_client,character_set_results),不管数据库最终存储数据是按照什么字符集,都不会出现乱码。

2           字符集的最终设定受当前代码所在的环境影响,代码在控制台,就只能是gbk,代码在文件里,跟文件的编码是一致的。

欢迎分享本文,转载请保留出处!—重蔚自留地 站长邮箱:951076433@qq.com