标签:mysql 数据库基础
数据库及mysql
二分法:平均大概需要十四次左右就能找到我们需要查找的数据;问题是文件需要事先排好顺序;
我们将某一列给提取出来,通过二分法,平均14次找到这个用户名本身,这里面存放的是数据文件的地址。
我们将这个文件叫做索引文件。INDEX。
第二种方法叫做:B+数索引;是我们找到一个数据平均只需要四次左右;这样我们思考一个问题,我们这些数据需要放到那个地方去?
查找索引我们将其称为搜索码?谁来帮我们管理索引?就需要开发一个应用程序来帮助我们管理这两个文件之间的关系。这个工具我们称为
数据管理工具。
管理软件功能:帮我们管理数据,帮助我们维护索引与数据之间的关联性。
php自己开发一段程序,想去查找一个用户。是靠程序查找,还是靠管理软件来查找。这都是需要php自己去开发一套程序。查找程序是要我们程序自己去完成的。
我们可以将查找算法做成模块。
对数据的操作的两种方法:一种是通过软件来帮我们管理数据,算法都在软件里面自己写。还有一种方法则是通过管理软件来帮我们管理数据。因此程序只告诉标准,并返回结果。
这样以来这个管理软件就能够按照某一标准帮我们管理数据了。每一次更新数据之前,其实先进行的是查找,看是否有重复的。每一次删除也需要查询一遍。我们将这些众多的功能
都交由该文件来完成。
数据是如何通过php进行通信的?它们之间的通信需要有协议来帮我们实现。最简单的方式就是通过API帮我们实现。这个API其实就是一个库文件,帮我们提供删除、增加等功能。
那这个API需要用哪一种语言来编写。这就需要多种语言的API。增删改查就是API里面的语言。而如何将其显示,则是应用程序自身的问题。
ODBC:open database connection:开放数据库互联。
驱动负责将程序翻译成cAPI。php程序员只需要使用php驱动就行了。java程序员只需要使用JAVA驱动就行了。。。。。。。我们只需要将这个驱动安装好即可。
如果不是程序员的话,数据库给用户提供一个命令行接口,通过这些命令行接口提供的内置命令。
通过这些命令来调用API,帮助我们完成特定的工作。
线程池(Thread Pool):数据库使用线程的方法来响应用户请求。
DBMS:
DataBase Management System (数据库管理系统)
用户视图
作为工程师来讲既要看到用户试图,又要看到物理试图。
物理视图 01代码;
数据的组织结构:
层次型的结构;
网状型结构;
关系型;
必须要根据业务逻辑来设计数据库;改了数据库就需要改程序,改了程序就要改数据库;
耦合度非常紧密。
RDBMS:
Relational Database Management System(关系型数据库管理系统)
在众多的管理软件中,数据库管理软件是最复杂的。
用户视图
DBA视图
数据文件视图
数据库管理软件应该具有的功能有哪些?
1、数据库创建、删除、
2、创建表、删除表、修改表
3、索引的创建、删除
4、用户和权限
5、数据增、删、改
6、查询
DML:Data Manapulate Language: 数据操作语言
INSERT, REPLACE(替换数据), UPDATE, DELETE
DDL:Data Defination Lanuage: 数据定义语言
CREATE, ALTER, DROP
DCL:Data Control Language: 数据控制语言
GRANT, REVOKE
提供RDBMS的软件有哪些?
egresql(之前的加州伯克利大学研发的)
oracle 授权最便宜的要十几万;多的要几百万。价格很昂贵。
SYBASE
Infomix
MYSQL Postgresql(后sql公司研发的)
EnterpriseDB
sql server是microsoft与sybase一块研发的一个数据库;只能允许在windows上面。
MYSQL,SQL,MYSQL AB(有限公司)
去IOE:IBM的小型机,O指的是ORACLE,E指的是EMC,专门做存储的。
靠一大堆的pc机集群,放在有众多pc机集群上面,而且比原来系统的性能更强。
SUN在2008年,花费10亿买了MYSQL。sun有自己的操作系统solaris,编程语言JAVA。
ORACLE购买了SUN。
ORACLE收购了BEA公司,BEA公司生产weblogic;peoplesoft公司。
OPENOFFICE -->>Libreoffice;
MYSQL的开源版本叫做MariaDB;目前大部分公司用的都是Mysql。Percona公司优化的mysql比原有的mysql性能要好很多很多。Percona提供了更多比mysql更好的功能。
现在的数据库设计者开始去关系化,这种数据库叫做nosql数据库。不在满足于关系型数据库的特性,而是根据业务的需要,关注数据库的读写性能,同时满足数据管理的作用。
比如:MongoDB,Redis,HBASE这三种数据库。
综上我们要先学好关系型数据库。
DBMS:
数据管理独立性;
有效地完成数据存取,并不需要每次都对数据进行完整的扫描。
数据完整性和安全性;
数据集中管理;
并发存储与故障恢复;一般而言,一个DBMS都应该提供相应的功能的。
减少应用程序开发时间;
Structure query language(结构查询语言):
sql86 sql89 sql92 sql99等等。定义了数据库的管理接口应该具有哪些功能等等。
关系型数据库组件:
各种应用程序
SQL命令
↓
DBMS功能 提供一个分析器,做词法分析和语法分析。将分析的结果生成执行计划
↓
计划执行器
↓
优化器
↓
文件的存取方法
↓
先将文件读取到内存里面
↓
事务管理器 处理数据 还应该有故障恢复管理器
↓
锁管理器 磁盘空间管理器
↓
进行管理之后,将其存储到磁盘上
DML:Data Manapulate Language: 数据操作语言
INSERT, REPLACE(替换数据), UPDATE, DELETE
DDL:Data Defination Lanuage: 数据定义语言
CREATE, ALTER, DROP
DCL:Data Control Language: 数据控制语言
GRANT, REVOKE
具体mysql应该如何使用?
mysql的版本有两个版本:商业版和社区版本
Community EDITION(社区版)
ENTERPRISE EDITION(企业版)
www.mysql.com
mysql CLuster
mysql enterprise
mysql workbench:MySQL的统一图形化工具;
mysql connectors:mysql的连接器;
我们一般下载社区版,有三种格式的mysql。
软件包格式:
软件包管理器特有的格式
rpm包,.exe格式等
通用二进制格式
源程序
下载Generic的包即可;
RHEL 5.8 (32bit)
mysql, mysql-server
[root@localhost ~]# yum list all |grep mysql
Unable to read consumer identity
apr-util-mysql.x86_64 1.2.7-11.el5_5.2 base
freeradius-mysql.x86_64 1.1.3-1.6.el5 base
freeradius2-mysql.x86_64 2.1.12-3.el5 base
libdbi-dbd-mysql.x86_64 0.8.1a-1.2.2 base
mod_auth_mysql.x86_64 1:3.0.0-3.2.el5_3 base
mysql.i386 5.0.77-4.el5_6.6 base
mysql.x86_64 5.0.77-4.el5_6.6 base
mysql-bench.x86_64 5.0.77-4.el5_6.6 base
mysql-connector-odbc.x86_64 3.51.26r1127-2.el5 base
mysql-connector-odbc64.x86_64 5.1.8-1.el5 base
mysql-devel.i386 5.0.77-4.el5_6.6 base
mysql-devel.x86_64 5.0.77-4.el5_6.6 base
mysql-server.x86_64 5.0.77-4.el5_6.6 base
mysql-test.x86_64 5.0.77-4.el5_6.6 base
php-mysql.x86_64 5.1.6-32.el5 base
php53-mysql.x86_64 5.3.3-5.el5 base
qt4-mysql.x86_64 4.2.1-1.el5_7.1 base
rsyslog-mysql.x86_64 3.22.1-7.el5 base
注意mysql也是一种C/S架构的服务器;
mysql.i386:这个是客户端的软件包;
mysql-bench.x86_64:性能分析组件
mysql-test.x86_64 :性能测试器
mysql-connector-odbc.x86_64:连接器
mysql-server.x86_64:服务器端软件包
php53-mysql.x86_64 :php访问mysql的驱动
但是这个软件包特别老,需要使用mysql的最新软件包。
LAMP:需要使用mysql的源码包进行编译;因此除非特别需要定制MYSQL的某些性能;一般情况下建议使用msyql的二进制格式进行安装即可。
mysql,mysql-server
客户端进程叫mysql,服务器端进程叫做mysqld。msyql监听在tcp的3306端口。而且默认情况下,使用一个普通用户运行。
mysql只是一个RDBMS。
RDBMS:这个服务器在我们生成数据的时候,默认情况下保存在/var/lib/mysql目录里面;所以需要修改我们的数据文件目录的位置。
使用: yum install -y mysql-server安装服务器端软件;
mysql有一个初始化的动作,注意初始化是干什么的?
文件的元数据存放位置:元数据区存放;对于mysql数据库而言,也有很多元数据。
比如表名字,数据库名字,字段名字、字段属性等。所以mysql数据库本身有一个内置的数据库名字,这个数据库名字叫做mysql。
刚装完数据库的时候,这个数据库是不存在的。mysql初始化的过程就是建这个数据库的。所以mysql数据库安装完毕之后是没有mysql这个数据库的。
/usr/bin/mysqladmin -u root@HOST password ‘new-password‘ 这个用户是mysql服务器的root,而不是操作系统的root。
mysql -u #用户 包括客户端主机名以及用户名, username@HOST
-p #passwd
-h #mysqlserver 不支持本地IP
这几个选项都可以不写。
mysql基于TCP的3306端口;如果客户端和服务器端位于同一个主机上,使用的是叫做socket的方式进行连接的。而在windows上面使用的是叫做共享内存的方式进行连接的。
[root@localhost mysql]# ls
ib_logfile0 ib_logfile1 ibdata1 mysql mysql.soc
这个mysql.soc说明的就是本地进程间的通信机制;
如果客户端与服务器端不位于同一台主机上,必须要使用tcp IP协议。
mysql客户端工具是交互式客户端工具。
mysql客户端:
交互式模式;
批处理模式(执行mysql脚本所用的)。
交互式模式中的命令类别:
客户端命令:\q
服务器端命令:select
注意:所有的客户端命令,写完命令即可执行。服务器端命令则要写明命令结束符,默认是分号。
SQL接口:
ORACLE sql,PL/SQL;
SQL SERVER:T-SQL 事物sql
mysql接口扩展功能:show databases;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema | 保证兼容性用的,是mysql运行过程中,位于内存中的信息。关机之后是空的,打开这个数据库之后,有很多数据。
| mysql |
| test 空的,只有测试的时候才用到它。
每一个数据库,对应于我们操作系统的每一个目录。
[root@localhost mysql]# pwd
/var/lib/mysql
默认数据库存放位置。数据库区分大小写与否取决于文件系统类型。
对mysql数据库管理,我们应该有哪些相关内容:
关系数据库对象:
库
表
索引
视图
约束
存储过程
存储函数
触发器:做主动数据库时候用的
游标
用户
权限
事务
表:
行,列
表:实体
行:row
列:field,colum。
一个表至少有一个列,
字段名称:数据类型,类型修饰(限制);
字符型:
char(n);#不区分大小写的字符。
VARCHAR(n);
BINARY(N) #区分大小写的字符;
VARBINARY(N)
char最多存储256个字符,也就是8个字节。
TEXT(n)
BLOB(n)二进制的大对象
数值:
精确数值型:
整形
TINYINT(1)
SMALLINT(2)
MEDIUMINT(3)
INT(4)
BIGINT
修饰符:UNSIGNED,无符号(表示只有正数或者0)
十进制
DECIMAL
近似数值型
浮点型
FLOAT
DOUBLE
日期时间:
DATE
TIME
DATETIME
STAMP
布尔型:
mysql内置变量类型:ENUM(允许最多支持几种类型,叫做枚举)
mysql是强类型的,必须要实现定义数据类型。
INT A=10
CHAR A=10
DDL(数据定义语言)
create
alter
drop
DML(数据操纵语言)
INSERT
UPDATE
DELETE
DCL (数据控制语言)
GRANT
REVOKE
注意对mysql而言,这些命令都不区分大小写。
创建数据库语言:
CREATE DATABASE db_name;
CREATE DATABASE [IF NOT EXISTS] db_name;
DROP DATABASE [IF EXISTS] db_name;
创建表:
create table tb_name(col1,col2,....)
创建表:
mysql> create table mydb.students(Name CHAR(20) not null,Age TINYINT unsigned,Gender CHAR(1) not null);
查看表结构:
desc students;
删除表:DROP TABLE tb_name;
修改表:
alter table stdudents
MODIFY:修改字段属性
CHANGE:改变字段名称及属性;
ADD:添加字段
DROP:删除字段
例如添加字段:
alter table add course VARCHAR(100);#给表增加一列
alter table students change course Course varchar(100) after name;#针对表中的course列进行修改;
mysql> help alter table;#查看修改表的帮助信息。
DML:
INSERT INTO tb_name (col1,col2,...) values|value (‘string‘,num,...);
一次可以插入多行数据。
INSERT INTO tb_name (col1,col2,...) values|value (‘string‘,num,...),(‘string’,num,...);
注意格式与之前的那个格式一样即可。
insert into students (Name,Gender) values (‘Linghuchong‘,‘m‘),(‘xiaolongnv‘,‘F‘);
也可以参照下面的语句插入数据。
insert into students values (‘xiaoxiangzi‘,‘hamagong‘,57,‘M‘)
update tb_name set column=value where ; #注意将某一行内容进行修改,不指定where值将对整个表的数据进行修改。
delete from tb_name;#默认是删除表的所有行,加上where只删除表中符合某些条件的行。
选择和投影:
选择:指定某字段作为搜索码与某值比较,做逻辑比较运算。将符合条件的行筛选出来,where指定筛选条件。
投影:使用select的时候只显示某些特定的列。
选择:
select 字段 from tb_name where condition
*所有字段;
没有where表示所有行;
DCL(数据控制语言)
创建用户:
create user ‘username‘@‘host‘ identified by ‘password‘;
drop user ‘username‘@‘host‘
注意:jerry@localhost jerry@172.16.100.1是两个不同的用户;
HOST:
IP
HOSTNAME
NETWORK
通配符
_:匹配任意单个字符 172.16.0_
%:匹配任意字符;
jerry@‘%‘:注意使用通配符的时候要使用通配符引用起来。
GRANT pri1,pri2,... ON DB_NAME.TB_NAME TO ‘USERNAME‘@‘HOST‘ [IDENTIFIED BY ‘PASSWORD‘];
REVOKE pri1,pri2,... ON DB_NAME.TB_NAME FROM ‘USERNAME‘@‘HOST‘;
create user ‘jerry‘@‘%‘ identified by ‘jerry‘;
查看用户的授权使用:show grants for user;
all privileges:表示所有的权限;
mysql> grant all privileges on mydb.* to ‘jerry‘@‘%‘;
客户端做测试:打开172.16.100.108
mysql -u jerry -p -h 172.16.100.1
登录查看。
MySQL基础操作练习(所属的库叫做testdb):
新建如下表(包括结构和内容):
ID Name Age Gender Course
1 Ling Huchong 24 Male Hamogong
2 Huang Rong 19 Female Chilian Shenzhang
3 Lu Wushaung 18 Female Jiuyang Shenggong
4 Zhu Ziliu 52 Male Pixie Jianfa
5 Chen Jialuo 22 Male Xianglong Shiba Zhang
CREATE TABLE Students (ID INT,Name char(20),Age TINYINT,Gender CHAR(2),Course VARCHAR(20));
INSERT INTO Students VALUES(1,‘Ling Huchong‘,24,‘M‘,‘Hamagong‘),(2,‘Huang Rong‘,19,‘F‘,‘Chilian Shenzhang‘),(3,‘Lu Wushaung‘,18,‘F‘,‘Jiuyang Shenggong‘);
INSERT INTO Students VALUES (4,‘Zhu Ziliu‘,52,‘M‘,‘Pixie Jianfa‘),(5,‘Chen Jialuo‘,22,‘M‘,‘Xianglong Shiba Zhang‘);
alter Students modify Course VARCHAR(22); 修改表的属性。
命令使用帮助查看如下:help alter table;
update Students set Gender=‘M‘ where Gender=‘MA‘;
2、完成如下操作
(1)找出性别为女性的所有人;
SELECT Name from Students WHERE Gender=‘F‘;
(2)找出年龄大于20的所有人;
SELECT Name from Students where Age>20;
(3)修改Zhu Ziliu的Course为Kuihua Baodian;
update Students set Course=‘kuihua baodian‘ where Name=‘Zhu Ziliu‘
-> ;
(4)删除年龄小于等于19岁的所有人;
delete from Students where Age<=19;
(5)创建此表及所属的库;
见上面语句。
(6)授权给testusser对testdb库有所有访问权限;
CREATE USER ‘testuser‘@‘%‘ IDENTIFIED BY ‘testuser‘;
grant all privileges on testdb.* to ‘testuser‘;
mysql默认情况下管理员用户是没有密码的,当前系统有哪些用户,如何查看?
在mysql这个数据库的user表里面;
mysql> select user,host,Password from user;
+----------+-----------------------+------------------+
| user | host | Password |
+----------+-----------------------+------------------+
| root | localhost | |
| root | localhost.localdomain | |
| root | 127.0.0.1 | |
| | localhost | |
| | localhost.localdomain | |
从上表可以看出,root是本地登录的用户;这里面localhost和127.0.0.1是两个不同的用户。同时还有两个用户为空,这表示有两个匿名用户。
为用户设定密码,方法如下:
1、mysql>SET PASSWORD FOR ‘USERNAME‘@‘HOST‘=PASSWORD(‘password‘);#PASSWORD表示将这个密码字符串要进行加密存放。
mysql> SET PASSWORD FOR ‘root‘@‘localhost‘=PASSWORD(‘123456‘);
因为mysql这张表是在内存中存放的,类似于我们的/pro目录,所以我们修改完数据库的密码或者授权之后,要重新读取授权信息。命令如下:
新设置用户或者修改密码后需要用FLUSH PRIVILEGES刷新Mysql的系统权限相关表。
FLUSH PRIVILEGES;
2、# mysqladmin -uUSERNAME -hHOST -p password ‘password‘ 这表示指定老密码,修改为新密码。如果没有老密码,-p选项可以省略。
mysqladmin -uroot -h127.0.0.1 -p password ‘123456‘
Enter password:
注意这样之后,我们的mysql密码被修改了。
3、mysql> UPDATE user SET Password=PASSWORD(‘password‘) WHERE USER=‘root‘ AND Host=‘127.0.0.1‘;
AND
OR
NOT
想建一个用户,允许其在172.16.这个网段都能连接过来,可以使用如下命令:
grant all privileges on *.* to ‘root‘@‘172.16.%.%‘ identified by ‘redhat‘;
FLUSH PRIVILEGES
这样之后,我们就可以通过root用户,远程登录我们的mysql服务器;不过不建议大家这样使用。因为这种用户名和密码都是明文传送的,不安全。
下面说说mysql的图形化客户端工具有哪些:
最重要的叫做:
1、phpMyAdmin 最轻量级的一种工具,只需要在服务器端安装即可。
2、Workbench
3、MySQL Front
4、Navicat for MySQL
5、Toad
可以下载一个叫做Navicat的客户端工具做一次测试。
下面要说明php的工作机制:
注意php本身和mysql没有任何关系,只不过php里面的程序需要用到数据的时候,会去调用MySQL的驱动程序,通过mysql的驱动程序连接上mysql,才能调用mysql数据库仅此而已。
webapp,webapp server,数据库服务器。
这三个服务器可以架构在一台服务器上,叫做单层架构;
也可以将apache和php放在一台服务器上,mysql一台服务器,叫做两层结构。
各占有一台服务器,apache和php之间通过fastcgi,数据库的话,再通过TCP/IP协议调用数据库服务器。这种我们称为三层结构。
php和mysql都是cpu密集型的,都非常占cpu资源。
怎么去配置让apache、php、mysql三者之间建立关联关系?
首先我们要装一个php与mysql的连接器。
[root@localhost ~]# yum install php53-mysql -y
下面我们需要开发一个php的脚本,访问mysql服务器。
下面继续编辑我们的index.php:
[root@localhost ~]# cd /www/a.org/
编辑index.php
[root@localhost a.org]# cat index.php
<title>A</title>
<h1>D</h1>
<?php
$conn=mysql_connect(‘localhost‘,‘root‘,‘123456‘);
if ($conn)
echo "success...";
else
echo "failure..."
?>
然后重启我们的服务器,在页面进行测试http://172.16.100.2即可。测试我们的mysql是否关联上来。
LAMP:
phpMyadmin
论坛程序:
discuz
phpwind
phpbb
wordpress 个人博客系统,全球性的。
www.discuz.net就可以进行下载安装了。
一般情况下使用GBK编码的就可以了。
以discuz为例子进行阐释:
下载discuz软件包,进行解压缩;
mv upload/* /www/a.org/
然后通过网页打开即可。
vim /etc/httpd/httpd.conf
AddDefaultCharSet#修改主配置文件的编码方式即可。
CMS:内容管理系统;
比如drupal;
joomla;
LAMP:
下载一个工具phpMyadmin-3.4.3.2-all-language.tar.gz
解压缩放到/www/a.org下面然后页面进行访问的时候就能访问到了,这个页面是我们的一个mysql的客户端工具。为了安全起见,建议大家再下载一个
php53-mcrypt-5.3.3-1.e15.i386.rpm
接下去就会进行讲解手动编译:apache2.4,mysql5.6,php5.4的系统。配置完成后,就会成为我们现在安装的这个样子。
需要对以上内容全部进行安装,看看里面的内容。
本文出自 “汗水成就梦想” 博客,请务必保留此出处http://redhatdragon.blog.51cto.com/9183870/1441265
标签:mysql 数据库基础
原文地址:http://redhatdragon.blog.51cto.com/9183870/1441265