简介:MySQL数据库简称MySQL,是一款由瑞典MySQL AB公司开发并且应用广泛的数据管理系统,MySQL数据库因其体积小、速度快、总体拥有成本低受到很多的热捧。现在,MySQL的所有者世界上最著名的数据库企业——Oracle所有。
MySQL的应用,在国内的企业包括:百度、阿里、腾讯、新浪、搜狐、网易等等企业,全部都在使用MySQL数据库。
MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。
由于MySQL是开放源代码的,因此任何人都可以在GPL的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。
PHP与很多数据库结合都很紧密。由于,PHP和MySQL都是开源免费的。所以PHP一直对于MySQL等数据库都有很好的支持。
Oracle数据库的默认端口:1521
MySQL数据库的默认端口:3306
sqlserver数据库的默认端口号为:1433
1,数据库的五个基本单位
数据库服务器,数据库,数据表,数据字段,数据行
我们现在来对上面的五个基本单位进行说明:
数据库服务器:是指用来运行数据库服务的一台电脑。在中小型企业通常为一台。在数据存储量计算量很大的时候可以存在多台。多台数据库服务器共同来存储或计算。由于数据安全非常重要,我们经常会对数据库服务器里面的数据进经备份。
数据库:一个数据库服务器里面有可以有多个数据库。主要用来分类使用。我们可以建立交通信息数据库、游戏数据库、酒店开房数据库... ... 主要用来将各个不同用途的数据,按照业务进行大块的划分。
数据表:例如在游戏数据库中。根据这一款游戏又分为了不同的数据表。专门用来区分游戏不同的数据。例如:用户数据(用户、密码);人物数据;所有装备和装备信息;用户的充值信息;药品、魔力药水信息... ...等
数据字段:也叫数据列。就是我们日常所见表格里面的列。在表格中,我们会将一张用户表分成多个列。如下(表一)所示:用户编号、用户名、性别、年龄是字段。在真正的数据库中数据字段需要换成英文需要写成:id、username、sex、年龄。
数据行:真正的数据存在每一个表的行里面。字段(列)划分出来了一个表应该按照什么样的格式存数据。而行,是真正的数据。每一行需要遵循数据字段(列)的规范和要求进行存入数据。
2,Mysql连接数据库
方法一
安装后,可以在开始菜单的列表中找到MySQL Command Line 点击操作的命令行终端操作。效果如图:
方法二
如果加入到了windows的环境变量中,可以在命令行下直接操作。
在命令行下,通过以下命可以连接到数据库服务器:
mysql -h localhost -u root -p
上面的命令中: mysql 表示 mysql数据库启动工具。
参数说明
-h 表示数据库连接地址,连接本机可不填
-u 表示要登录的用户
-p 表示使用密码登录
一、创建数据库
基本语法create database +数据库名;
示例 create database php;
创建 数据库
二、查看数据库
show databases;
显示 数据库
三、选中数据库
use php;
使用 库名
四、查看数据库中的表
show tables;
显示表
五、删除数据库
drop database +库名;
示例 drop database php
1.2 Mysql数据表操作
一、创建表
create table 表名(字段名1字段类型,......字段名n 字段类型n);
示例create table user(usernamevarchar(20),password varchar(32));
示例说明 创建一个表名叫user的表,第一个字段为username、表的
字段类型位varchar长度为32个长度。第二个字段为password,类型
也为varchar,长度也为32个长度。
注释:
int,代表整型。float,代表浮点。char和varchar代表字符串即可。
其他示例:
mysql> create table emp(
ename varchar(10),
hiredate date,
sal float(10,2),
deptno int(2)
二、查看表的创建语句
show create table 表名\G;
示例show create table emp\G;
三、删除表
drop table 表名;
示例drop table emp;
1.3 Mysql数据字段操作
一、查看表结构
desc +表名;
示例desc emp;
二、修改表字段类型
alter table表名modify 字段名varchar(20);
示例 alter table user modify username varchar(20);
示例说明 将user表的username的类型改为varchar(20)
三、增加表字段
alter table 表名add
column 字段名 类型;
示例 alter table user add column age int(3);
示例说明 添加一个字段为age ,类型为整型长度为3
四、增加字段时控制字段顺序
alter table 表名add 字段名字段类型after 字段名;
示例alter table user add email varchar(60) aftercreateip;
示例说明 user表中,在createip 后增加一个字段为email,
类型为varchar, 长度为60
五、删除表字段
alter table表名drop
column 字段名;
示例 alter table user dropcolumn age;
示例说明 在user 表中删除字段age
六、表字段改名
alter table表名change 字段原名字段新名 字段类型;
示例 alter table user change email em varchar(60);
示例说明 在user 表中将字段中的email 字段名字改为em
七、修改表字段排列顺序
在前的字段增加和修改语句(add/change/modify)中,最后都可以加一个可选项 first|after。
增加表字段时我们已经学过了如何调整顺序。我们现在来看看另外的change或modify如何来调整顺序
示例 alter table user modify em varchar(60) first;
八、修改表名
alter table 旧表名rename 新的表名;
示例 altertable user rename new_user;
示例说明 将user表名改为new_user
1.4 Mysql数据类型
整型
MySQL数据类型所占字节值范围
tinyint1字节-128~127
smallint2字节-32768~32767
mediumint3字节-8388608~8388607
int4字节范围-2147483648~2147483647
bigint8字节+-9.22*10的18次方
整型的长度不同,在实际使用过程也就不同。
浮点类型
MySQL数据类型所占字节值范围
float(m, d)4字节单精度浮点型,m总个数,d小数位
double(m, d)8字节双精度浮点型,m总个数,d小数位
decimal(m, d)decimal是存储为字符串的浮点数
字符类型
MySQL数据类型所占字节值范围
CHAR0-255字节定长字符串
VARCHAR0-255字节变长字符串
TINYBLOB0-255字节不超过255个字符的二进制字符串
TINYTEXT0-255字节短文本字符串
BLOB0-65535字节二进制形式的长文本数据
TEXT0-65535字节长文本数据
MEDIUMBLOB0-16 777 215字节二进制形式的中等长度文本数据
MEDIUMTEXT0-16 777 215字节中等长度文本数据
LOGNGBLOB0-4 294 967 295字节二进制形式的极大文本数据
LONGTEXT0-4 294 967 295字节极大文本数据
VARBINARY(M)允许长度0-M个字节的定长字节符串值的长度+1个字节
BINARY(M)M允许长度0-M个字节的定长字节符串
时间类型
MySQL数据类型所占字节值范围
date3字节日期,格式:2014-09-18
time3字节时间,格式:08:42:30
datetime8字节日期时间,格式:2014-09-18 08:42:30
timestamp4字节自动存储记录修改的时间
year1字节年份
复合类型
MySQL数据类型说明举例
set集合类型set(“member”, “member2″, …
“member64″)
enum枚举类型enum(“member1″, “member2″,
… “member65535″)
一个 ENUM 类型只允许从一个集合中取得一个值;而 SET 类型允许从一个集合中取得任意多个值。
1.5 Mysql字符集
英文字符集:
字符集说明字节长度
ASCII美国标准信息交换代码单字节
GBK汉字内码扩展规范双字节
unicode万国码4字节
UTF-8Unicode的可变长度字符编码1到6个字节
注意:
mysql在写utf-8的时候写的是utf8。不加中间的中横线。
1.6 Mysql索引
一、MySQL的索引类型
普通索引:最基本的索引,它没有任何限制
唯一索引:某一行启用了唯一索引则不准许这一列的行数据中有重复的值。针对这一列的每一行数据都要求是唯一的
主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,常用于用户ID。类似于书中的页码
全文索引:对于需要全局搜索的数据,进行全文索引
普通索引
基本语法 altertable表 add index(字段)
示例 ALTERTABLE money ADD INDEX(username);
示例解释 为money表的username字段增加索引
唯一索引
类型 详细说明
基本语法 altertable表 addUNIQUE(字段)
示例 ALTERTABLE money ADD UNIQUE(email);
示例解释 为money表的email字段增加唯一索引
全文索引
类型 详细说明
基本语法 altertable表 addFULLTEXT(字段)
示例 ALTERTABLE money ADD FULLTEXT(content);
示例解释 为money表的content字段增加唯一索引
主键索引
类型 详细说明
基本语法 altertable表 addPRIMARY KEY(字段)
示例 ALTERTABLE money ADD PRIMARY KEY(id);
示例解释 为money表的id字段增加主键索引
创建表时也可以声明索引
创建表时可在创建表语句后加上对应的类型即可声明索引:
PRIMARY KEY(字段)
INDEX [索引名] (字段)
FULLTEXT [索引名] (字段)
UNIQUE[索引名] (字段)
注:中括号中的索引名,代表可选。
整体示例如下:
CREATE TABLE test (
id INT NOT NULL ,
username VARCHAR(20) NOT NULL ,
password INT NOT NULL ,
content VARCHAR(20) ,
PRIMARY KEY (
id),
INDEX pw (
password),
UNIQUE (
username),
FULLTEXT (
content)
) ENGINE = InnoDB;
1.7增删改查之插入记录
一、插入记录有两种个基本语法
插入基本语法一
基本语法 insertinto表 values(值1,值2,值n);
示例 INSERTINTO user values(2,'php中文网','男')
示例说明 向user表中插入值id为2,姓名为李文凯,性别为男
插入基本语法二
基本语法 insertinto表(字段1,字段2,字段n) values(值1,值2,值n);
示例 INSERTINTO user(id,username,sex) values(213,'小沈阳',1);
示例说明 向user表中插入id为213,username为小沈阳,性别为1
说明:
基本语法1和基本语法2的区别是:
基本语法1的插入语句,表中有多少个字段就必须要插入多少个值。
一个不能多,一个也不能少。若有默认值,不想传,可以写上null。
基本语法2中,除非有必填字段必须要写入值外。如果有默认值的
不想写可以忽略不写。mysql会自动补主默认值。
基本语法2中,以user(id,username,sex)字段顺序为值的顺序。
二、基础查询
基本语法 select* from表;
示例 select* from money;
示例说明 查询money表中所有字段中的所有结果
注:”*” 是一种正则表达式的写法,表示匹配所有,上面的查询语句和下面的是等价:
三、指定字段查询
基本语法 select字段 from 表;
示例 selectid,username, balance from money;
示例说明 查询money表中id,username, balance字段中的所有结果
四、查询单个字段不重复记录distinct
基本语法 selectdistinct字段 from 表;
示例 selectdistinct age deptno from money;
示例说明 查询money表中年龄唯一的所有结果
五、条件查询where
基本语法 select 字段 from 表 where where条件;
示例 select* from money where age = 29;
示例说明 查询money表中年龄为29的所有结果
除此之外,还可以使用>、<、>=、<=、!=等比较运算符;
六、逻辑运算符
where多个条件还可以使用 or(或者) 、 and(并且) 等逻辑运算符进行多条件联合查询
七、结果集排序
基本语法 select字段 from 表order by字段 排序关键词
示例 selectid,username, balance from money order by balance desc;
示例说明 查询money表中的id,username,balance字段,按照余额进行降序排序
排序用到的关键词:
asc 升序排列,从小到大(默认)
desc 降序排列,从大到小
八、结果集限制
对于查询或者排序后的结果集,如果希望只显示一部分而不是全部,
使用 limit 关键字结果集数量限制。
基本语法 select字段 from 表 limit数量;
示例 selectid,username, balance from money limit 5;
示例说明 显示前五个用户
九、限制结果集并排序
基本语法 select字段 from 表order by 字段 关键词 limit 数量
示例 selectid,username, balance from money order by balance desc limit 5;
示例说明 按照钱来排序,显示前五个最有钱的用户
十、统计类函数使用
函数 说明
sum 求和
count 统计总数
max 最大值
min 最小值
avg 平均值
基本语法 select函数(字段) from 表
示例 selectcount(id) from money
示例说明 查询money表的id总数
你还可以给字段取别名哟!使用as关键字。
例如mysql> select count(id) as zongshu
from money;
十一、分组group by
基本语法 select* from表 group by 字段
示例 select* from money group by province;
示例说明 按照地区进行分组
统计分组(分类)各总数:
mysql> select deptno,count(1) from emp group by deptno;
统计省份数量后再进行分组显示
mysql> selectcount(province),province from moneygroup by province;
在分组基础上进行统计
with rollup用的很少。这个知识点设置为了解级别。
它的主要功能是对于分组的数据进行统计后,再进行一次总数统计。
类别 详细解示
基本语法 select* from表 group by 字段withrollup
示例 selectcount(province),province from moneygroup by province with rollup;
示例说明 对分组的数再次进行统计
在上面的基础上统计总数,下例结果中,最后多了一个12 NULL。
mysql> selectcount(province),province from moneygroup by province with rollup;
结果再过滤having
having子句与where有相似之处但也有区别,都是设定条件的语句。
having 是筛选组 而where是筛选记录。
类别 详细解示
基本语法 select* from表 group by 字段 having 条件
示例 selectcount(province) as result ,province frommoney group by province having result >2;
示例说明 对地区分组并统计总数,将分组结果中大于2的分组地区显示出来
mysql> select count(province) as result,province from money group by provincehaving result >2;
整体使用SQL
我们现在将语句进行整合后,配合使用一次。整体的SQL语句配合使用的语法结构如下:
SELECT
[字段1 [as 别名1],[函数(字段2) ,]......字段n]
FROM表名
[WHERE where条件]
[GROUP BY字段]
[HAVING where_contition]
[order条件]
[limit条件]
注:上面的语句中可以[] 代表可选。最终的语法总结如下:
关键词 说明
select 选择的列
from 表
where 查询的条件
group by 分组属性 having分组过滤的条件
order by 排序属性
limit 起始记录位置,取记录的条数
我们进行一次整体的给合使用,查询money表字段:id,username,balance,province 要求id>1 余额大于50,使用地区进行分组。我们使用用户id进行降序,要求只准显示3条。最后将SQL语句写成,查询出来的结果如下:
mysql> selectid,username,balance,province from money where id > 1 and balance > 50group by province order by id desc limit 3;
1.8 Mysql多表联合查询
user表创建语句:
CREATE TABLE IF NOT EXISTS user (
uid int(11) NOT NULL,
username varchar(30) NOT NULL,
password char(32) NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS order_goods (
oid int(11) NOT NULL,
uid int(11) NOT NULL,
name varchar(50) NOT NULL,
buytime int(11) NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
user表数据:
INSERT INTO user(uid,username,password)values('1','jintian','123456');
INSERT INTO user(uid,username,password)values('2','zhangsha','1234f56');
INSERT INTO user(uid,username,password)values('3','wangwu','1234fs56');
INSERT INTO user(uid,username,password)values('4','lisi','123s456');
INSERT INTO user(uid,username,password)values('5','xiaotian','123d456');
INSERT INTO user(uid,username,password) values('6','wangfei','123f456');
INSERT INTO user(uid,username,password)values('7','oldboy','123w456');
order_goods数据如下:
INSERT INTOorder_goods(oid,uid,name,buytime) values('1','7','opper','12345622');
INSERT INTOorder_goods(oid,uid,name,buytime) values('2','2','iphone','1234356');
INSERT INTOorder_goods(oid,uid,name,buytime) values('3','4','xieli','12342s56');
INSERT INTOorder_goods(oid,uid,name,buytime) values('4','3','lisi','12322456');
INSERT INTOorder_goods(oid,uid,name,buytime) values('5','5','juzi','12344456');
INSERT INTOorder_goods(oid,uid,name,buytime) values('6','6','tianmiju','12322456');
INSERT INTOorder_goods(oid,uid,name,buytime) values('7','1','xiangjiao','12311456');
注意:在上表order_goods表中uid是指user表中的uid字段。上表中oid为1的数据行,uid为7的用户。为user表中uid为7的用户:oldboy。该用户购买了商品为xiangjiao。购买时间buytime为一个unix时间戳。
mysql> select u.uid ,u.username as
username,o.oid,o.uid,o.name as shopname from user u,order_goods o where
u.uid = o.uid;
外连接
基本语法 select表1.字段 [as 别名],表n.字段 from表1 LEFT JOIN 表n on 条件;
示例 select* from user left join order_goods on user.uid = order_goods.uid;
示例说明 以左边为主,查询哪些用户未购买过商品,并将用户信息显示出来外连接又分为左连接和右链接,具体定义如下。
左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录
mysql> select * from user left join order_goods on user.uid = order_goods.uid;
右连接:包含所有的右边表中的记录甚至是右边表中没有和它匹配的记录
基本语法 select表1.字段 [as 别名],表n.字段 from表1 right JOIN 表n on 条件;
示例 select* from user right join order_goods on user.uid = order_goods.uid;
示例说明 查询商品表中哪些用户购买过商品,并将用户信息显示出来
mysql> select * from user right join order_goods on user.uid= order_goods.uid;
子查询
有时候,当我们查询的时候,需要的条件是另外一个select语句的结果,这时就需要使用子查询。用于子查询的关键字包括in、not in、=、!=、exists、not exists等。
基本语法 select字段 from表 where 字段 in(条件)
示例1 select* from user where uid in (1,3,4);
示例1说明 按照id 查询指定用户
示例2 select* from user where uid in (select uidfrom order_goods);
示例2说明 将购买过商品的用户信息显示出来
示例1:
mysql> select * from user where uid in (1,3,4);
示例2:
mysql> select * from user where uid in (select uid fromorder_goods);
记录联合
使用 union 和 union all 关键字,将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示。两者主要的区别是把结果直接合并在一起,而 union 是将 union all 后的结果进行一次distinct,去除重复记录后的结果。
基本语法 select语句1 union[all] select语句2
示例 select* from user where uid in (1,3,4);
示例说明 将商品表中的用户信息和用户表中的用户信息的结果组合在一起
mysql> select uid from user union selectuid from order_goods;
1.9 Mysql增删改查之更新记录
更新记录
更新数据我们已经说过。需要修改内容,修改银行卡余额,修改装备信息的时候都需要使用到update,修改语句。
money表数据结构:
CREATE TABLE IF NOT EXISTS money (
uid int(11) NOT NULL,
username varchar(30) NOT NULL,
balance DECIMAL(9,2) NOT NULL
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
money表数据:
INSERT INTO money(uid,username,balance)values('1','zhangsai','15000.22');
INSERT INTO money(uid,username,balance)values('2','zhangsa','16000.22');
INSERT INTO money(uid,username,balance)values('3','lisi','17000.22');
INSERT INTO money(uid,username,balance)values('4','wangwu','18000.22');
修改(也叫更新)语句的基本语语法如下:
基本语法 update表名 set 字段1=值1,字段2=值2,字段n=值n where 条件
示例 updatemoney set balance=balance-500 whereuserid = 15;
示例说明 修改money表,将balance余额减500。要求userid为15
假设我们有下面这一个表,表结构如下:
mysql> select * from money where username='lisi';
使用update 语句进行记录更新
mysql> update money set balance=balance-500 where uid = 15;
同时对两个表进行更新
基本语法 update表1,表2 set 字段1=值1,字段2=值2,字段n=值n where 条件
示例 updatemoney m,user u m.balance=m.balance*u.age where m.userid=u.id;
示例说明 修改money,将money表的别名设置为m;user表的别名设置为u;将m表的余额改为m表的balance*用户表的age。执行条件是:m.userid = u.id
mysql> update money m,user um.balance=m.balance*u.password where m.uid=u.uid;
使用delete 删除记录
基本语法 DELETEFROM表 [where 条件];
示例 DELETEFROM user where id > 10;
示例说明 删除掉用户表中id大于10的所有用户
mysql> DELETE FROM money where uid='1';
Query OK, 1 row affected (0.08 sec)
删除掉了id为1的记录。
清空表记录
delete和truncate是一样的,但它们有一点不同,那就是DELETE可以返回被删除的记录数,而TRUNCATE TABLE返回的是0。
如果一个表中有自增字段,使用truncate table 这个自增字段将起始值恢复成1.
基本语法 TRUNCATETABLE表名;
示例 TRUNCATETABLE user;
示例说明 清空表的数据,并且让自增的id从1开始自增
【切记】
删除时一定要记住加上where条件,不然会清空掉整个表的记录。
删除重要数据前一定要备份、备份、备份。
2.0 Mysql 权限操作
添加权限
类别 详细解示
基本语法 grant权限 on 库.表 to '用户'@'主机'
identified by '密码';
示例 grantselect, insert on test.* to 'liwenkai'@'localhost' identified by '4311';
示例说明 给予liwenkai用户,在本机连接test库所有表的权限。操作的这些表具有查询和写入权限
注:可以针对一个用户增加多条权限。
删除权限
基本语法 revoke权限 on 库.表 from '用户'@'主机';
示例 revokeselect, insert on test.* to 'liwenkai'@'localhost' identified by '4311';
示例说明 给予liwenkai用户,在本机连接test库所有表的权限。操作的这些表具有查询和写入权限。
参数说明
grant all 在grant后接all说明给予所有权限
revoke all 在revoke后接all说明删除所有权限
权限on . .所明给予所有库所有表的操作权限
'用户'@'主机' 主机里面若为%。任意来源的主机均可以使用这个用户来访问
创建数据库用户liwenkai ,具有对test数据库中所有标的 select / insert 权限
示例:增加权限
mysql> grant select, insert on test.* to'liwenkai'@'localhost' identified by '4311';
Query OK, 0 rows affected (0.00 sec)
示例:移除权限
mysql> revoke insert on test.* from'liwenkai'@'localhost';
Query OK, 0 rows affected (0.30 sec)
补充:
查看用户权限
查看当前用户权限:
show grants;
查看其它用户权限:
show grants for'test'@'localhost';
刷新权限
flush privileges;
2.1 PHP操作mysql数据库
注意:
从PHP7开始默认不再支持mysql扩展,即不再支持mysql_*系列函数。请使用mysqli连接数据库。
mysqli即支持php5也支持php7。
创建表结构:
CREATE TABLE IF NOT EXISTS users (
idINT(10) NOT NULL,
username varchar(30),
password varchar(30),
createtime date not null,
createip binary(16)
);