1.连接查询

--创建学生表

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.name,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;

select * from classes left join students on students.cls_id=classes.id;

--右关联,以后边为基准,条件对应不上的显示null

select * from students right join classes on students.cls_id=classes.id;

select * from classes right join students on students.cls_id=classes.id;

-- 自关联

create table areas(

aid int primary key auto_increment,

name varchar(20),

pid int

);

补充:将Linux中的文件直接在mariadb中执行,用source 文件名(areas.sql)

select * from areas;

select * from areas as p inner join areas as v on p.aid=v.pid;

-- 查询出北京市所有区

select * from areas as p inner join areas as v on p.aid=v.pid where p.name='北京市';

select p.name,v.name from areas as p inner join areas as v on p.aid=v.pid where p.name='北京市';

-- 子查询

-- 标量子查询

-- 查询出北京市所有区的信息

select * from areas where pid =(select aid from areas where name='北京市');

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

2.数据库的备份与恢复(shell下运行)

#备份testdb数据库

mysqldump -uroot -p123456 --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

3.视图,主要用于查看

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

假如因为某种需求,需要将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;

实例:

students表

classes表

创建视图v_stu

create view v_stu as select students.name ,classes.name as c_n from students inner join classes on classes.id=students.cls_id;

#因为students表和classes表中有相同的字序id和name,因此需要对在一个视图的字序进行别名处理

4.事务(安全):保证数据的安全

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

原子性:事务内的所有操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

一致性:数据库总是从一个一致性的状态(执行结果)转换到另一个一致性的状态(在前面的例子当中,一致性确保了,即使在执行第三、四条语句之间系统崩溃,支票账户也不会损失200美元,因为事物最终没有被提交,所以事物中所做的修改也不会保存到数据库中)

隔离性:一个事务所做的修改在最终提交之前,对其他事务是不可见的,在事物中的操作,在其他事物和地方均不可见(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外一个账户汇总程序开始运行,则其看到的支票账户的余额并没有被减去200美元。)

持久性:事务完成后,该事务内涉及的数据必须持久性的写入磁盘保证其持久性。当然,这是从事务的角度来考虑的的持久性,从操作系统故障或硬件故障来说,这是不一定的。

事务广泛的运用于订单系统、银行系统等多种场景

例如: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;

事务命令

要求:表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎

查看表的创建语句,show create table students;可以看到engine=innodb

修改数据的命令会触发事务,包括insert、update、delete

开启事务,命令如下:

开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中

begin;

提交事务,命令如下

将缓存中的数据变更维护到物理表中()

commit;

回滚事务,命令如下:

放弃缓存中变更的数据

rollback;

5.索引 提高查看数据的速度,索引不是越多越好

一般的应用系统对比数据库的读写比例在10:1左右,而且插入操作和更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重

当数据库中数据量很大时,查找数据会变得很慢

优化方案:索引

主键primary key默认就有索引的功能,如果一个表中有主键就不要添加索引了。

查看索引:show index from 表名;

创建索引

方式一:建表时创建索引

create table create_index(

id int primary key,

name varchar(10) unique,

age int,

key (age) #创建age得索引

);

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

如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致

字段类型如果不是字符串,可以不填写长度部分

create index 索引名称 on 表名(字段名称(长度))

例:

create index age_index on create_index(age);

删除索引:drop index 索引名称 on 表名;

测试时间

show variables like '%profiling%';

set profiling=1; #set临时修改打开sql语句统计时间

show profiles; #查看上一条sql执行时间

6.外键foreign key

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

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

查看外键:show create table 表名

添加外键,在范围小的表中添加外键 ,在添加外键之前需要将没有关联的数据删除掉。

students表

classes表

因为有不匹配内容,因此要先将不匹配得删掉,否则会报错

delete from students where cls_id >2;

alter table students add constraint waijian foreign key(cls_id) references classes(id); #students为范围小得表

此时,无法添加没有外键关系的数据,无法删除单一表得数据

on delete cascade级联删除

alter table students add constraint waijian foreign key (cls_id) references classes(id) on delete cascade;

添加级联删除才可以单独删除单表数据,此时得删除会把匹配到得数据从两个表中一起删除。

删除外键

1.show create table 表名(设置外键得表)

2.alter table students drop foreign key 外键名字; #删除students表上的外键

