目录

一、数据库基础知识

1、数据库介绍

2、数据库的分类

3、SQL 语⾔介绍

4、MySQL 数据库介绍 

5、数据库连接⼯具 Navicat 

5.1、连接数据库操作步骤 

二、数据类型和约束 

1、数据类型

1.1、整数⽆符号设置

2、约束

2.1、主键

2.2、不为空

2.3、唯⼀

2.4、默认值

三、SQL 语句详解

1、查询窗⼝的开启⽅法

2、单语句运⾏⽅法

3、 数据库操作

3.1、创建数据库

3.2、使⽤数据库

3.3、修改数据库

3.4、删除数据库和查看所有数据库

3.5、数据库备份

3.6、扩展: 使⽤命令备份数据库

 4、数据表操作

4.1、创建表

4.2、查看表

4.3、扩展: 判断表存在移除再创建

4.4、扩展: 通过 Navicat ⼯具获取创表语句的⽅法​编辑  

4.5、查看表结构和删除表

5、数据操作

5.1、增加数据

5.2、修改数据

5.3、删除数据

5.4、扩展 1: 逻辑删除

5.5、扩展 2: 其他删除数据的⽅法

6、查询语句 

6.1、基本查询

6.2、条件查询

6.3、其他复杂查询

6.4、使⽤ Navicat ⼯具中的命令列

​编辑

7、连接查询 

7.1、内连接

7.2、左连接

7.3、右连接

7.4、存在左右连接的必要性

7.5、连接查询的⼩结

​8、⾃关联

9、⼦查询

9.1、⼦查询语句充当条件

9.2、⼦查询语句充当数据源

10、数据库⾼级扩展内容(了解)

10.1、ER 模型

10.2、外键 

10.3、索引

11、扩展: 实际项⽬中数据库中表的样式

11.1、实际项⽬的表名设计规律​编辑

11.2、查看创表语句中的字段注释​编辑 

12、SQL 练习题获取⽹站 

12.1、⼒扣

12.2、牛客网


一、数据库基础知识

1、数据库介绍

说明: 数据库是专⻔门⽤来存储数据的软件

注意: 对于测试⼯作⽽⾔, 如果项⽬⻚页⾯没有实现, 但是我们⼜想要校验数据, 则可以直接通过查询数据库实现

关系: 具体存在的商品录⼊后 -> 产⽣对应的数据(存到数据库中) -> 最后会被 加载到项⽬⻚页⾯中

2、数据库的分类

分类:

1. 关系型数据库: 以数据表为核⼼

2. ⾮关系型数据库: 不存在数据表的概念

关系型数据库: RDMS(Relational Database Management System)关系型数据库系统

常⻅的关系型数据库:

        Oracle: 在⼤型项⽬中使⽤,例如:银⾏、电信等项⽬

        MySQL: Web 项⽬中使⽤最⼴泛的关系型数据库

        Microsoft SQL Server: 在微软的项⽬中使⽤

        SQLite: 轻量级数据库,主要应⽤在移动平台

关系型数据库的核⼼要素:

数据⾏(⼀条记录)

数据列(字段)

数据表(数据⾏的集合)

数据库(数据表的集合,⼀个数据库中能够有 n 多个数据表)

关系型数据库核⼼要素示例

3、SQL 语⾔介绍

 SQL:Structured Query Language(结构化查询语⾔),通过 SQL 语 ⾔可以对数据库进⾏操作

注意:

1. SQL 语⾔默认⽀持操作所有常⻅见的关系型数据库

2. 作为测试⼈员, 必须要掌握 SQL 的查询语句

(DQL:数据查询语⾔,⽤于对数据进⾏查询,例如:select)

3. 对于 MySQL ⽽⾔, 编写 SQL 语句时, 不区分字⺟的⼤⼩写

4、MySQL 数据库介绍 

MySQL 是⼀个关系型数据库管理系统,⽬前属于 Oracle 旗下产品, ⽬ 前为⽌ MySQL 社区版是可以免费使⽤的

特点: 开源、免费、跨平台(Windows/macOS/Linux)、跨语⾔(Java/Python...)

