@52fhy
2015-11-02T18:18:41.000000Z
字数 13373
阅读 433
MySQL
数据库是计算机应用系统中的一种专门管理数据资源的系统。
数据库就是一组经过计算机整理后的数据,存储在一个或者多个文件中,而管理这个数据库的软件就称为数据库管理系统。
主流的软件开发中应用数据库有IBM的DB2,Oracle,Informix,Sybase,SQL Server,PostgreSQL,MySQL,Access,FoxPro和Teradata等。
PHP脚本程序作为MySQL服务器的客户机程序,是通过PHP中的MySQL扩展函数,对MySQL服务器中存储的数据进行获取,插入,更新及删除等操作。
SQL
(Structured Query Language)是一种专门用于查询和修改数据库里的数据,以及对数据库进行管理和维护的标准化语言。SQL语言结构简洁,功能强大,简单易学。
无论是Oracle,Sybase,Informix,SQL Server这些大型的数据库管理系统,
还是像Visual Foxpro,PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言。
SQL语言包含四个部分:
1. 数据定义语言(DDL
):用于定义和管理数据对象,包括数据库,数据表等。例如:CREATE,DROP,ALTER等。
2. 数据操作语言(DML
):用于操作数据库对象中所包含的数据。例如:INSERT,UPDATE,DELETE语句。
3. 数据查询语言(DQL
):用于查询数据库对象中所包含的数据,能够进行单表查询,连接查询,嵌套查询,以及集合查询等各种复杂程度不同的数据库查询,并将数据返回客户机中显示。例如:SELETE。
4. 数据控制语言(DCL
):是用来管理数据库的语言,包括管理权限及数据更改。例如:GRANT,REVOKE,COMMIT,ROLLBACK等。
准备:
1、 windows下添加mysql环境变量,方便使用。示例:
PATH = C:\program files\mysql\bin;
如果配置出错,Windows会提示
'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件。
配置好后不用重启,重新打开CMD即可。
2、cmd里连接mysql
mysql -h localhost -u root -p
##之后输入密码即可
##本机-h localhost可以省略
mysql -u root -p
进入mysql交互界面后:
注意:
1.每个SQL命令都需要使用分号来完成
2.可以将一行命令拆成多行
3.可以通过\c来取消本行命令
4.可以通过\q、exit、ctrl+c或者quit来退出当前客户端
5.使用'help;' 或者 '\h' 查看帮助.
help select;
help grant;
3、 显示所有数据库
show databases;
4、使用某个数据库
命令:use 数据库名;
use mydb;
5、显示选中数据库所有表
show tables;
6、查询显示某个表内数据库内容
命令:select * from 数据库表名;
如果想纵向显示,可以加参数\G
select * from user \G;
7、显示某个数据表结构
命令:describe 数据库表名,或者desc 数据库表名;
##示例
describe user;
desc user;
8、数据库表内容管理
插入数据:INSERT INTO 表名称[(字段1,字段2,...)] VALUE(值1,值2,...);
查询数据:SELECT 字段1,字段2,… FROM 表名称
更改数据:UPDATE 数据表 set 字段名称=新修改的值 [WHERE 条件]
删除数据:DELETE FROM 表名称 [WHERE 条件]
9、数据库及表操作
创建数据库 CREATE DATABASE [IF NOT EXISTS] 数据库名称;
删除数据库 DROP DATABASE [IF EXISTS] 数据库名称;
创建数据表:CREATE TABLE [IF NOT EXISTS] 表名称(字段1信息,字段2信息…字段N信息)[ENGINE=MyISAM DEFAULT CHARSET=UTF8];
删除数据表:DROP TABLE [IF EXISTS] 数据表名称;
修改表结构:ALTER TABLE 数据表名称 相关操作;
示例:
create table 表名(
字段名 类型 [字段约束],
字段名 类型 [字段约束],
字段名 类型 [字段约束],
...
);
mysql> create table stu(
-> id int unsigned not null auto_increment primary key,
-> name varchar(8) not null unique,
-> age tinyint unsigned,
-> sex enum('m','w') not null default 'm',
-> classid char(6)
-> );
Query OK, 0 rows affected (0.05 sec)
10、创建新用户并授权
格式:grant 允许操作 on 数据库名.表名 to 账号@来源 identified by '密码';
实例:创建zhangsan账号,密码123,授权lamp61库下所有表的增/删/改/查数据,来源地不限
grant select,insert,update,delete on lamp61.* to zhangsan@'%' identified by '123';
例如:
GRANT INSERT ON *.* TO yjc@"%" IDENTIFIED BY "123";//只具有插入数据库权限
grant select,insert,update,delete on lamp61.* to zhangsan@'%' identified by '123';//具有增删查改权限
11、其它
显示创建数据表sql语句:show create table 表名;
12、备份与恢复
命令:MYSQLDUMP –u用户名(根用户) –p密码 db_name > 存放路径级/文件名.sql
(不是在mysql控制台执行,而要退出控制台在DOS下执行)
例:
mysqldump -uroot -p12345 mydata1>mydata1.sql
mysqldump –u root –p12345 mydb > D:/mydb.sql;
步骤:
1、进入mysql控制台,创建一个空数据库,然后使用use选中那个空数据库
2、使用命令:SOURCE 存放路径/文件名.sql (在Mysql控制台执行)
mysql> create database bbs87;
Query OK, 1 row affected (0
mysql> use bbs87;
Database changed
mysql> source mydata1.sql;
注意:在DOS里若不指定备份恢复路径,均相对于所打开的DOS窗口路径
使用帮助:DOS下使用HELP ALERT;
HELP ALERT TABLE;
1、修改表名
alter table 旧表名 rename as 新表名;
##示例
alter table user rename as bbs_user;
2、设置字段自增的初始值
alter table 表名 auto_increment=初始值;
##示例
alter table user auto_increment=20;
3、复制表(仅结构)
原理是使用like创建一个与目标表一模一样的数据表。可以完整复制结构,包括主键。
alter table user_geo_line rename to user_geo_line_20150729;
create table user_geo_line like user_geo_line_20150729;
1、添加字段
alter table 表名 add 字段名 字段类型(长度) 属性 [索引];
##示例
alter table user add qq int(10);
alter table user add qq int(10) after id;
ALTER TABLE `user`
ADD `age` int NOT NULL DEFAULT '1' COMMENT '年龄' AFTER `name`,
COMMENT='用户名';
2、删除字段
alter table 表名 drop 字段名;
##示例
alter table user drop qq;
3、修改字段
1) 只能修改属性
alter table 表名 modify 字段名 属性 [索引];
##示例
alter table user modify email varchar(30) not null;
2) 既能修改字段名,又能修改属性
alter table 表名 change 原字段名 新字段名 属性 [索引];
##示例
alter table user change email youxiang varchar(30) not null;
3)更改字段排序
ALTER TABLE 表名 MODIFY 字段名1 数据类型 FIRST | AFTER 字段名2;
其中:
字段名1:表示需要修改位置的字段的名称。
数据类型:表示“字段名1”的数据类型。
FIRST:指定位置为表的第一个位置。
AFTER 字段名2:指定“字段名1”插入在“字段名2”之后。
示例:
alter table user MODIFY id int(10) FIRST; #更改排序为首列
alter table user MODIFY age int(10) AFTER id;
1、查看当前表索引
show indexes from 表名
##示例
show indexes from user;
2、添加普通索引
alter talble 表名 ADD INDEX/UNIQUE/PRIMARY KEY (字段);
##示例
alter table user add index(username);
3、删除索引
alter table 表名 drop index 索引名称;
##示例
alter table user drop index username;
4、添加主键索引
方法一:
alter table user add id int(10) unsigned not null auto_increment, add primary key (id);
方法二:
alter table user add id int(10) unsigned not null auto_increment,
alter table user add primary key (id);
5、删除主键索引
1)先去除auto_increment
alter table user modify id int not null;
2)再删除主键索引
alter table user drop primary key;
1、 查看系统支持的存储引擎
show engines;
2、查看表使用的存储引擎
两种方法:
show table status from db_name where name='table_name';
show create table table_name;
3、 修改表引擎方法
alter table table_name engine=innodb;
4、 关闭Innodb引擎方法
1) 关闭mysql服务: net stop mysql
2) 找到mysql安装目录下的my.ini文件:
找到default-storage-engine=INNODB
改为default-storage-engine=MYISAM
找到#skip-innodb
改为skip-innodb
3) 启动mysql服务:net start mysql
TINYINT 1字节 非常小的整数 带符号值:-128~127 无符号值:0~255
SMALLINT 2字节 较小的整数 带符号值:-32768~32767 无符号值:0~65535
MEDIUMINT 3字节 中等大小的整数 带符号值:-8388608~8388607 无符号值:0~16777215
INT 4字节 标准整数 带符号值:-2147483648~2147483647 无符号值:0~4294967295(10位数)
BIGINT 8字节 大整数 带符号值:-2^63~2^63-1 无符号值:0~2^64-1
FLOAT 4或8字节 单精度浮点数 最小非零值:+- 1.175494351E-38 最大非零值:+- 3.402823466E+38
DOUBLE 8字节 双精度浮点数 最小非零值:+- 2.225073E-308 最大非零值:+- 1.797693E+308
DECIMAL 自定义 以字符串形式表示的浮点数 取决于存储单元字节数
常用:
1. TINYINT(2) 用来表示flag,type等状态值;
2. INT 用来存储id,uid,时间等;
3. DECIMAL(6,2) 用来存储价钱等有小数的值;
4. BIGINT(14) 用来存储大于11位长度的int值。
注意:
1. 整型INT后面的数字可以省略。
2. INT(3)、SMALLINT(3)等整型后面的数字不会影响数值的存储范围,只会影响显示
CHAR[(M)] M字节 定长字符串 M字节
VARCHAR[(M)] L+1字节 可变字符串 M字节
TINYBLOB,TINYTEXT L+1字节 非常小的BLOB(二进制大对象)和文本串 2^8-1字节
BLOB,TEXT L+2字节 小BLOB和文本串 2^16-1字节
MEDIUMBLOB,MEDIUMTEXT L+3字节 中等的BLOB和文本串 2^24-1字节
LONGBLOB,LONGTEXT L+4字节 大BLOB和文本串 2^32-1字节
ENUM('value1','value2'…) 1或2字节 枚举:可赋予某个枚举成员 65535个成员
SET('value1','value2'…) 1,2,3,4或8字节 集合:可赋予多个集合成员 64个成员
常用:
1. VARCHAR(25) 用来存储标题、名称、网址、号码等常用值;
2. CHAR(32) 用来存储固定长度的值,如MD5加密后的密码等;
3. TEXT 用来存储文章段落。
注意:
1. CHAR,VARCHAR,TEXT用得比较多;md5加密后是32位,常用CHAR(32)。
2. 在使用CHAR和VARCHAR类型时,当我们传入的实际的值的长度大于指定的长度,字符串会被截取至指定长度。
3. 在使用CHAR类型时,如果我们传入的值的长度小于指定长度,实际长度会使用空格补至指定长度。
4. 在使用VARCHAR类型时,如果我们传入的值的长度小于指定长度,实际长度即为传入字符串的长度,不会使用空格填补。
5. BLOB区分大小写,TEXT不区分大小写。
DATE 3 字节 "YYYY-MM-DD" 格式表示的日期值 1000-01-01~9999-12-31
TIME 3 字节 "hh:mm:ss" 格式表示的时间值 -838:59:59-838:59:59
DATETIME 8 字节 "YYYY-MM-DD hh:mm:ss" 格式 1000-01-01 00:00:00~9999-12-31
TIMESTAMP 4 字节 "YYYYMMDDhhmmss" 格式表示的时间戳 19700101000000-2037年的某个时刻
YEAR 1 字节 "YYYY”格式的年份值 1901~2155
常用:
1. DATETIME 用来存储0000-00-00 00:00:00
格式的时间;
2. DATE 用来存储0000-00-00
格式的时间;
3. 通常用int来存储11位时间戳。
注意:
1. 存储日期时,我们可以使用整型INT来进行存储时间戳,这样做便于我们进行日期的计算。
1. NULL意味着“没有值”或“未知值”
2. 可以测试某个值是否为NULL
3. 不能对NULL值进行算术计算
4. 对NULL值进行算术运算,其结果还是NULL
5. 0或NULL都意味着假,其余值都意味着真
注意:
1. 给字段设置默认值是良好的习惯。通常数字类型设置0
或者其它值;状态类设置1
;字符串类设置''
;日期设置为0000-00-00 00:00:00
。
UNSIGNED
无符号型,即非负数。
ZEROFILL
只能用于设置数值类型,在数值之前会自动用0补齐不足的位数。
AUTO_INCREMENT
用于设置字段的自动增长属性,每增加一条记录,该字段的值会自动加1。
NULL
和NOT NULL
默认为NULL,即插入值时没有在此字段插入值,默认为NULL值,如果指定了NOT NULL,则必须在插入值时在此字段填入值。
DEFAULT
可以通过此属性来指定一个默认值,如果没有在此列添加值,那么默认添加此值。
注意:
1. 字段默认not null
,且最好设置默认值;
2. 该字段确认不会出现负值,设置UNSIGNED
;
3. 主键必需设置AUTO_INCREMENT
。
常用id作为主键索引,并且not null,auto_increment
常规索引技术是关系数据查询中最重要的技术,如果要提升数据库的性能,
索引优化是首先应该考虑的,因为它能使我们的数据库得到最大性能方面的提升。
可用于username等
MySQL支持MyISAM、InnoDB、HEAP、BOB、ARCHIVE、CSV等多种数据表类型,
在创建一个新MySQL数据表时,可以为它设置一个类型。
MyISAM和InnoDB两种表类型最为重要:
1. MyISAM数据表类型的特点是成熟、稳定和易于管理。
2. MyISAM表类型会产生碎片空间,要经常使用OPTIMIZE TABLE命令去清理表空间
3. MyISAM不支持事务处理,InnoDB支持
4. MyISAM不支持外键,InnoDB支持
5. MyISAM表类型的数据表效率更高
6. MyISAM表类型的数据表会产生三个文件,InnoDB表类型表默认只会产生一个文件。
命令行下:
SET NAMES 'utf8';
SET NAMES 'GBK';
默认字符集设置:
1) my.ini设置
[client]
port=3306
[mysql]
default-character-set=utf8
character-set-server=utf8
default-storage-engine=MyISAM
命令行方式:
2) 还有一种修改mysql默认字符集的方法,就是使用mysql的命令
mysql> SET character_set_client = utf8 ;
mysql> SET character_set_connection = utf8 ;
mysql> SET character_set_database = utf8 ;
mysql> SET character_set_results = utf8 ;
mysql> SET character_set_server = utf8 ;
mysql> SET collation_connection = utf8 ;
mysql> SET collation_database = utf8 ;
mysql> SET collation_server = utf8 ;
一般就算设置了表的mysql默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:
SET NAMES 'utf8';
它相当于下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
1、INSERT INTO(增)
格式:INSERT INTO 表名(字段1,字段2,字段3....) values('值1', '值2','值3'....);
说明:表字段不用加引号,值建议都加引号,字符必须加引号。
例1:
INSERT INTO user(id,username,age,sex,detial) VALUES('0','vilin','27','男','this is a boy');
说明:当给出字段时,可以不按顺序指定,但值顺序必须和给出的顺序一致。
例2:
INSERT INTO user VALUES('0','vilin','27','男','this is a boy');
说明:如果表名不给出字段名,VALUES部分要按顺序全部给出值。
例3:
INSERT INTO user(id,name,age,sex,detial) VALUES
('null','lili','29','女','my name is lili'),
('0','xueer','23','女','my name is xueer');
说明:可以使用VALUES 一次插入多条语句,语句之间用逗号隔开。
例4:
INSERT INTO users1 select * from users;
说明:将表users的值全部插入到users1,但是要求表结构要一致。
例5:
INSERT INTO users1(name,sex) select name,sex from users;
说明:将搜索的值插入到users1,但是要求字段个数要对应。
2、UPDATE(改)
格式:UPDATE 表名 SET 字段名1='值1',字段名2='值2'... [where 条件];
说明:如果不写条件默认更新SET后面字段中所有的值(需谨慎)。可以更新多个值,需逗号隔开。例:
UPDATE bbs_user SET name='xiaoli' where id=9;
UPDATE bbs_user SET name='zhenzhen' where id>20 AND id<30;
3、DELETE(删)
格式:DELETE FROM 表名 [where 条件]
说明:一定要给出条件,不然会删除所有表中数据。
例1:
DELETE FROM bbs_user;
说明:删除表中所有数据,清空表。
注意:如果想清空表且将自增也设置为1,请使用truncate 表名
。示例:
truncate bbs_user;
例2:
DELETE FROM bbs_user WHERE id=2;
说明:删除id=2的内容。
SELECT(查)
格式:SELECT [ALL|DISTINCT] {*|table.*|[table.]field1[AS alias1][,[table.]field2[AS alias2][,…]]} FROM 表名
说明:
[ALL|DISTINCT]
默认为ALL,DISTINCT
关键字取消重复的数据;
*|table.*|[table.]field1
如果查询所有数据,用*
即可;如果指定某字段,使用数据表.字段
;
AS alias1
可以给指定表、指定字段起别名。as可省略。
#例1:
SELECT * FROM bbs_user; 查询bbs_user所有数据
#例2:
SELECT id,name,sex FROM bbs_user; 查询bbs_user指定字段数据
#例3:
SELECT id,name,sex FROM bbs_user WHERE name='vilin'; #查询name='vilin'的行数据。
#例4:
SELECT id,name,sex FROM bbs_user WHERE name='vilin' && id=20;
#查询条件为name='vilin'并且id=20 的数据
#例5:
SELECT id,name,sex FROM bbs_user WHERE id >5 limit 2,2;
limit 2,2 偏移量,显示条数 #显示结果为id= 8,id=9的数据。limit 2 显示条数。
实例:分页limit 偏移量公式
$page:当前页码,
$pagesize:每页显示数据条数
$offset=($page-1)*$pagesize 查询的偏移量
实际使用:
limit $offset,$pagesize;
实例:分页显示指定条数
查询id>0的数据,数据中包含username,userpwd 总共要查1条
select username,userpwd from bbs_users where id>0 limit 1;
查询id>0的数据,从第二条开始取一条,只包含username,userpwd
select username,userpwd from bbs_users where id>0 limit 1,1;
例6:DISTINCT
过滤username 字段中重名的行。
SELECT DISTINCT username FROM bbs_user;
例7: AS 别名
SELECT name as 姓名, age as年龄 FROM bbs_user;
说明:AS 别名 AS可以省略,中间用空格。
省略写法:
SELECT name 姓名, age 年龄 FROM bbs_user;
例8: 多表联合查询:
SELECT * FROM user,bbs WHERE bbs.username=user.username
说明:查询user和bbs两个表中username字段相同的数据
SELECT u.username uname,o.username,o.bianhao FROM bbs_order o,bbs_users u WHERE o.username = u.username;
AS可省略。
例9:ORDER BY 排序:
SELECT * FROM 表名 [WHERE 条件] ORDER BY 字段1 ASC|DESC,字段2 ASC|DESC...;
默认ASC省略正序小到大,DESC从大到小。示例:
SELECT id,name,age FROM bbs_user WHERE id>10 && id<20 ORDER BY id DESC;
例10:自联合查询:
SELECT a.id aid,a.name aname,b.id bid, b.name bname FROM cats a, cats b WHERE b.pid=a.id;
例11:嵌套查询:(子查询)
SELECT * FROM products where cid in(select id from cats where name like 'j%');
1、LIMIT
limit 5表示从第0条开始,查找5条记录
limit 1,5表示从第1条开始,查找5条记录
2、ORDER BY
ORDER BY后面可以接一列或多列用于排序的字段,表示按什么字段排序。例:
select * from user order by id; #按id升序形式显示user中所有内容
使用DESC或ASC关键字设计字段排序的方式。默认升序(ASC),降序使用DESC。
3、逻辑操作符
AND或&&,OR或||,XOR,NOT或!
4、比较操作符
比较符:
>,<,=,>=,<=,!=或<>,<=>
是否为空:
IS NULL,IS NOT NULL
区间查询:
BETWEEN,NOT BETWEEN
说明:a BETWEEN b AND c 若a在b和c之间,为真
例子:select * from user where id between 1 and 5;
模糊搜索:
LIKE,NOT LIKE 用于模糊查找
% 表示0个或任意多个字符
_表示一个字符
例1:select * from bbs where title like '%php%';//查询含有php的title
例2:select * from bbs where title like 'php%';//查询php开头的title
IN查询
示例:a in(b1,b2….) 若a等于b1,b2,b3,…中的某一个,则为真
例子:select * from user where age in(22,23,26);
5、统计函数
COUNT()返回满足SELECT语句中指定条件的 记录数
例子:
select count(*) from user;
select count(id) from user;
SUM()返回一列的总和。例子:
select sum(jifen) from user;
AVG()返回一列的平均值
MAX()返回一列中最大的值
MIN()返回一列中最小的值
6、GROUP BY 对查询结果分组
例子:
select sum(jifen) from user group by username;
7、HAVING 对分组查询的结果列表进一步过滤
例子:
select sum(jifen) as total from user group by username having total>2;
说明:having后面的字段只能是新生成的表里的字段,否则会提示无此栏目。
8、查询优化
EXPLAIN语句是检测索引和查询能否良好匹配的简便方法。
EXPLAIN SELECT * FROM table WHERE a>’0’ AND b<’1’ ORDER BY c;
总体步骤
1. 连接MySQL数据库,判断是否连接成功
2.选择数据库
3.设置字符集
4.准备SQL语句
5.向MySQL服务发送SQL语句
6.判断执行结果
7.处理结果集
8.释放结果集,关闭数据库连接
1、数据库连接
mysql_connect()连接数据库,并返回一个连接资源
#格式:
mysql_connect(主机名,用户,密码);
#例:
$db = mysql_connect("localhost","root","12345");
2、连接错误处理
mysql_error()获取刚刚(最后)执行数据库操作的错误信息
mysql_errno()获取刚刚(最后)执行数据库操作的错误号;错误号为0表示没有错误
3、选择数据库
mysql_select_db()
选择一个数据库,等同于use 库名
语句。例:
mysql_select_db("mydb");
4、设置字符集
mysql_set_charset("utf8");
等同于:
mysql_query("set names utf8");
5、数据库查询
mysql_query()
发送一条sql语句
sql语句若是查询,则返回结果集,其他则返回boolean值表示执行是否成功。例:
mysql_query("select * from user");
6-1、解析结果集
mysql_fetch_assoc();以关联式数组解析结果集
mysql_fetch_row();以索引式数组解析结果集
mysql_fetch_array();以关联和索引两种方式数组解析结果集,也可以指定第二参数来定义返回格式:MYSQL_BOTH(关联和索引)/MYSQL_NUM(索引)/MYSQL_ASSOC(关联)
mysql_fetch_object();以对象方式解析结果集
6-2、解析结果集数目
mysql_num_rows(结果集); 获取结果集中的数据条数
mysql_num_fields(结果集);获取结果集中的列数(字段数量)
mysql_result();
mysql_result($result,0,3); //获取第1条数据的第4列中的值
mysql_result($result,1,2); //获取第2条数据的第3列中的值
mysql_result($result,5,4); //获取第6条数据的第5列中的值
7、释放结果集
mysql_free_result(结果集名);
8、关闭数据库连接
mysql_close();
9、其它
mysql_insert_id取得上一步 INSERT 操作产生的 ID
mysql_affected_rows取得前一次 MySQL 操作所影响的记录行数
关联的 INSERT,UPDATE 或 DELETE 查询所影响的记录行数。
实例:
<?php
//1、连接数据库
$conn=mysql_connect("localhost","root","123456");
//2、选择数据库
mysql_select_db("bbs87");
//3、设置数据库编码
mysql_set_charset("utf8");
//4、准备SQL语句
$sql = "select * from artical ";
//5、执行SQL语句并获取结果集
$result = mysql_query($sql);
//6、判断查询是否成功
if($result && mysql_num_rows($result)>0){
//7、处理结果
while($row=mysql_fetch_assoc($result)){
print_r($row);
}
//8、是否结果集并关闭数据库
mysql_free_result($result);
}
mysql_close();
tips:
PHP Mysql中判断操作是否成功:
1插入操作
mysql_insert_id()>0
2删除操作
mysql_affected_rows()>0
3修改操作
mysql_affected_rows()>0
4select 查询
mysql_num_rows($result)>0