工作生活

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

2019-07-04  本文已影响0人  WickJohn

连接查询

--创建学生表
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

视图

  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;
    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;

事务

为什么要有事务

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

  1. 检查A的账户余额>500元;
  2. A 账户中扣除500元;
  3. B 账户中增加500元;
  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;

事务命令

show create table students;

begin;

commit;

rollback;

索引

语法

方式一:建表时创建索引

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

语法

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 外键名字;
上一篇 下一篇

猜你喜欢

热点阅读