mariadb 4

链接查询,视图,事物,索引,外键(第四章)

 

链接查询

复制代码
--建立学生表
create table students (
id int unsigned not null auto_increment primary key,
name varchar(20) default '',
age tinyint unsigned default 0,
high decimal(5,2),
gender enum('男', '女', '中性', '保密') default '保密',
cls_id int unsigned default 0,
is_delete bit default 0
);

 

--建立班级表
create table classes(
id int unsigned auto_increment primary key not null,
name varchar(20) not null
);

--往students表里插入数据
insert into students values
(0,'小明',18,180.00,2,1,0),
(0,'小月月',19,180.00,2,2,0),
(0,'彭于晏',28,185.00,1,1,0),
(0,'刘德华',58,175.00,1,2,0),
(0,'黄蓉',108,160.00,2,1,0),
(0,'凤姐',44,150.00,4,2,1),
(0,'王祖贤',52,170.00,2,1,1),
(0,'周杰伦儿',34,null,1,1,0),
(0,'程坤',44,181.00,1,2,0),
(0,'和珅',55,166.00,2,2,0),
(0,'刘亦菲',29,162.00,3,3,0),
(0,'金星',45,180.00,2,4,0),
(0,'静香',18,170.00,1,4,0),
(0,'郭静',22,167.00,2,5,0),
(0,'周杰',33,178.00,1,1,0),
(0,'钱小豪',56,178.00,1,1,0),
(0,'谢霆锋',38,175.00,1,1,0);


--向classes表里插入数据
insert into classes values (0, '云惟_01期'),(0, '云惟_02期');

 

 

-- 链接查询(内关联)
-- inner join ... on
-- 两个表链接查询
select * from students inner join classes
-- 查询可以对应班级的学生以及班级信息
select * from students inner join classes on students.cls_id=classes.id;
-- 按照要求显示姓名,班级
select students.*, classes.name from students inner join classes on students.cls_id=classes.id;

-- 给数据表起名字
select s.name, c.name from students as s inner join classes as c on s.cls_id=c.id;

-- 查询 有可以对应班级的学生以及班级信息,显示学生的全部信息,只显示班级名称
select students.*, classes.name from students inner join classes on students.cls_id=classes.id;

-- 在以上查询中将班级姓名显示在第一列
select classes.name,students.* from students inner join classes on students.cls_id=classes.id;

-- 查询有可以对应班级的学生以及班级信息,按照班级进行排序
select classes.id, students.* from students inner join classes on students.cls_id=classes.id order by classes.id;

-- 当是同一个班级的时候,按照学生的id从小到大
select classes.id, students.* from students inner join classes on students.cls_id=classes.id order by classes.id, students.id;

--链接查询(左关联,右关联)
--左关联,以左边表为基准,条件对应不上的显示null
select * from students left join classes on students.cls_id=classes.id; 

--右关联,之后边为基准,条件对应不上的显示null
select * from classes left join students on students.cls_id=classes.id; 



-- 自关联
create table areas(
aid int primary key auto_increment,
name varchar(20),
pid int
);
-- 查询出河北省全部市
select * from areas as province inner join areas as city on province.aid=city.pid having name='河北省';

select province.name,city.name from areas as province inner join areas as city on province.aid=city.pid having province.name='河北省';

-- 子查询
-- 标量子查询
-- 查询出北京市全部区的信息
select * from areas where pid=(select aid from areas where name='北京市');


select * from areas where pid in (select aid from areas where name='北京市');
复制代码

 

 

数据库的备份与恢复

mysqldump备份工具

 

复制代码
#备份testdb数据库(-l表明备份单个数据库时锁定该库的全部表;-x当对全部数据库备份时锁定全部数据库的全部表)
mysqldump -uroot -proot -l --databases testdb > testdb.sql
#备份全部数据库
mysqldump -uroot -proot --all-databases > all_databases.sql
#备份testdb数据库下的students表
mysqldump -uroot -proot testdb students > students.sql
#还原数据(sql命令行下)
source testdb.sql
复制代码

 

利用binlog恢复数据

复制代码
  #第一步
  vim /etc/my.cnf.d/server.cnf

  [server]
  log-bin=mysql-bin

  

  #第二步,查看二进制文件

  mysqlbinlog /var/lib/mysql/mysql-bin.000001

  

  #第三步,删除一些数据

  

  #第四步,恢复

  mysqlbinlog mysql-bin.000001 | mysql -uroot -proot
复制代码

 

视图

  • 对于复杂的查询,在多个地方被使用,若是需求发生了改变,须要更改sql语句,则须要在多个地方进行修改,维护起来很是麻烦

 

  1. 假如由于某种需求,须要将user拆房表usera和表userb,该两张表的结构以下:
          测试表:usera有id,name,age字段
          测试表:userb有id,name,sex字段
       这时若是php端使用sql语句:select * from user;那就会提示该表不存在,这时该如何解决呢。解决方案:建立视图。如下sql语句建立视图:
          create view user as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name;
  • 视图本质就是对查询的封装
  • 定义视图,建议以v_开头
     create view 视图名称 as select语句;
  • 查看视图:查看表会将全部的视图也列出来
    show tables;
  • 删除视图
    drop view 视图名称;     例:     drop view v_stu_score_course;
  • 使用:视图的用途就是查询
    select * from v_stu_score_course;

