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

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

目录操作步骤:

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

文件操作步骤:

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

文件操作相关函数

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

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

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

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

$arr = array();

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

o=opendir( o = o p e n d i r ( dir);

While( filename=readdir( f i l e n a m e = r e a d d i r ( o)){

//每次得到一个文件

arr[]= a r r [ ] = filename;

}

//返回

Return $arr;

}

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

Foreach( arras a r r a s value){

//拼凑一个路径

dir.=/. d i r . = ‘ / ′ . value;

//判断路径

If(is_dir($dir)){

//是一个路径

subarr=myScandir( s u b a r r = m y S c a n d i r ( dir);

}

}

递归调用函数本身

Function myScandir($dir = “.”){

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

Static $arr = array();

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

o=opendir( o = o p e n d i r ( dir);

While( filename=readdir( f i l e n a m e = r e a d d i r ( o)){

//将.和..必须去除

If( filename==.|| f i l e n a m e == ‘ . ′ | | filename == ‘..’)

{

arr[]= a r r [ ] = filename;

}else{

//每次得到一个文件

arr[]= a r r [ ] = filename;

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

If(is_dir( dir./. d i r . ‘ / ′ . filename)){

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

myScandir( dir./. d i r . ‘ / ′ . filename);

}

}

}

//返回

Return $arr;

}

递归:函数内部调用自己

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

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

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

1.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。。。

关系型数据库特点:

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

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

NOSQL:NOT ONLY SQL

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

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

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

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

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

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结构

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

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

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

登录成功

客户端准备和发送SQL语句,发给服务端
服务端执行SQL语句,将执行结果返回给客户端
客户端要解析结果,并负责显示
以上三个步骤,是没有办法分离显示,因为操作太快

退出客户端
a) Quit
b) Exit
c) q

Mysql操作原理

如何维护mysql服务?

安装的过程中加入到系统服务,系统在启动的时候自动加载mysql服务,在控制台运行
在windows下,服务的管理,使用命令:net [stop,start,restart] [服务名]

关闭mysql服务:net stop mysql

开启mysql服务:net start mysql

进入服务列表进行操作
3.Mysqld.exe的启动

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

Mysql服务端有四层对象

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

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

3.1.库操作

创建数据库

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

库选项

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

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

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

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

如何找到该路径呢?

My.ini文件中的datadir配置项

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

内容就是保存的库选项

数据库命名规则

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

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

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

正确使用

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

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

规范:

通常数据库的命名,要做到见名之意
不使用中文
通常,数据库会有前缀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 数据库名字

效果

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

3.2.表操作

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

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

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

创建表

语法:create table 表名(

–字段列表

字段1 字段类型,

字段2 字段类型,

字段N 字段类型

)[表选项];

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

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

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

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

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

创建数据表

错误:没有选择数据库

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

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

默认使用数据库,前提是当前环境已经进入到某个指定的数据库。
进入数据库语法: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 表名

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

3.3.数据操作

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

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做了什么事情?

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

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

注意:

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

2 字符集的最终设定受当前代码所在的环境影响,代码在控制台,就只能是gbk,代码在文件里,跟文件的编码是一致的。
本文转载自《重蔚自留地重蔚自留地php学习第三十五天——mysql基础1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值