5、数据库连接⼯具 Navicat 

说明: 由于数据库软件处于服务器中, 想要操作数据库, 就必须使⽤⼯具远程连 接数据库后, 进⾏操作

5.1、连接数据库操作步骤 

说明: 将来在⼯作中, 想要远程连接数据库, 需要具备以下条件:

1. 数据库所在服务器的 IP 地址及数据库的端⼝号

2. 向相关⼈员获取数据库的账号和密码

3. 使⽤数据库连接⼯具, 远程连接数据库即可

注意: 远程连接需要注意⽹络连通性

二、数据类型和约束 

1、数据类型

数据类型: 对于填⼊的数据值本身进⾏控制, 保证数据准确性 

整数: int,有符号范围(-2147483648 ~2147483647),⽆符号 (unsigned)范围(0 ~ 4294967295)

⼩数: decimal,例如:decimal(5,2) 表示共存5位数,⼩数占2位,整数占3 位

字符串: varchar,范围(0~65533),例如:varchar(3) 表示最多存3个字 符,⼀个中⽂或⼀个字 ⺟都占⼀个字符

⽇期时间: datetime,范围(1000-01-01 00:00:00 ~ 9999-12-31 23:59:59),例如:'2020-0101 12:29:59'

1.1、整数⽆符号设置

2、约束

约束: 对于整张数据表进⾏限制, 确保对应字段的所有数据符合设计要求 

主键(primary key): 能唯⼀标识表中的每⼀条记录的属性组

⾮空(not null): 此字段不允许填写空值

唯⼀(unique): 此字段的值不允许重复

默认值(default): 当不填写此值时会使⽤默认值,如果填写时以填写为准

外键(foreign key): ⼀个表中的⼀个字段引⽤另⼀个表的主键

2.1、主键

主要用于保证数据表内没一条的顺序是固定的,不会由于删除或增加数据,而导致数据乱序

注意:

1. 一般的在一张数据表只需要有一个主键 

2. 为了使用方便,一般会设置为自动递增并确是无符号

2.2、不为空

设置字段内数据必须有值,不能为空(NULL) 

2.3、唯⼀

1、索引 -> 字段

 2、选择索引类型为: unique(唯⼀)

要求当前字段内的所有数据不能重复

2.4、默认值

如果填写字段对应数据,则显示填写内容,如果不填写,则显示默认值您内容

注意:如果默认值内容为字符串,必须加引号(英文格式)

三、SQL 语句详解

1、查询窗⼝的开启⽅法

2、单语句运⾏⽅法

3、 数据库操作

3.1、创建数据库

-- 创建数据库

-- create database 数据库名 charset=utf8 collate=utf8_general_ci; 
create database python charset=utf8 collate=utf8_general_ci;

-- 查看数据库

-- show create database 数据库名; 
show create database python;

3.2、使⽤数据库

-- use 数据库名; 
use python;

-- 查看当前数据库: database() 是 SQL 的内置函数, 括号不能省略! 
select database();

3.3、修改数据库

-- 修改数据库
-- 创建
create database testpython charset = gb2312;

-- 修改
-- alter database 数据库名
-- default character set 编码格式
-- default collate 排序规则; 
alter database testpython 
default character set utf8mb4 
default collate utf8mb4_general_ci;

3.4、删除数据库和查看所有数据库

-- 删除数据库
-- drop database 数据库名; 
drop database python;

-- 查看所有数据库 
show databases;

3.5、数据库备份

1. 应⽤场景

说明: 在测试⼯作中, 为了防⽌对数据库产⽣错误操作, 或产⽣垃圾数据, 都需要在操作前, 适当对数据库进⾏备份操作.

垃圾数据: 例如在⾃动化测试中, 对注册模块操作⽣成的所有数据, 属于典型的垃圾数据, 应该清理

2.备份⽅法 

利⽤⼯具(Navicat)  ->  备份步骤

1、数据库 -> 转储 SQL ⽂件 -> 结构+数据

2、⾃⾏选择存放位置

3、备份结束

3. 还原操作

1、数据库 -> 运⾏ SQL ⽂件

2、选择备份⽂件

3、还原结束

3.6、扩展: 使⽤命令备份数据库

注意: 命令是不需要连接到数据库以后执⾏的!(⾮ mysql> 模式) 

1. mysql> 为 SQL 语句编写模式, ⾮ Linux 命令⾏模式

mysql -u 数据库用户名 -p 数据库密码

注意:mysql>  仅支持SQL语句

2. 命令备份与还原数据库操作

备份命令:mysqldum -u数据库用户名 -p 目标数据库名 > 备份文件名.sql

还原命令:mysql -u数据库用户名 -p 目标数据库名 < 备份文件名.sql

注意:需要根据提示显示数据库密码,执行数据库备份与还原操作

4、数据表操作

4.1、创建表

-- 创建表
-- create table 表名(
-- 字段名 类型 约束,
-- 字段名 类型 约束
-- ...
-- )

-- 简单创建
create table stu( 
  name varchar(5)
);

-- 完整创建
-- unsigned : ⽆符号
-- primary key : 主键
-- auto_increment : ⾃动增⻓长 
create table students( 
  id int unsigned primary key auto_increment, 
  name varchar(20), 
  age int unsigned, 
  height decimal(5,2) 
);

4.2、查看表

-- 查看表信息
-- show create table 表名; 
show create table students;

-- 执⾏结果
-- CREATE TABLE `students` (
-- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-- `name` varchar(20) DEFAULT NULL,
-- `age` int(10) unsigned DEFAULT NULL,
-- `height` decimal(5,2) DEFAULT NULL,
-- PRIMARY KEY (`id`)
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8

4.3、扩展: 判断表存在移除再创建

-- 扩展: 判断表是否存在, 存在时先删除再创建
-- drop table : 删除表
-- if exists students : 如果 students 存在 
drop table if exists students; 
create table students( 
  id int unsigned primary key auto_increment, 
  name varchar(20), 
  age int unsigned, 
  height decimal(5,2) 
);

4.4、扩展: 通过 Navicat ⼯具获取创表语句的⽅法  

4.5、查看表结构和删除表

-- 查看表结构(字段)
-- desc 表名; 
desc students;

-- 删除表
-- drop table 表名; 
drop table students;

5、数据操作

5.1、增加数据

1. 增加⼀⾏数据

-- 增加数据

-- 增加⼀⾏数据
-- insert into 表名 values(...)
-- 注意:
-- 1. 数据值需要和表的字段⼀⼀对应(数据个数及数据类型)
-- 2. 主键列是⾃动增⻓长,插⼊时需要占位,通常使⽤ 0 或者 default 或者 null 来占位,
--    插⼊成功后以实际数据为准 
insert into students values(0, '张三', 28, 1.78);

-- 增加部分值
-- insert into 表名(字段1,...) values(值1,...)
-- 注意: 值的顺序与给出的字段顺序对应
insert into students(name, height) values('李四', 1.68);

2. 增加多⾏数据

-- 插⼊多⾏数据
-- ⽅式1: 将单⾏插⼊语句, 多句执⾏, 每句分号隔开
insert into students values(0, '王五', 28, 1.78); 
insert into students(name, height) values('赵六', 1.68);

-- ⽅式2: 在插⼊单⾏数据的语法基础上, 将 value 后边的数据进⾏多组化处理
-- insert into 表名 values(...),(...)...
-- insert into 表名(列1,...) values(值1,...),(值1,...)...
insert into students values(0, '王五1', 29, 1.78),(0, '王五2', 30, 1.78); 
insert into students(name, height) values('赵六1', 1.78),('赵六 2', 1.88);

5.2、修改数据

-- 修改数据
-- update 表名 set 列1=值1,列2=值2... where 条件
-- 注意: where 不能省略, 否则会修改整列数据 
update students set age=48 where id=9;

语句作⽤对应

5.3、删除数据

-- 删除数据
-- delete from 表名 where 条件;
-- 注意: where 不能省略, 否则会删除全部数据 
delete from students where id=6;

5.4、扩展 1: 逻辑删除

逻辑删除: 对于重要的数据,不能轻易执⾏ delete 语句进⾏删除。因为⼀旦删 除,数据⽆法恢复,这 时可以进⾏逻辑删除。

1、给表添加字段,代表数据是否删除,⼀般起名 isdelete,0代表未删除,1代 表删除,默认值为0

2、当要删除某条数据时,只需要设置这条数据的 isdelete 字段为1

3、以后在查询数据时,只查询出 isdelete 为0的数据

1. 第⼀步 

 2. 第⼆和第三步

-- 扩展 1: 逻辑删除(假删/标记删除)
-- 1> 修改要删除的数据的特定字段为删除状态
update students set isdelete=1 where id=4;
-- 2> 查询所有 isdelete 字段为 0 的所有数据 
select * from students where isdelete=0;

5.5、扩展 2: 其他删除数据的⽅法

-- 扩展 2: 其他数据删除⽅法
-- delete from 表名 : 删除所有数据, 但是不重置主键字段的计数
-- truncate table 表名 : 删除所有数据, 并重置主键字段的计数
-- drop table 表名 : 删掉表(字段和数据均不再存在) 
delete from students; 
truncate table students; 
drop table students;

与图形化⻚页⾯菜单的对应关系

6、查询语句 

6.1、基本查询

-- 需求1: 准备商品数据, 查询所有数据, 查询部分字段, 起字段别名, 去重
-- 查询所有数据: select * from 表名; 
select * from goods;
-- 查询部分字段: select 字段名1, 字段名2 from goods; 
select goodsName, price from goods;
-- 起字段别名: select 字段名 as '别名' from goods;
select goodsName as '商品名称', price as '价格' from goods;
-- 注意: 别名的引号可以省略
select goodsName as 商品名称, price as 价格 from goods;
-- 注意: as 关键字也可以省略[掌握]
select goodsName 商品名称, price 价格 from goods;

-- 起别名的作⽤: 1> 美化数据结果的显示效果 2> 可以起到隐藏真正字段名的作⽤
-- 另: 除了可以给字段起别名以外, 还可以给数据表起别名(连接查询时使⽤)

-- 去重: select distinct(字段名) from goods;
-- 效果: 将⽬标字段内重复出现的数据只保留⼀份显示
-- ⼩需求: 显示所有的公司名称
select distinct(company) from goods;

6.2、条件查询

1. ⽐较运算符&逻辑运算符

-- 需求2: 查询价格等于30并且出⾃并夕夕的所有商品信息 
select * from goods;
-- 查询价格等于30 : ⽐较运算符(特殊: (⼤于等于)>=/(⼩于等于)<=/(不等 于)!=/<>) 
select * from goods where price=30;
-- 并且出⾃并夕夕的所有商品信息 : 逻辑运算符(and(与)/or(或)/not(⾮))
-- 注意: 作为查询条件使⽤的字符串必须带引号!
select * from goods where price=30 and company='并夕夕';
-- 补充需求: 查询价格等于30但不出⾃并夕夕的所有商品信息
select * from goods where not company='并夕夕' and price=30;
-- 注意: not 与 and 和 or (左右两边连接条件)不同之处在于, 
-- not 只对⾃⼰右侧的条件有作⽤(右边连接条件) 
select * from goods where price=30 and not company='并夕夕';

2. 模糊查询

-- 需求3: 查询全部⼀次性⼝罩的商品信息
-- 模糊查询: like 和符号 %(任意多个字符)/_(任意⼀个字符)
-- 注意: 作为查询条件使⽤的字符串必须带引号!
-- 注意: 如果需要控制字符数量, 需要使⽤_, 并且有⼏个字符就使⽤⼏个_
-- %关键词% : 关键词在中间
select * from goods where remark like '%⼀次性%';
-- %关键词 : 关键词在末尾
select * from goods where remark like '%⼀次性';
-- 关键词% : 关键词在开头
select * from goods where remark like '⼀次性%';

3. 范围查询

-- 需求4: 查询所有价格在30-100的商品信息
-- 范围查询: 1> ⾮连续范围: in 2> 连续范围: between ... and ... 
select * from goods where price between 30 and 100;
-- 注意: between ... and ... 的范围必须是从⼩到⼤
select * from goods where price between 100 and 30;

4. 判断空

-- 需求5: 查询没有描述信息的商品信息
-- 注意: 在 MySQL 中, 只有显示为 NULL 的才为空! 
-- 其余空⽩可能是空格/制 表符(tab)/换⾏符(回⻋车键)等空⽩符号
-- 判断空: 1> 为空: is null 2> 不为空(双重否定表肯定): is not null 
select * from goods where remark is null;
-- 补充需求: 查询有描述信息的所有商品
select * from goods where remark is not null;

6.3、其他复杂查询

1. 排序

-- 需求6: 查询所有商品信息, 按照价格从⼤到⼩排序, 价格相同时, 按照数量 少到多排序
-- select * from 表名 order by 列1 asc|desc,列2 asc|desc,...
-- 说明: order by 排序, asc : 升序, desc : 降序
-- 注意: 排序过程中, ⽀持连续设置多条排序规则, 但离 order by 关键字越近, 排序数据的范围越⼤!
select * from goods order by price desc; 
select * from goods order by price desc, count asc;
-- 注意: 默认排序为升序, asc 可以省略
select * from goods order by price desc, count;

2. 聚合函数

-- 需求7: 查询以下信息: 商品信息总条数; 最⾼商品价格; 最低商品价格; 
-- 商品平均价格; ⼀次性⼝罩的总数量

-- 聚合函数: 系统提供的⼀些可以直接⽤来获取统计数据的函数

-- 商品信息总条数: count(字段): 查询总记录数 
select count(*) from goods;
-- 注意: 统计数据总数, 建议使⽤*, 如果使⽤某⼀特定字段, 可能会造成数据总数错误!
select count(remark) from goods;
-- 最⾼商品价格: max(字段): 查询最⼤值 
select max(price) from goods;
-- 最低商品价格: min(字段): 查询最⼩值 
select min(price) from goods;
-- 商品平均价格: avg(字段): 求平均值 
select avg(price) from goods;
-- ⼀次性⼝罩的总数量: sum(): 求和
-- 注意: 此处的 count 是数据表中字段名!
select sum(count) from goods where remark like '%⼀次性%';
-- 扩展: 在需求允许的情况下, 可以⼀次性在⼀条SQL语句中, 使⽤所有的聚合函数 
select count(*), max(price), min(price), avg(price) from goods;

3. 分组

-- 需求8: 查询每家公司的商品信息数量

-- 分组: select 字段1,字段2,聚合... from 表名 group by 字段1,字段2...
-- 说明: group by : 分组
-- 注意:
-- 1> ⼀般情况, 使⽤哪个字段进⾏分组, 那么只有该字段可以在 * 的位置处使⽤, 
-- 其他字段没有实际意义(只要⼀组数据中的⼀条)
-- 2> 分组操作多和聚合函数配合使⽤
select count(*) from goods group by company; 
select * from goods; 
select company, count(*) from goods group by company;
-- 说明: 其他字段没有实际意义(只要⼀组数据中的⼀条)
select price, count(*) from goods group by company;
-- 扩充: 分组后条件过滤
-- 说明: group by 后增加过滤条件时, 需要使⽤ having 关键字
-- 注意:
-- 1. group by 和 having ⼀般情况下需要配合使⽤
-- 2. group by 后边不推荐使⽤ where 进⾏条件过滤
-- 3. having 关键字后侧可以使⽤的内容与 where 完全⼀致(⽐较运算符/逻 辑运算符/模糊查询/判断空)
-- 3. having 关键字后侧允许使⽤聚合函数

-- where 和 having 的区别:
-- where 是对 from 后⾯指定的表进⾏数据筛选,属于对原始数据的筛选
-- having 是对 group by 的结果进⾏筛选
-- having 后⾯的条件中可以⽤聚合函数,where 后⾯不可以

4. 分⻚页查询

-- 需求9: 查询当前表当中第5-10⾏的所有数据
-- 分⻚页查询: select * from 表名 limit start,count
-- 说明: limit 分⻚页; start : 起始⾏号; count : 数据⾏数
-- 注意: 计算机的计数从 0 开始, 因此 start 默认的第⼀条数据应该为 0, 后续数据依次减1
-- 过渡需求: 获取前 5 条数据
select * from goods limit 0, 5;
-- 注意: 如果默认从第⼀条数据开始获取, 则 0 可以省略! 
select * from goods limit 5;
-- 需求:
select * from goods limit 4, 6;

-- 扩展 1: 根据公式计算显示某⻚页的数据
-- 已知:每⻚页显示m条数据,求:显示第n⻚页的数据
-- select * from 表名 limit (n-1)*m, m
-- 示例: 每⻚页显示 4 条数据, 求展示第 2 ⻚页的数据内容 
select * from goods limit 0, 4; 
-- 第1⻚页(有数据) 
select * from goods limit 4, 4; 
-- 第2⻚页(有数据) 
select * from goods limit 8, 4; 
-- 第3⻚页(有数据) 
select * from goods limit 12, 4; 
-- 第4⻚页(⼀共 12 条数据, 每⻚页显示 4 条, 没有第 4 ⻚页数据)

-- 扩展 2: 分⻚页的其他应⽤
-- 需求: 要求查询商品价格最贵的数据信息
select * from goods order by price desc limit 1;
-- 进阶需求: 要求查询商品价格最贵的前三条数据信息
select * from goods order by price desc limit 3;

6.4、使⽤ Navicat ⼯具中的命令列

1. 

2. 命令⾏基本操作步骤

7、连接查询 

7.1、内连接

-- 需求1: 查询所有存在商品分类的商品信息 
select * from goods; select * from category;

-- 内连接: select * from 表1 inner join 表2 on 表1.列=表2.列
-- 显示效果: 两张表中有对应关系的数据都会显示出来, 没有对应关系的数据均不再显示 
select * from goods 
inner join category on goods.typeId=category.typeId;
-- 扩充: 给表起别名(1> 缩短表名利于编写 2> ⽤别名给表创建副本) 
select * from goods go 
inner join category ca on go.typeId=ca.typeId;

-- 扩展: 内连接的另⼀种写法(旧式写法)
-- select * from 表1, 表2 where 表1.字段名=表2.字段名; 
select * from goods, category where 
goods.typeId=category.typeId;

7.2、左连接

-- 需求2: 查询所有商品信息,包含商品分类
-- 左连接: select * from 表1 left join 表2 on 表1.列=表2.列

-- 注意: 如果要保证⼀张数据表的全部数据都存在, 
-- 则⼀定不能选择内连接, 可以选择左连接或右连接

-- 说明:
-- 以 left join 关键字为界, 关键字左侧表为主表(都显示), 
-- ⽽关键字右侧的表为从表(对应内容显示, 不对应为 null) 
select * from goods go 
left join category ca on go.typeId=ca.typeId;

-- 扩充需求: 以分类为主展示所有内容(以哪张表为主表, 显示结果上是有区别的!)
select * from category ca 
left join goods go on ca.typeId=go.typeId;

7.3、右连接

-- 需求3: 查询所有商品分类及其对应的商品的信息
-- 右连接: select * from 表1 right join 表2 on 表1.列=表2.列

-- 说明:
-- 以 right join 关键字为界, 关键字右侧表为主表(都显示), 
-- ⽽关键字左侧 的表为从表(对应内容显示, 不对应为 null) 
select * from goods go 
right join category ca on go.typeId=ca.typeId;

-- 扩充需求: 查询所有商品信息及其对应分类信息 
select * from category ca 
right join goods go on ca.typeId=go.typeId;

7.4、存在左右连接的必要性

说明: 能够体现左右连接必要性的场景为: ⾄少为三张表进⾏连接查询

注意: 实际⼯作中, 最多也就三张表连接查询

7.5、连接查询的⼩结

 8、⾃关联

前提:

        1. 数据表只有⼀张

        2. 数据表中⾄少有两个字段之间有某种联系

⽅式: 通过给表起别名的形式, 将原本只有⼀张的数据表变为两张, 然后通过对 应字段实现连接查询 

8.1、查询河南省下所有市的信息 

-- 需求4: 查询河南省所有的市
-- 说明: ⽆论是使⽤内连接还是左连接, 都只影响中间数据表的内容多少,
-- 由于最终的过滤条件相同, 因此查询结果⼀致

-- 使⽤内连接
select * from areas a1 
inner join areas a2 on a1.aid=a2.pid 
where a1.atitle='河南省';

-- 使⽤左连接
select * from areas a1 
left join areas a2 on a1.aid=a2.pid 
where a1.atitle='河南省';

8.2、查询河南省下所有的市和区的信息

-- 需求5: 查询河南省的所有的市和区
-- 说明: 想要实现三级⾏政单位显示, 需要分别处理省和市及市和区(三表连 查) 
select * from areas a1 
left join areas a2 on a1.aid=a2.pid 
left join areas a3 on a2.aid=a3.pid 
where a1.atitle='河南省';

9、⼦查询

⼦查询: 在⼀个 select 语句中,嵌⼊了另外⼀个 select 语句,那么嵌⼊的 select 语句称之为⼦查询语句

作⽤: ⼦查询是辅助主查询的,要么充当[条件],要么充当[数据源]

9.1、⼦查询语句充当条件

-- 需求6: 查询价格⾼于平均价的商品信息
-- ⼦查询语句充当条件:
-- 求取平均价
select avg(price) from goods;
-- 说明: 充当⼦查询的语句需要使⽤括号括起来(运算优先级括号最⾼!)否则报错 
select * from goods where price > (select avg(price) from goods);

9.2、⼦查询语句充当数据源

-- 需求7: 查询所有来⾃并夕夕的商品信息, 包含商品分类
-- ⼦查询语句充当数据源:
-- select * from goods go
-- left join category ca on go.typeId=ca.typeId;
-- select * from (select * from goods go left join category ca 
-- on go.typeId=ca.typeId) new
-- where new.company='并夕夕';

-- 问题: 连接查询的结果中, 表和表之间的字段名不能出现重复, 否则⽆法直接使⽤
-- 解决: 将重复字段使⽤别名加以区分(表名.* : 当前表的所有字段) 
select * from (select go.*, ca.id cid, ca.typeId ctid, 
ca.cateName from goods go left join category ca on 
go.typeId=ca.typeId) new where new.company='并夕夕';

10、数据库⾼级扩展内容(了解)

10.1、ER 模型

E 表示 entry,实体: 描述具有相同特征事物的抽象[数据表]

属性: 每个实体的具有的各种特征称为属性[数据(表内的字段)]

R 表示 relationship,联系: 实体之间存在各种关系,关系的类型包括包括⼀ 对⼀、⼀对多、多对多[表和表之间的联系]

10.2、外键 

说明: 通过外部数据表的字段, 来控制当前数据表的数据内容变更, 以避免单⽅⾯移除数据, 导致关联表数据产⽣垃圾数据的⼀种⽅法

注意: 如果⼤量增加外键设置, 会严重影响除数据查询操作以外的其他操作(增/ 删/改)的操作效率, 因此在实际项⽬中很少会被采⽤, 但是在⾯试中容易被问到.

10.3、索引

说明: 可以⼤幅度提⾼查询语句的执⾏效率

注意: 如果⼤量增加索引设置, 会严重影响除数据查询操作以外的其他操作(增/ 删/改)的操作效率, 不⽅便过多添加. 

验证索引效果案例实现步骤:

说明: 提供的示例⽂件可以使⽤在数据库中使⽤运⾏ SQL ⽂件⽅式导⼊! 

-- 开启运⾏时间监测 set profiling=1;
-- 查找第⼀万条数据 10000
select * from test_index where num='10000';
-- 查看执⾏的时间 show profiles;
-- 为表 text_index 的 num 列创建索引
create index test_index on test_index(num);
-- 执⾏查询语句
select * from test_index where num='10000';
-- 再次查看执⾏的时间 show profiles;

11、扩展: 实际项⽬中数据库中表的样式

11.1、实际项⽬的表名设计规律

11.2、查看创表语句中的字段注释 

12、SQL 练习题获取⽹站 

12.1、⼒扣

12.2、牛客网

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