Home >Database >Mysql Tutorial >mysql数据库总结复习_MySQL

mysql数据库总结复习_MySQL

WBOY
WBOYOriginal
2016-06-01 13:35:201152browse

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
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn