一、关于数据库的使用步骤
在项目测试中,是如何使用数据库的?
1、构造测试数据
2、定位BUG
3、搭建测试环境
4、验证查询结果(尤其是多表查询)
5、数据库测试(按数据库设计文档进行测试)
1、构造测试数据
1)构造少量的测试数据:可以操作直接修改,使用updata修改,也可以使用insert 语句插入
2)构造大量的测试数据:先导入SQL 文件(比如项目经理给的sql文件),使用存储过程循环构造数据
测试工程师平时如何运用MySQL?
1、搭建测试环境
2、更全面地开展系统测试、功能测试。(定位bug,验证查询功能,构造测试数据,数据库测试等)。
3、性能测试(涉及到构造大量的测试数据,测响应时间等)
MySQL的安装
- MySQL的获取:最新的MySQL版本可从官网下载:https://www.mysql.com/downloads/
- MySQL的安装:安装PHPStudy,使用其中的MySQL环境。PHPStudy是一个集成程序包,集成了MySQL、Apache、PHP等环境。
- 图形化的数据库管理工具:市面上有非常多的工具可供选择,比较常用的有:Navicat、SQLyog、HeidiSQL、phpMyAdmin等。这些数据库管理工具,和数据库管理系统,是两个维度的概念。
- 数据库管理系统,是系统软件,用来管理和操控数据库的大型软件。
- 数据库管理工具,是应用软件,提供良好的GUI界面对数据库管理系统进行操作。
2、定位bug
操作步骤如下:
1)在页面上录入一些数据后保存
2)保存后再列表或者详情页,发现某些刚刚录入过的数据未显示 或是 显示错误
3)可以去查看数据库中的这个数据是否存入成功 以及 落库的存储数据的内容是否正确,以此可以定位bug 是前端 还是后端的,有时需要结合抓包工具一起来定位。
3、搭建测试环境
按照部署文档进行安装,官网上下载的包 或是 leader 给的包
4、验证查询结果(尤其是多表查询)
例如,有时系统内的数据比较多比较复杂,测试查询功能时,查询出的结果,我们无法判断是否属实、是否正确,就需要去数据库里 自己编写SQL 语句进行查询,以此来比对前台的查询结果的正确性。
5、数据库测试(安装数据库设计文档进行测试)
1)验证:开发实现的数据库和设计文档是否一致,像表名、字段名、数据类型、约束条件
2)业务流测试,在页面上录入数据,在数据库中查看数据存储是否正确
3)数据流测试,数据库中构造数据,在页面查看数据展示是否正确。
二、数据看的基本概念
1、数据 Data 的定义
描述事物的符号纪录
2、数据库 DB(DataBase) 的定义
长期存储在计算机内的,可共享的,统一管理的大量数据的集合,即存储数据的仓库
3、数据库管理系统 DBM(DataBase Managment)的定义
管理和操控数据库的大型软件,用于建立、使用和维护数据库。
4、数据库系统 DBS(DataBase System)的定义
引入(应用)数据库的系统。通常由应用系统、数据库管理系统、数据库一起构成.
三、数据库的分类
关系型数据库:
定义:
采用了关系模型来组织数据的数据库。
特点:
以表的方式存储数据,另一个特点:使用SQL语言来进行数据库的管理
常见的关系型数据库
- Oracle:甲骨文公司 Oracle公司,一般用于大型的商业软件,闭源,收费
- SQL Server:是微软的,一般用于大型的商业软件,闭源,收费
- MySQL:目前属于Oracle公司,有收费版、也有社区维护版(免费)
- MariaDB:MySQL的分支,开源项目
- SQLite:是小型 轻型数据库,也是开源的。运行起来消耗的资源很少
- OceanBase:是阿里 自主研发的数据库
注:一般大型项目会用到Oracle和SQL Server,银行、金融业、医院、机场等等。
中小型项目一般会使用MySQL MariaDB。
非关系型数据库:
定义:
不是使用关系模型来管理数据的,又称为NoSQL数据库 NoSQL:not only sql;non-relational
特点:
不以表的方式存储数据。基于键值对、列、文档、图形等来进行存储,应用在大数据量、高并发等场景
常见的非关系型数据库:
Redis、HBase、MongoDB、SequoiaDB、Elasticsearch、 HugeGraph、GeaBase
非关系型数据库的四大类
- 1:键值(Key-Value)存储数据库,如 Redis
- 2:列存储数据库,如 HBase
- 3:文档型数据库,如 MongoDB、SequoiaDB(国内自助研发的 巨杉数据库 已开源) 、Elasticsearch(是个全文搜索引擎,也可以用来做数据)
- 4:图形(Graph)数据库,如 HugeGraph(百度自主研发的 已开源)、GeaBase(蚂蚁金融自主研发的)
四、数据库的操作
1、SQL的概念
SQL:Structured Query Language。结构化查询语言。
学习语言最关键的:单词 + 语法
2、SQL的分类
- DDL:Data Definition Language。数据库定义语言。用于定义数据的结构。对数据结构进行操作。操作对象:库、表 (增 create 、删 drop、改 alter、查show)
- DML:Data Manipulate Language。数据操作语言。用于改变数据库表内的数据。对数据进行操作。操作对象:数据(增 insert、删 delete、改 update)
- DQL:Data Query Language。数据查询语言。用于检索数据库内的数据。这部分的语言语法最为复杂和灵活,是我们学习的重点。对数据进行操作。操作对象:数据(查 select)
- DCL:Date Control Language。数据库控制语言。用于定义数据库用户的权限。(不常用,一般DBA:DataBase Administrators才会用到)(QC不需要掌握)grant、revoke
3、SQL语句的标准语法
- 1、以;结尾(英文的分号)
- 2、注释
单行注释:#单行注释(//java单行注释、#python单行注释) 、 -- 单行注释(注意:-- 后面有空格)
多行注释:/*多行注释、多行注释 */ (和java的多行注释一样)
- 3、使用''将字符串引起来。'字符串' —— 如,enum('男','女','未知')
- 4、使用,来作为间隔
4、库的操作
创建数据库 create database
语法:create database 数据库名;
#创建1个数据库,名称为mydb1
-- 创建1个数据库,名称为mydb1
create database mydb1;
查看数据库 show databases
语法:show databases; (注意:结尾有s,是复数形式。)
#查看当前连接下所有数据库
show databases;
使用数据库 use
语法:use 数据库名;
#使用数据库 mydb1
use mydb1;
删除数据库 drop database
语法:drop database 数据库名;
#删除数据库mydb1
drop database mydb1;
小练习:创建1个数据库mydb2,并将其切换成当前数据库。 #创建1个数据库mydb2 #查看当前连接下所有数据库 #切换其为当前数据库
5、表的操作
常见的三大数据类型
一、数值型
整数 :int
直接输入int,默认最大长度就是11位
int(m) :m表示补零的最大长度
如,int(11) :最大长度为11位的整数,1~11位
小数
单精度浮点型:float
float(m,d) :m表示最大长度(整数和小数加起来的总长度);d表示小数位数
如,float(6,2) :表示最大长度是6位,其中小数占2位
双精度浮点型:double
double(m,d) :m表示最大长度(整数和小数加起来的总长度);d表示小数位数
如,double(10,2) :表示最大长度是10位,其中小数占2位
定点型:decimal
decimal(m,d) :m表示最大长度(整数和小数加起来的总长度);d表示小数位数
如,decimal(10,2) :表示最大长度是10位,其中小数占2位
单精度和双精度有什么区别?
- 占用的字节数不同。
- 单精度浮点float占用4个字节(7位有效数字);
- 双精度浮点double占用8个字节(16位有效数字)。
- double能表示的数值范围比float要大。
浮点型和定点型什么区别?
- 浮点型在数据库中存储时,存的是近似值。会导致数值不够精准(有误差)。
- 定点型解决了这个问题,以字符串的形式来存放小数,因此存进去多少取出来就是多少,足够精确,不存在误差。
- 一般在存储货币、金额相关数据时,比如财务系统、计费系统、银行相关系统等,会使用定点型。
二、字符型
固定长度字符串型:char
如,char(5) :表示长度为5的字符串,长度固定,如果输入的字符串不足5个,以空格填充。
可变长度字符串型:varchar
如,varchar(5) :表示最大长度为5的字符串。长度可变。如果输入的字符串不足5个,按实际长度存储+1。
char和varchar的区别?
- char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.
- varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)。
小结:
- 1)varchar相对于char,比较节约存储空间。
- 2)char由于是固定长度的,因此处理速度比varchar快很多。
枚举型:enum
enum('value1','value2',....) 如,enum('男','女')
特点:取值是枚举列表中的任意一个值
三、日期型
日期型:date
YYYY-MM-DD 如,2021-03-15
时间型:time
HH:MM:SS 如,15:21:08
日期时间型:datetime
YYYY-MM-DD HH:MM:SS 如,2021-03-15 15:21:08
时间戳型:timestamp
YYYYMMDDHHMMSS 如,20210128131415
year
YYYY 如,2021
常见的六大约束条件
为什么要增加约束?
目的是使得数据库中的数据是有意义的、正确的,保障数据库中数据的完整和一致。
一、主键约束 primary key
主键指主关键字,它通常是表中的某一个字段(某几个字段的组合)。
用于唯一地标识表中某一条记录。
一张表只有1个主键。不允许为空,不允许重复。
二、非空约束 not null
不允许为空
三、唯一约束 unique
不允许重复
四、默认值约束 default
当插入数据时没有为该字段赋值,使用默认值进行填充。 如,default '上海'
五、自增约束 auto_increment
当插入数据时没有为该字段赋值,则自动+1后进行填充。(初始值是1,每次在上一次生成的数值上+1)
六、外键约束 foreign key
- 外键稍微复杂些,涉及到两张表。
- 表A,表B。表B的字段和表A的字段(且是主键)数据有关联。那么就可以将表B这个字段作为表B的外键(和表A的主键建立外键约束)。
主表:主键所在的表。如,表A。 从表:外键所在的表。如,表B。
创建表 create table
语法:create table 表名(
字段名1 数据类型1 [约束1] [约束2],
字段名2 数据类型2 [约束],
.........,
字段名n 数据类型n
[ ,foreign key(本表外键名) references 主表表名(主键名)]
);
注意:同一个数据库内,表名不允许重复。
同一张表内,字段名不允许重复。不能和关键字重复
--------------------------------------------------------------------------------------------------------------------------
字段:列
字段名:列名
记录:行
数据类型:存储的是哪一类数据,比如 数字、文字、日期等。
示意图
注意:语法中的[]中内容,指可选项,方括号内的内容可以写可以不写,[]死活不要写
/*创建一张表,表名student;
学号 字段名id,整型;
姓名 字段名sname,变长字符串长度20;
性别 字段名sex,枚举型'男''女';
注册日期 字段名sdate,日期型。*/
/*创建一张表,表名student_pro;
学号 字段名id,整型,主键约束 自增约束;
姓名 字段名sname,变长字符串长度20,非空约束;
电子邮件 字段名email,变长字符串长度50,唯一约束;
地址 字段名address,变成字符串长度50,默认值'shanghai';
*/
#试试约束的生效
insert into student_pro(id,sname,email) values(1,'杀千陌','sqm@163.com');
#成功,默认约束生效了
insert into student_pro(id,sname,email) values(1,'花千骨','hqg@163.com');
#失败,提示1重复,说明主键约束生效
insert into student_pro(id,sname,email) values(null,'糖宝','tb@163.com');
#成功,学号为2,自增约束生效
insert into student_pro(id,sname,email) values(null,null,'hyg@163.com');
#失败,提示name不可为空,非空约束生效
insert into student_pro(id,sname,email) values(null,'白子画','tb@163.com');
#失败,提示email重复,唯一约束生效
/*创建一张表,表名javascore;
学号 字段名jid,整型;
分数 字段名score,整型;
外键约束本表jid关联student_pro表的id字段
*/
#试试外键约束的效果
insert into javascore(jid,score) values(1,90); #成功
insert into javascore(jid,score) values(3,99); #失败,因为student_pro表中没有学号为3号的学生记录,外键约束生效
查看表 show tables
语法:show tables; ---查看当前数据库下所有表
#查看当前数据库下所有表
show tables;
查看表结构 desc
语法:desc 表名;
#查看student_pro表的表结构
desc student_pro;
修改表 alter table
语法:alter table 表名 关键字 修改的内容;
示意图》》》
修改表名 rename
语法:alter table 表名 rename 新表名;
/*创建一张表,表名s;
学号 字段名id,整型;
地址 字段名address,变长字符串长度20;
电子邮件 字段名email,变长字符串长度50 。*/
#修改表名,s改为s1
修改字段名、数据类型 change
语法:alter table 表名 change 旧字段名 新字段名 新数据类型;
- 可以只改字段名,可以只改数据类型,可以字段名和数据类型一次性都改掉
#修改s1的字段名,address改为dz #修改s1的字段类型,dz的类型varchar(20)改为varchar(30) #修改s1的字段类型,将dz名称改为address,数据类型改为varchar(50)
添加字段 add
语法:alter table 表名 add 字段名 数据类型 [约束];
- 注意:语法中的[]中内容,指可选项,方括号内的内容可以写可以不写,[]死活不要写
#为s1增加一个字段phonenum,字段类型为整型,非空约束
删除字段 drop
语法:alter table 表名 drop 字段名;
#删除s1中的phonenum字段
练一练
#修改表名,s1改为s2 #修改字段名和字段类型,email改为wechat,字段类型改为varchar(25) #添加字段,age 整型 #删除字段,address
删除表 drop table
语法:drop table 表名;
#删除student表
6、数据管理
1、插入数据前,先做点准备~~
-- 准备工作
#创建一个数据库mydb3#查看当前连接下所有数据库
#切换到新创建的数据库下进行操作
/*创建一张商品表,表名goods 商品编号,gid,整型,主键,自增 商品名称,gname,变长字符串20,非空 价格,price,整型 */
2、导入数据
导出sql文件
——》在要导出的数据库(或表)上右击,选择“输出”。
——》选择“SQL文件”,保存在某个目录下,关闭弹窗。
——》在保存的目录下,就可以找到该sql文件。
导入sql文件
——》在要导入数据的数据库(或Tables标签)上右击,选择“输入”
——》选中你要导入的sql文件,运行,导入成功。此时刷新数据库下的表,就可以看到导入的表及其数据。#选择goods表,右键导出文件 #新建一个数据库mydb4 CREATE database mydb4; #选择mydb4,右键导入goods文件。看到效果
数据的“增” insert into
- 一次插入一行记录:
语法:insert into 表名(字段1,字段2,...) values(值1,'值2',...);
注意:
1、值和字段是一一对应的,注意位置不要错乱了。
2、值若是字符串和日期,主要加上单引号''。
- 一次插入多行记录
语法: insert into 表名(字段1,字段2,...) values (第一行值1,值2,...), (第二行值1,值2,...), ..... (第n行值1,值2,...) ;
注意:
1、和一次插入一行记录相比,每一组的括号在重复,其他保持不变。
2、每一组记录间用英文逗号,分隔。
数据的“删” delete from
语法:delete from 表名 [条件];
delete from 表名 [where 条件];
- 注意:[条件]为可选项,无论是否需要,死活不要加上[]
-- 数据的“删” #在mydb4中删除数据,使用mydb4 delete from mydb4 [where 条件]; #删除goods表中gid为1的记录 delete from goods where gid='1'; #删除goods表中所有记录 语法:delete from mydb4 where goods;
数据的“删” truncate table
语法:truncate table 表名;
#删除mydb3库goods表中所有记录 使用截断表 truncate关键字
truncate table goods;
truncate 和 delete的区别
- 原因 :delete和truncate原理不同
- delete删除时是将表内记录一条一条遍历删除的。所以速度较慢。
- truncate是先drop掉整张表,再create一张新表。因此速度要快许多。
- 1、truncate删除记录的速度比delete快很多。
- 2、当字段有自增约束时,truncate自增序列重置回1(由于是重新建了表)。delete则延续了原先的自增序列。
- 3、工作中,delete一般用来进行条件删除,truncate用来清空表记录。
练一练
#向使用了delete来清空表记录的mydb4中的goods表插入数据,预期,gid从5/6开始 #向使用了truncate来清空表记录的mydb3中的goods表插入数据,预期,gid从1开始
数据的“改” update ... set
语法:update 表名 set 修改的内容1,修改的内容2 .... [条件];
update 表名 set 修改的内容 [where 条件];
- 注意:
- 1、[条件]是可选项,
- 如果加上条件,则满足条件的记录才进行修改。如果不加条件,则所有记录均进行修改。[]死活不用写。
- 2、支持一次进行多字段修改(多字段更新)。
数据的“查” select ... from
简单查询
语法:select *|字段名1,字段名2... from 表名;
- 注意:
- 1、select后加上对应要查询的字段名。
- 2、如果要查的是所有字段,则用*表示。
- 3、如果要查多个字段,则字段间用英文逗号,分隔
条件查询 where
注意:
1、条件查询中的各个关键字可以结合在一起使用。
2、sql语句可以有多种写法,没有所谓的标准答案,只有参考答案。
3、日期型和字符型一样,加上单引号''处理。
语法:
select *|字段名1,字段名2...
from 表名
where 查询条件;
- 注意:
- 1、select子句的本质是过滤出满足条件的列(字段)。
- 2、from子句确定数据来源于哪张表。
- 3、where子句的本质是过滤出满足条件的行(记录)。
多条件查询 and、or、not
- 多条件之间可用逻辑运算符进行连接,多条件常用的三个逻辑运算符:与、或、非
- and:与(且)的意思,表示多条件同时满足 ----条件1 and 条件2 and 条件3 ...
- or:或(或者)的意思,表示多条件其中之一满足即可 ---- 条件1 or 条件2 or 条件3...
- not:非(取反)的意思,表示条件的对立面满足 ---- not 条件
- 注意:可以使用括号将逻辑运算符进行组合 ---- 如,not (条件1 and|or 条件2)
模糊查询 like
语法:where 字段 like '关键字和通配符的组合'
- 常用通配符:
- % 表示:0~多个字符
- _ 表示:1个字符,有且仅有1个
集合查询 in
语法:where 字段 in(值1,值2,...)
空值查询 is null、is not null
语法:字段名 is null、字段名 is not null
范围查询 between ... and ...
语法:字段名 between 值1 and 值2 ----- 表示的范围是个闭区间:[值1,值2]
- 注意:值1 小 ,值2 大
去重查询 distinct
语法:select distinct 字段1,字段2... from 表名;
- 用来过滤掉重复的记录,重复的只保留一条
- 对单个字段去重很好理解,对多个字段去重,指的是多个字段都相同的记录,才去重。
例如,xsb中 马里奥和魂斗罗都是二次元 男,则针对jg和xb进行去重时,只保留一条 “二次元 男”;
如果,xsb中 马里奥是二次元 女,则针对jg和xb进行去重时,两条记录都会出现,不被去重。会出现“二次元 男” “二次元 女”2条记录。
- 注意:
- 1、distinct只可以在select子句中使用。
- 2、distinct对null不进行过滤,即返回的结果中包含null。
- 3、select distinct * from表名;意味着表内完全相同的记录才会被去重。
聚合函数
count( ):统计个数
count(*) :表示数所有行的个数
count(字段) :表示数这个字段非空的个数
avg( ):求平均数
sum( ):求和
max( ):求最大值
min( ):求最小值
别名 as
用法: 字段名|表名 as 别名 ----- as 可忽略
- 给字段取别名
- 给表取别名 ----- 表名 as 别名 如,cjb as a,kch as b
分组查询 group by ... having
语法:
select *|字段1,字段2....
from 表名
where 过滤条件
group by 分组字段
having 过滤条件注意:分组字段可以有多个;
逻辑顺序,先按第一个字段进行分组,再按第二个字段进行分组。
select 子句 过滤出满足条件的字段(列)-----------------------------5
from子句 确定数据的来源 ----------------------------1
where 子句 过滤出满足条件的记录(行)----------------2
group by子句 对字段进行分组,字段值相
having子句 对分组后的数据进行 进一步 过滤-----------------4
- 在处理比较复杂的查询场景时,可以按这个次序进行思考。
- step1:确定数据的来源,来自哪张表
- step2:过滤出满足条件的记录(行)
- step3:过滤出满足条件的字段(列)
排序显示 order by asc|desc
用法:order by 字段1,字段2.. asc|desc
- asc:升序,从小到大。(可不写,默认就是升序)
- desc:降序,从大到小。
- 多字段排序,多字段排序的处理逻辑如下:
- 先按order by 后的第一个排序条件进行排序。
- 如果排序后有相同的值,则再按第二个排序条件进行排序。
- 如果排序后没有相同的值,则忽略第二个排序条件。
分页查询 limit
语法:limit [位置偏移量,] 记录数 ----- 用于指定返回的记录数。
- 注意:
- 位置偏移量,从哪条记录开始(从哪儿开始返回)。初始值是0,第一条记录的位置偏移量是0。位置偏移量是可选项,可填可不填,不填说明从0开始(从第一条记录开始返回)。
- 记录数,指返回的最大条目数(返回多少条)
- 计算公式 limit a,b ---- 第a条开始,第a+b条结束
limit 3 ---- 从第1条记录开始,返回3条
limit 2,5 ---- 从第3条记录开始,返回5条;即 第3条~第7条 ,计算公式为 2+1=3,2+5=7
总结:SQL各子句
- distinct:用在select子句内,字段的前面。
- 聚合函数:用在select子句内,或having 、order by 子句内。
select ----------------------6 from -----------1 (join on)-----------2 where ------------------3 group by -----------------4 having ---------------------5 order by -------------------------7 limit----------------------------------8 distinct:用在select子句内,字段的前面。 聚合函数:用在select子句内,或having 、order by 子句内。
多表查询 (工作中用更多的是多表查询)
子查询
即嵌套查询,查询语句内嵌套了小的查询语句。
=
select * from 表名 where 字段名 = (查询子句)
- 查询子句返回一个字段, 并且字段中只有一个值
- 可以扩展到所有关系统运算符: >, < , >=,<=, =,!=/<>
use mydb4;
#只知道课程名为“java语言”,想查询“java语言”课的所有学生成绩
#第一步:在课程表中,通过“java语言”求课程号
#第二步:在成绩表中,通过课程号求学号和成绩
#第三步:整合,把第二步中的'02'变成英文的括号,
#再把第一步的语句,除了英文的分号,放到括号中。
in
select * from 表名 where 字段名 in(查询子句)
- 查询子句返回一个字段,并且字段中有多个值时
>all, <all, >any, <any
查询子句返回一个字段,并且字段中有多个值时
all:
- >all :表示比最大的大
select * from 表名 where 字段名 >all(查询子句)
- <all :比最小的小
select * from 表名 where 字段名 <all(查询子句)
any:
- >any : 表示比最小的大
select * from 表名 where 字段名 >any(查询子句)
- <any : 表示比最大的小
select * from 表名 where 字段名 <any(查询子句)
关联查询
原理:
- 关联查询:将多张表合并成一张大表,然后从这张大表里去查询特定的数据。
- 这里所谓的“合并”,使用的是“笛卡尔积运算”的方式。将其中一张表的每一行,分别和另一张表的各行进行组合,拼接成1张大表。
- 笛卡尔积运算,两张表的”合并“:三张表的”合并“:
两张表的”合并“: 将A表的第一行记录,和B表的每一行记录做合并;再将A表的第二行记录,和B表的每一行记录做合并;依次类推。 行相乘:合并后的大表,行数=A表行数*B表行数。 列相加:合并后的大表,列数=A表列数+B表列数。
三张表的”合并“: 先合并其中两张表,形成大表后,再和第三张表合并。
- 笛卡尔积的sql语句表达:select * from A表,B表; 合并后的大表中有很多记录是无意义的垃圾数据,需要进行清理;使用where 加上筛选条件xh=xh,过滤掉没有意义的数据,只保留有效的数据在表内。
#学生表和成绩表的“合并”(笛卡尔积运算) select * from xsb,cjb;
- 特点:大表中生成出来记录数(行数):行相乘。A表的行数*B表的行数。
大表中生成出来记录数(列数):列相加。A表的列数+B表的列数。-----A表(2行)B表(3行)共生成6行(2*3)。
-----A表(3列)B表(2列)共生成5列(3+2)。
- 注意:1)表和字段间用.连接;2)涉及到同名字段,在字段前加上表名,否则数据库无法识别它属于哪张表,会报错;3)初学者,在关联查询的时候,可以习惯性在所有字段前加上表名,这样不易出错。
内联接(内关联)
隐式内联接 ...,... where
select * from 表1,表2 where 关联条件 and 筛选条件;
多张表的语法 ----
from 表1,表2,表3 where 筛选条件
显式内联接 ... inner join... on
select * from 表1 inner join 表2 on 关联条件 where 筛选条件;
多张表的语法--
select *
from (A表 inner join B表) inner join C表
on 关联条件 where 筛选条件;
外联接(外关联)
内联接的特点:只返回满足关联条件的结果集
左外联接 ... left join ... on
除了返回满足关联条件的结果集,将左边那张表的所有记录完整展示出来,右边那张表里不满足过滤条件的字段补空值(null)
右外联接 ... right join ... on
除了返回满足关联条件的结果集,将右边那张表的所有记录完整展示出来,左边那张表里不满足过滤条件的字段补空值(null)
全外联接 ... left join ... on
union
... right join ... on
除了返回满足关联条件的结果集,将两边表的所有记录完整展示出来,不满足过滤条件的字段补空值(null)
- 注意:
- 写在join左边的是左表,右边的是右表。
- mysql不支持full join关键字,而是使用left join union right join 来实现全外关联的。
但,oracle是支持full join的。
内联接和外联接的区别:
- 内联接:只返回满足关联条件的结果集。
- 外联接:除了返回满足关联条件的结果集,还根据要求返回其中1张表或所有表的全部记录,不满足关联条件的则补空值(null)。
总结:多表查询
- 最终查询结果展示的字段仅来自1张表,可以用子查询(嵌套查询)。
- 最终查询结果展示的字段来自多张表,适合用关联查询。
- 关联查询,只需要展示符合关联条件的结果时,用内联接。。
- 关联查询,需要展示某张表某所有表的全部记录时,用外联接(左外、右外、全外)。
- 添加关联条件时,找到两张表中都具有的字段,字段=字段。字段前加上表名,表名1.字段=表名2.字段。