SQL测试的使用

一、关于数据库的使用步骤

在项目测试中,是如何使用数据库的?

1、构造测试数据

2、定位BUG

3、搭建测试环境

4、验证查询结果(尤其是多表查询)

5、数据库测试(按数据库设计文档进行测试)

1、构造测试数据

1)构造少量的测试数据:可以操作直接修改,使用updata修改,也可以使用insert 语句插入

2)构造大量的测试数据:先导入SQL 文件(比如项目经理给的sql文件),使用存储过程循环构造数据


测试工程师平时如何运用MySQL?

1、搭建测试环境

2、更全面地开展系统测试、功能测试。(定位bug,验证查询功能,构造测试数据,数据库测试等)。

3、性能测试(涉及到构造大量的测试数据,测响应时间等)

MySQL的安装

  1. MySQL的获取:最新的MySQL版本可从官网下载:https://www.mysql.com/downloads/
  2. MySQL的安装:安装PHPStudy,使用其中的MySQL环境。PHPStudy是一个集成程序包,集成了MySQL、Apache、PHP等环境。
  3. 图形化的数据库管理工具:市面上有非常多的工具可供选择,比较常用的有: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

  1. 多条件之间可用逻辑运算符进行连接,多条件常用的三个逻辑运算符:与、或、非
  2. and:与(且)的意思,表示多条件同时满足 ----条件1  and 条件2  and 条件3 ...
  3. or:或(或者)的意思,表示多条件其中之一满足即可 ---- 条件1 or 条件2 or 条件3...
  4. not:非(取反)的意思,表示条件的对立面满足 ---- not 条件
  5. 注意:可以使用括号将逻辑运算符进行组合   ---- 如,not (条件1 and|or 条件2)

模糊查询  like

语法:where 字段 like '关键字和通配符的组合'

  • 常用通配符:
  1. %     表示:0~多个字符
  2. _      表示: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 表名;

  1. 用来过滤掉重复的记录,重复的只保留一条
  2. 对单个字段去重很好理解,对多个字段去重,指的是多个字段都相同的记录,才去重。
例如,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  可忽略

  1. 给字段取别名
  2. 给表取别名     -----  表名 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:降序,从大到小。
  • 多字段排序,多字段排序的处理逻辑如下:
  1. 先按order by 后的第一个排序条件进行排序。
  2. 如果排序后有相同的值,则再按第二个排序条件进行排序。
  3. 如果排序后没有相同的值,则忽略第二个排序条件。

分页查询   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  字段名 =  (查询子句)

  1. 查询子句返回一个字段, 并且字段中只有一个值
  2. 可以扩展到所有关系统运算符: >, < , >=,<=, =,!=/<>
use mydb4;
#只知道课程名为“java语言”,想查询“java语言”课的所有学生成绩
#第一步:在课程表中,通过“java语言”求课程号

#第二步:在成绩表中,通过课程号求学号和成绩

#第三步:整合,把第二步中的'02'变成英文的括号,
#再把第一步的语句,除了英文的分号,放到括号中。

in

select * from 表名 where  字段名 in(查询子句)

  1. 查询子句返回一个字段,并且字段中有多个值时

>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. 关联查询:将多张表合并成一张大表,然后从这张大表里去查询特定的数据。
  2. 这里所谓的“合并”,使用的是“笛卡尔积运算”的方式。将其中一张表的每一行,分别和另一张表的各行进行组合,拼接成1张大表。
  3. 笛卡尔积运算,两张表的”合并“:三张表的”合并“:
    两张表的”合并“:
    将A表的第一行记录,和B表的每一行记录做合并;再将A表的第二行记录,和B表的每一行记录做合并;依次类推。
    
    行相乘:合并后的大表,行数=A表行数*B表行数。
    列相加:合并后的大表,列数=A表列数+B表列数。
    三张表的”合并“:
    先合并其中两张表,形成大表后,再和第三张表合并。
  4. 笛卡尔积的sql语句表达:select * from A表,B表;    合并后的大表中有很多记录是无意义的垃圾数据,需要进行清理;使用where 加上筛选条件xh=xh,过滤掉没有意义的数据,只保留有效的数据在表内。
    #学生表和成绩表的“合并”(笛卡尔积运算)
    select * from xsb,cjb;
  5. 特点:大表中生成出来记录数(行数):行相乘。A表的行数*B表的行数。
    -----A表(2行)B表(3行)共生成6行(2*3)。
    大表中生成出来记录数(列数):列相加。A表的列数+B表的列数。
    -----A表(3列)B表(2列)共生成5列(3+2)。
  6. 注意: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. 最终查询结果展示的字段来自多张表,适合用关联查询。
  3. 关联查询,只需要展示符合关联条件的结果时,用内联接。。
  4. 关联查询,需要展示某张表某所有表的全部记录时,用外联接(左外、右外、全外)。
  5. 添加关联条件时,找到两张表中都具有的字段,字段=字段。字段前加上表名,表名1.字段=表名2.字段。
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值