bitsCN.com
mysql数据库总结复习
1.mysql数据库复习加强
2.mysql事务触发器
3.mysql 索引外键加强
4.zendstudio 的安装使用
5.svn版本控制器的使用
1.mysql数据库复习加强
1,导出mysql数据库里ecshop到d盘
mysqldump 指令和 mysql指令是一样的
引出一个环境变量:
就是系统找到需要运行的程序的路径
Mysqldump -u root -p 数据库名 > 导出的文件名
1,找到mysqldump.exe这个程序,它是用来备份的
2,执行备份命令
E:/wamp/mysql/bin>mysqldump -u root -p ecshop > d:/ecshopbak.sql
(2)备份数据库中某个数据表
1,找到mysqldump.exe这个程序,它是用来备份的
2,执行备份命令
E:/wamp/mysql/bin>mysqldump -u root -p ecshop ecs_goods > d:goodsbak.sql
导入外部数据库文件
source 指令是属于mysql的
删除数据表
drop table ecs_goods;
清空数据表中的数据:
delete from 表名
delete 和 drop 区别:
delete q清空数据表中的数据(结构)
drop 删除整个表
编码:
utf-8 统一的编码,它支持中文和英文,建议建表的时候都是用utf-8,利于网站国际化
gb2312 支持大陆的中文,
gbk 包括gb2312,支持韩文,日文,香港。。。
mysql 数据库数据类型(列类型)
1,数值类型(整型,浮点型,定点型)
2,字符串类型(char, varchar,text,enum(枚举类型))
但是enum类型由于兼容性和移植性,不太建议使用
3,日期和时间类型
datetime()------年月日时分秒
date----------年月日
time--------时分秒
时间戳表示时间---------timestamp---------now()
int表示的范围是 --- 0---
tinyint 表示的范围------0-255
smallint--------
有符号 signed ------正负数 -128 到 127 表示的范围也是255个长度
无符号 unsigned------没有正负数 0 -255
如果给全班同学建表
unsinged
字符串类型
char 定长(固定长度)字符串----- 0-65535
varchar 可变长度----varchar (255)多少个字节 ,最多255个
text 大的文本数据
时间日期类型
date()
解析这个数据库函数
timestamp ------------不解析-----所以速度要比mysql日期函数快
我建议使用时间戳表示时间
练习:
给我们的同学建一张数据表,字段包括
学生id
姓名
入学时间
tinyint 255 -128 127 0-255
unsigned
varchar(10) 可变长度,最多10个字节,真正使用几个给你分配几个
char() ---------定长 0-65535,不管字符串或多或少都占用 65535长度
name
time
date, datetime mysql内置的日期函数,mysql引擎查询的时候要先解析 函数,速度慢
timestamp 字符串(‘2013-04-16’)
优化表注意事项:
1,创建id-----尽量表前缀连上id,假如 商品表 goods_id 分类表 cat_id
2,创建表的时候---指定存储引擎------如果查询为主的话,engine=myisam ,为了避免乱码----指定utf8 default charset
3,尽量使用时间戳或字符串 表示日期和和时间
4,字段(数值,字符串)
(2)查询语句:
获得商品id为 3 5 7 8 的商品信息
group by 分组的使用
1,商品表和商品分类表,通过在商品表中增加 cat_id字段,关联起来了
2,ecs_category分类表,保存的是商品的分类 id
注意:
//查询不同cat_id,下面对应的不同的商品数量
(1)先根据分类,分组
(2)再统计分组里面的商品的数量
group by 根据xx来分组,
如果合计函数,和group by 一起使用的话,统计的是当前分组内的数据
练习题:
查询不同的商品分类下面,商品价格的总和
查询不同的商品分类下面,价格最高的商品
查询不同的商品分类下面,商品价格的平均数
合计函数:
Max:最大值
M1in:最小值
Count():统计总的记录数
Avg:平均数
Sum:求和
having 和 where 区别:
where:限制的是整个数据表中字段
select goods_name from ecs_goods where goods_id=9;
having: 限制的条件是:前面查询的结果,这个结果有什么条件
union查询
union 联合 连接
union可以将多个查询语句连接起来,select 1 union select2
(select goods_name from ecs_goods where cat_id=3 order by shop_price desc limit 3)
union (select goods_name from ecs_goods where cat_id=4 order by shop_price asc li
mit 3);
//查询手机类型下面的所有的手机品牌
mysql> select cat_name from ecs_category where cat_id=1 union select cat_name fr
om ecs_category where parent_id=1;
子查询
如果一个select查询语句 包含了另一select查询语句 就称之为子查询
(1)select型子查询
select goods_name from ecs_goods where cat_id=(select cat_id from ecs_cat
egory where cat_name = 'GSM手机');
(2)from型子查询
需要注意:
from后面的子查询列表 要有自己的别名
select goods_name from(select * from ecs_goods where cat_id in(3,5)) as tem_goods where goods_name like '诺基亚%';
思路1:
select avg(score),name from score where name in(select name from score where score =2) group by name;
思路2:
1,统计每个分组中,分数小于60的功课数量
select count(subject) as na from score group by subject having na >=2;
思路3:
1,统计每个分组中,分数小于60的功课数量
select sum(score=2;
select avg(score),name from score where name in(select name from score where score =2) group by name;
2.mysql事务触发器
1,连接查询
union 连接的是多个select 语句
join 连接查询:
当我们期望的结果不再同一张表上时,我们需要使用join连接查询
语法:
table1 join table2 on table1的某个字段 = table2的某个字段
条件是 商品表中商品的分类id = 分类表中这个分类的id
当查询语句中,多次使用某个表,或者这个表名特别长的时候,我们建议给这个表添加一个别名
mysql> select goods_name,shop_price,cat_name from ecs_goods as g join ecs_catego
ry as c on g.cat_id = c.cat_id where g.shop_price>=1000;
join的分类:
左连接查询 left join:查询的结果是只要左边有的记录,都会显示,右边没有的显示为null
右连接查询 right join
内连接查询 inner join : 查询的结果是两个表都有的数据
事务:
什么是事务?
事务是逻辑上的一组操作,组成这组操作的各个单元,要不全都成功要不全都失败,这个特性就是事务
注意:mysql数据支持事务,但是要求必须是innoDB存储引擎
解决这个问题:
mysql的事务解决这个问题,因为mysql的事务特性,要求这组操作,要不全都成功,要不全都失败,这样就避免了某个操作成功某个操作失败。利于数据的安全
如何使用:
(1)在执行sql语句之前,我们要开启事务 start transaction;
(2)正常执行我们的sql语句
(3)当sql语句执行完毕,存在两种情况:
1,全都成功,我们要将sql语句对数据库造成的影响提交到数据库中,committ
2,某些sql语句失败,我们执行rollback(回滚),将对数据库操作赶紧撤销
php代码:
开启事务后,只要不执行commit,sql语句不会对真实的数据库造成影响
只有执行commit之后,才会对真实数据库造成影响
触发器:
触发器是数据库的一个程序,他是用来监听着数据表的某个行为,一旦数据表的这个行为发生了,马上执行相应的sql语句
触发器的语法结构:
create trigger 触发器的名称 触发器事件 on 监听的表名 for each row 行为发生后执行的sql语句
触发器事件组成:;两部分组成:
触发器事件发生的时间-----是在监听的表的行为 after before 常用的是after
触发器执行的内容:增删改
创建order 表的时候,需要注意,因为order在mysql中是一个关键字 排序,为了避免错误的发生,我们可以添加反引号,表明这不是一个关键字
如何使用触发器:
案例研究:
一旦生成订单,对应的库存表要减去相应的数据
(1)建商品表和订单表
订单表
(2)给订单表绑定触发器,一旦订单表增加订单,马上执行sql语句,将商品库存表减去相应的数据
现在有个问题:
每次下订单后,库存表都是减去相应的数量固定死的,但是我们的需求是:用户下几个订单,库存表减去几个库存
如何在触发器中使用触发数据?
什么是触发的数据:就是用户在订单表中购买的数量
new 关键字代表新增加的数量,订单表中新下的订单数量
old 关键字代表是旧的记录(过去的记录,取消的订单数量)
new 的使用:
old的使用:
旧的过去的记录,之前买了几个商品,但是又不想要了,取消订单
取消订单后,库存中要增加的相应的数量
update中new 和 old的使用
现在的需求是:
之前购买了5个samsung手机,现在想买10个,需要更新订单表
这个时候,触发器就需要监听着 update这个行为
先将之前下的订单撤销,再重新下订单
触发器是什么?
用来监听数据表的某个行为(insert,delete,update),一旦这个行为发生了,马上执行相应的sql语句
删除触发器:
drop trigger 触发器的名称
3.mysql 索引外键加强
1,索引
什么是索引?
索引------搜索---引导------引导着我去搜索到某个记录的
定义:
没有索引的情况下,我们查询一条记录,需要从第一条记录一直往下查询,知道查找到我们需要的记录,如果记录数特别大的话,相当于大海捞针,速度特别慢
索引:建一个索引-----指向的是数据的位置-----反映到新华字典-----记录所在的页数
优势:
查询速度快了,但是不足:
增加了维护索引的工作量-----每增加一条记录----我就要在索引列表中增加一个索引号指向这条记录的位置
查询速度快了,但是增 删除 更新 速度慢了
扩展一点
数据库中索引保存在哪里?
保存在
索引的分类:
1,主键索引:当我们创建一个表后,指定主键后,自动将主键设置为主键索引
2,普通索引:就是在一个普通的字段上建立索引
3,唯一索引:数据表中的某个字段是唯一的,没有重复----
4,全文索引:在某个字段上建立全文索引,将记录内的关键字抽取出来,然后对每个关键字进行索引 sphinx-----可以建立全文索引
创建索引:
(1)create [索引类型] index 索引名 on 表名(表的某个字段上)
(2)alter table 表名 add [索引类型] index (表的字段)
创建索引之前查询的记录数
创建索引之后查询一条记录,经过的记录数
删除索引:
修改索引:
只能是先删除在增加
外键:
什么是外键:
学生举例:
每个学生对应一张
个人信息表(姓名,学号)
学生详细信息表(成绩,违纪记录,获得奖励,家庭地址,学费,)
这两个表通过外键关联之后,如果有一天你毕业了,应该将你姓名,学号删除,这个学生下面对应的详细信息(成绩,违纪记录,获得奖励,家庭地址,学费)自动删除
使用外键的条件:
(1)保证数据表的存储引擎必须是innoDB
(2)外键关系的两个表的列必须数据类型相似 int tinyint int----------varchar
外键定义的语法:
create table tem(id int, name varchar, foreign key(id) references outTable(id) on delete cascade on update cascade )
监听的外键表的行为:delete update
foreign key(id) 指定当前表哪个字段是外键
references 和外部哪个表关联
constrict ‘’; 指定一个名称,(外键关联的名称,为了将来删除这个外键的话,通过这个名称来删除)约束的名称
mysql> create table xiaodi(id int primary key auto_increment,foreign_id int,name
varchar(32),constraint xiaodi_for foreign key(foreign_id) references dage(id) o
n delete cascade on update cascade)engine=innodb default charset=utf8;
(1)使用外键将两个表关联
在当前表创建外键字段------和外部表的某个字段可关联:foreign key(foreign_id) references dage(id)
关联起来之后监听着外部那个表,如果他删除了,我要做什么?如果他更新了,我又要做什么
on delete (参数3个) on update (参数3个)
当前表监听着 外键关联的那个表,监听的行为有两种(delete,update),一旦这些行为发生之后,我(xiaodi)要做哪些操作
操作分为3中(常用的有3中),cascade:瀑布,表示跟随着外键关联的哪个表
restrict 严格,表示外部关联的那个表删除了,我自己严格要求自己(不跟随变化)
NO ACTION -------- 无动作,没有反映
删除外键:
alter table 表名 drop foreign key 外键名称
重置数据库密码
(1)我们要明确数据库的密码保存在哪里?
mysql数据库 的 user表
要想修改密码,先进入mysql窗口,然后修改user表的password字段
步骤:
(1)先关闭mysqld服务器端的进程
(2)再次开启mysqld这个服务,以不带权限验证形式开启(再打开一个窗口,开启mysqld-nt.exe这个进程之后不要关闭窗口)
(3)通过客户端 链接到mysql服务器端,这个时候我们登录的是root用户
(4)赶紧修改密码 注意:需要使用mysql的password()加密函数加密
(5)赶紧把跳过权限验证登录的形式 关闭(结束进程,重新开启服务进程)
4.zendstudio 的安装使用
如同dw notepad 的结合体~
5.svn版本控制器的使用
包括服务器端, 客户端
服务器端在根目录创建repository库存放库文件 如 weibo
在cmd窗口 运行 svnserve -d -r create 路径
在客户端创建文件夹并从相关路径获取即可
修改文件后 使用commit 交托给服务器
更新时使用update 选择相应version进行更新
bitsCN.com