mysql数据库总结复习(二)

2014-11-24 10:52:42 · 作者: · 浏览: 3
思路2:
1,统计每个分组中,分数小于60的功课数量
select count(subject) as na from score group by subject having na >=2;
思路3:
1,统计每个分组中,分数小于60的功课数量
select sum(score<60) as su from score group by name having su>=2;
select avg(score),name from score where name in(select name from score where score < 60 group by name having count(*)>=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 )