例:
  • 学生表




  • 班级表

 


create view v_student_info as select classes.c_name as '班级', students.name as '学生' from students inner join classes on students.cls_id=classes.id order by classes.id;

 

 

 

事务

为何要有事务php

   事务具备ACID特性:原子性(A,atomicity)、一致性(C,consistency)、隔离性(I,isolation)、持久性(D,durabulity)。html

  • 事务普遍的运用于订单系统、银行系统等多种场景
  • 例如:A用户和B用户是银行的储户,如今A要给B转帐500元,那么须要作如下几件事:
      1. 检查A的帐户余额>500元;
      2. A 帐户中扣除500元;
      3. B 帐户中增长500元;
  • 上述3个步骤的操做必须打包在一个事物中,任何一个步骤失败,则必须回滚全部步骤
  • 能够用start transaction语句开始一个事物,而后要么使用commit提交将修改的数据持久保存,要么使用rollback撤销全部修改,事物sql的样本以下:
  • start transation;
  1. select balance from checking where customer_id=1024232;
  2. update checking set balance=balance-200.00 where customer_id=1024232;
  3. update savings set balance=balance+200.00 where customer_id=1024232;
  4. commit;
  • 原子性:事务内的全部操做要么都执行,要么都不执行,它是一个不可分割的工做单位。
  • 一致性:数据库老是从一个一致性的状态转换到另外一个一致性的状态(在前面的例子当中,一致性确保了,即便在执行第3、四条语句之间系统崩溃,支票帐户也不会损失200美圆,由于事物最终没有被提交,因此事物中所作的修改也不会保存到数据库中)
  • 隔离性:一个事物所作的修改在最终提交以前,对其余事物是不可见的(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另一个帐户汇总程序开始运行,则其看到的支票帐户的余额并无被减去200美圆。)
  • 持久性:事务完成后,该事务内涉及的数据必须持久性的写入磁盘保证其持久性。固然,这是从事务的角度来考虑的的持久性,从操做系统故障或硬件故障来讲,这是不必定的。

事务命令mysql

  • 要求:表的引擎类型必须是innodb类型才可使用事务,这是mysql表的默认引擎
  • 查看表的建立语句,能够看到engine=innodb
show create table students; 
  • 修改数据的命令会触发事务,包括insert、update、deletesql

  • 开启事务,命令以下:数据库

    • 开启事务后执行修改命令,变动会维护到本地缓存中,而不维护到物理表中
begin; 
  • 提交事务,命令以下
    • 将缓存中的数据变动维护到物理表中
commit; 
  • 回滚事务,命令以下:
    • 放弃缓存中变动的数据
rollback;
 

索引

 
  
  • 思考:在图书馆中是如何找到一本书的?
  • 通常的应用系统对比数据库的读写比例在10:1左右,并且插入操做和更新操做不多出现性能问题,遇到最多的,也是最容易出问题的,仍是一些复杂的查询操做,因此查询语句的优化显然是重中之重
  • 当数据库中数据量很大时,查找数据会变得很慢
  • 优化方案:索引

语法vim

  • 查看索引
 
  
show index from 表名; 
 
  
  • 建立索引
 
  

方式一:建表时建立索引缓存

 
  
create table create_index( id int primary key, name varchar(10) unique, age int, key (age) ); 
 
  

方式二:对于已经存在的表,添加索引工具

 
  
若是指定字段是字符串,须要指定长度,建议长度与定义字段时的长度一致
字段类型若是不是字符串,能够不填写长度部分

create index 索引名称 on 表名(字段名称(长度)) 例: create index age_index on create_index(age); 
 
  
  • 删除索引:
 
  
drop index 索引名称 on 表名;

 

 

  • 测试时间
set profiling=1;#打开sql语句执行时间

show profiles;#查看sql执行时间

 

外键foreign key

  • 若是一个实体的某个字段指向另外一个实体的主键,就称为外键。被指向的实体,称之为主实体(主表),也叫父实体(父表)。负责指向的实体,称之为从实体(从表),也叫子实体(子表)post

  • 对关系字段进行约束,当为从表中的关系字段填写值时,会到关联的主表中查询此值是否存在,若是存在则填写成功,若是不存在则填写失败并报错性能

语法

 

  • 查看外键

 

  show create table 表名
  •  添加外键
  1. alter table students add constraint fk_students_gid foreign key (gid) references grade(gid) on delete cascade;

 

  • 删除外键

 

  1. show create table 表名
  2.  alter table students drop foreign key 外键名字;
相关文章
相关标签/搜索