MariaDB 连接查询,视图,事物,索引,外键的更多相关文章

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

    一.连接查询 1)进入自己创建的zz数据库 2)创建学生表: create table students ( id int unsigned not null auto_increment prima ...

  2. mariadb 视图 事务 索引 外键

    视图 对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦   假如因为某种需求,需要将user拆房表usera和表userb,该两张表 ...

  3. mysql(视图 事务 索引 外键)

    视图   视图本质就是对查询的封装   创建视图(定义视图 起名以v_开头) create view v_students as select classes.name as c_name ,stud ...

  4. mysql字段约束-索引-外键---3

    本节所讲内容: 字段修饰符 清空表记录 索引 外键 视图 一:字段修饰符 (约束) 1:null和not null修饰符   我们通过这个例子来看看 mysql> create table wo ...

  5. MariaDB 连接查询与子查询(6)

    MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,MySQL由于现在闭源了,而能轻松成为MySQ ...

  6. MySQL 视图 事务 索引 外连接

    视图 1.定义 select 语句的结果集,是一张虚拟的表2.创建视图语句create view 视图名 as select语句3.查看视图show views;4.使用视图select * from ...

  7. 总结: MySQL(基础,字段约束,索引,外键,存储过程,事务)操作语法

    1. 显示数据库列表 show databases; # 查看当前所有数据库 show databases \G   #以行的方式显示 2. 在命令行中,执行sql语句 mysql -e 'show ...

  8. 2-16 MySQL字段约束-索引-外键

    一:字段修饰符 1:null和not null修饰符 我们通过这个例子来看看 mysql> create table worker(id int not null,name varchar(8) ...

  9. mysql的事物,外键,与常用引擎

    ### part1 时间类型 date YYYY-MM-DD 年月日 (出现日期) time HH:MM:SS 时分秒 (竞赛时间) year YYYY 年份值 (红酒年份 82年矿泉水) datet ...

随机推荐

  1. Python中的字典和集合

    一.字典(dict)      1. 概述          字典是Python唯一的映射类型. 只能使用不可变的对象(比如字符串)来作为字典的键,但是可以把不可变或可变的对象作为字典的值. 键值对在 ...

  2. springboot+elasticsearch 报错

    错误1: .d.e.r.s.AbstractElasticsearchRepository : failed to load elasticsearch nodes : org.elasticsear ...

  3. 前端面试题-display:none和visibility:hidden的区别

    一.display:none和visibility:hidden的区别 1.1 空间占据 1.2 回流和渲染 1.3 株连性 二.空间占据 display:none 隐藏后的元素不占据任何空间,而 v ...

  4. JavaWEB开发05_Bootstrap

    上次课内容:什么JQ : write less do more 写更少的代码,做更多的事情 javascript函数库 基本选择器: ​ ID选择器: #ID名称 ​ 类选择器: .类名 ​ 元素选择 ...

  5. Rest_Framework简介

    Web应用模式 在开发Web应用中,有两种应用模式:前后端不分离和前后端分离 前后端不分离 前后端不分离通俗来讲就是不区分前端和后端,浏览器请求时服务器直接返回页面,其示意图如下 前后端分离 前后端分 ...

  6. python5---输入用户名和密码,登录三次不成功,无法再次登录

    #!/usr/bin/env python_user = "harry"_password = "123456"for i in range(3): usern ...

  7. LAMP 搭建,wordpress.xcache,powerdns及poweradmin

    一,概念 CGI: CGI全称是通用网关接口(Common Gateway Interface),是外部应用程序与与服务器之间的接口标准,是在CGI程序和web服务器之间传递信息的规程 CGI是一段程 ...

  8. AtCoder AGC036C GP 2 (组合计数)

    题目链接 https://atcoder.jp/contests/agc036/tasks/agc036_c 题解 终于有时间补agc036的题了. 这题其实不难的来着--我太菜了考场上没想出来 首先 ...

  9. 11.Python变量及其使用

    无论使用什么语言编程,其最终目的都是对数据进行处理.程序在编程过程中,为了处理数据更加方便,通常会将其存储在变量中. 形象地看,变量就像一个个小容器,用于“盛装”程序中的数据.除了变量,还有常量,它也 ...

  10. Jmeter -- 同步定时器

    作用: 模拟并发. 设置一个阀值(请求数量),当请求数达到这个阀值时,允许请求同时发出.例如:想测试一座桥的并发(忽略载重等其他因素,只考虑通过),那么并发的请求就是类似于多少辆车可同时通过桥,而车辆 ...