数据库管理系统MySQL

  • 一、MySQL的介绍
  • 2、数据处理流程
  • 3、数据存储及处理
  • 4、数据库管理系统
  • 5、MySQL介绍及概念
  • 二、MySQL及DataGrip部署
  • 1、MySQL安装
  • 2、DataGrip的安装
  • 3、DataGrip连接MySQL
  • 三、SQL介绍及其规则
  • 1、SQL的介绍
  • 2、SQL的分类
  • 3、SQL的规则
  • 四、SQL分析之DDL
  • 1、数据库管理
  • 2、数据表管理
  • 五、SQL分析之DML
  • 1、创建表格
  • 2、插入数据
  • 3、更新数据
  • 4、删除数据
  • 六、SQL分析之DQL
  • 1、准备数据
  • 2、基本语法
  • 3、简单查询
  • 4、条件查询:where
  • 5、聚合查询
  • 6、分组查询:gourp by
  • 7、排序查询:order by
  • 8、分页查询:limit
  • 9、结果保存
  • 七、多表关系与查询
  • 1、多表关系
  • 2、join
  • 3、子查询


一、MySQL的介绍

2、数据处理流程

  • 数据采集:将产生各种数据进行统一化的存储
  • 数据存储:将数据存储数据仓库中
  • 数据处理:使用SQL开发语言开发程序对数据进行处理
  • 数据应用:将处理好的结果进行 应用

3、数据存储及处理

  • 存储的形式:文件
  • 不能满足企业中对于数据处理需求
  • 工作需求:更加规范的数据存储、处理
  • 早期:Excel【表格,聚合统计分析,图表】
  • 问题
  • Excel能承载的数据量大小:MB
  • 实际工作中要处理的数据大小:GB
  • Excel中提供的功能不能满足对数据处理的需求
  • 支持开发不同的功能
  • 开发的方式不太友好
  • 解决
  • 数据库管理系统

4、数据库管理系统

  • 功能
  • 专门用户数据存储、处理数据的工具
  • 特点
  • 承载数据量会更大
  • 更加规范化
  • 功能更加全面
  • 开发接口更加优化:SQL
  • 应用场景
  • 网站后台中存储商品信息、订单信息、用户注册 信息

5、MySQL介绍及概念

  • 常见的数据库管理系统
  • Oracle:Sun公司商业化数据库产品,性能功能是最强大,但是是收费的商业化产品
  • SQL Server:微软公司的产品,受Windows局限性比较大 ,市场占有率并不高,收费
  • MySQL:Sun公司的社区产品,体积小,速度快,总体使用的成本比较低
  • MySQL的介绍
  • 典型的市场占有率是最高的数据库管理系统
  • 在国内非常广泛
  • 所有网站后台的存储
  • 概念
  • 数据库管理系统
  • 专门用户存储和处理数据【结构化数据】的工具
  • MySQL就是一个数据库管理系统
  • 结构化数据
  • 例如:表格,行和列是固定的
  • 行和列是固定的结构,就是数据的格式存在一定的规律
  • 数据库:MySQL中用于管理和区分数据表的单元
  • database
  • 理解为对数据进行分类存放的划分
  • 数据库1:存放用户的数据
  • 数据库2:存放商品的数据
  • 数据库3:存放订单的数据
  • 类似于一个Excel文件
  • 人事:人事的Excel文件
  • 财务:财务的Excel文件
  • 表格:MySQL中用于在数据库中划分数据的单元
  • 将数据进行更细的划分
  • 类似于一个Excel文件中会有多张表
  • 人事Excel文件
  • 在职人员信息表
  • 离职人员信息表
  • 财务Excel文件
  • 报销信息表
  • 收入信息表
  • 报税信息表
  • 数据库管理系统与Excel对比

Excel

MySQL

一个Excel文件

一个数据库

可以有多个Excel的sheet表格

可以有多张数据表

表格有行和列

表格中有行和列

  • 区别:
  • MySQL功能更加强大
  • Excel的开发比较复杂
  • MySQL对数据进行处理:SQL
  • MySQL的使用
  • SQL:开发语言,实现数据的存储以及分析管理

二、MySQL及DataGrip部署

1、MySQL安装

  • 参考MySQL安装文档实现安装

2、DataGrip的安装

  • 功能:使用图形化界面的方式来操作MySQL,进行数据的管理
  • 参考DataGrip安装文档实现安装

3、DataGrip连接MySQL

  • 创建一个连接,配置连接MySQL即可
  • MySQL所在机器的地址和端口
  • 地址:localhost
  • 端口:3306
  • MySQL的连接驱动
  • 下载
  • MySQL用户名和密码
用户名:root
密码:123456
  • MySQL连接地址属性
jdbc:mysql://localhost:3306?serverTimezone=UTC
  • 参考视频或者课件中的图片实现连接

三、SQL介绍及其规则

1、SQL的介绍

  • Struct Qurey Language:结构化查询语言
  • 一种编程语言,是一种命令,通过这种命令或者编程语言开发程序来实现数据处理
  • MySQL使用SQL命令来管理MySQL中数据
  • SQL是所有RDBMS【关系型数据库管理系统】通用语言
  • 在语法上有一点点区别

2、SQL的分类

  • MySQL中的SQL根据不同的功能模块划分不同的命令的分类
  • DDL:数据定义语言
  • 如何管理我们的数据库和表
  • 数据库的管理:创建、删除、切换
  • 学生信息数据库
  • 表的管理:创建、删除、清空、描述
  • 学生表
  • 成绩表
  • 学籍表
  • DML:数据操作语言
  • 如何管理表中的数据
  • 对表中数据实现以下功能
  • 插入:insert
  • 更改:update
  • 删除:delete
  • 例如
  • 录入学生信息
  • 更改学生信息
  • 删除学生信息
  • DQL:数据查询语言
  • 实现对表中数据的查询和统计分析
  • 我们在工作中60%的开发都是开发SQL,有90%都是在开发DQL
  • select

3、SQL的规则

  • 所有的SQL语句都需要以分号来作为结束符,表示这条命令结束了,可以提交运行
show databases;
show tables;
select * from mysql.user;

四、SQL分析之DDL

1、数据库管理

  • 创建
  • 功能:构建一个新的数据库
  • 语法
create database [ if not exists ] 数据库的名字;
  • 测试
  • 创建一个新的数据库叫做:itcast01
create database itcast01;
  • 创建一个新的数据库:itcast02
create database if not exists itcast02;
  • if not exists:如果不存在的情况下,就创建,如果已经存在就不会创建
  • 功能:为了避免程序报错
  • 如果不加:数据库已存在,就会报错
  • 如果加了:数据库已存在,不会报错
  • 列举
  • 功能:用于列举当前MySQL中所有的数据库名称
  • 语法
show  databases;
  • 测试
  • 查看
  • 功能:查看当前所在的数据库
  • 语法
select database();
  • 测试
  • null表示我们当前不在任何一个数据库中
  • 切换
  • 功能:切换到某个数据库中
  • 语法
use 数据库名称;
  • 测试
  • 切换到itcast01这个数据库中
use itcast01;
  • 切换到itcast02这个数据库中
use itcast02;
  • 删除
  • 功能:删除已存在的一个数据库
  • 语法
drop database [ if exists ] 数据库名称;
  • 测试
  • 删除itcast01这个数据库
drop  database itcast01;
  • if exists :如果存在,就删除,如果不存在就不删除
  • 功能:为了避免程序报错
  • 如果不加:数据库不存在,删除就会报错
  • 如果加了:数据库不存在,删除不会报错

2、数据表管理

  • 数据类型
  • 定义:用于描述表中列的一个数据格式
  • 类型:
  • 字符类型:中文、英文或者比较长的数字、日期都可以使用字符串来存储
  • 字符类型是万能的类型
'a':这就是一个字符,一个数字、一个英文字母、一个符号'abc,12344':这就是一个字符串,很多个字符构成一个整体
  • 字符串表示的数字是不能参与计算的
  • 只要是字符类型,就使用varchar(N)
  • N表示字符串的长度,只能大不能小
  • 手机号码:varchar(11)
  • varchar(20):可以
  • varchar(10):不可以
  • 数字类型
  • 整数
  • 整形:int
  • 只要是整数就用:int
  • 小数
  • 单精度:float
  • 双精度:double
  • 只要是小数就用:double
  • 日期类型
  • 日期是一种特殊的格式
  • date:用于存储年月日
  • yyyy-MM-dd
  • 2020-01-01
  • datetime:用于存储年月日,时分秒
  • yyyy-MM-dd HH:mm:ss
  • 2020-01-01 12:30:50
  • 创建
  • 功能:在某个数据库中创建一张,定义表的结构【表中哪些列以及每一列的类型】
  • 语法
create table [if not exists] [数据库名称.]表的名称(   col1 type1,   col2 type2,   col3 type3,   ……   colN typeN);
  • 注意事项
  • 所有的符号都是英文的,不允许出现中文符号
  • 除了最后一行就是结尾括号的前一号不用加逗号,其他的都要加逗号
  • 每一列都要指定对应的类型
  • 字符串:varchar(N)
  • 整数:int
  • 小数:double
  • 年月日日期:date
  • 年月日时分秒:datetime
  • 如果不加数据库名称,表示在当前数据库中创建表
  • 测试
  • 创建一张学生表student:学生学号、学生姓名、学生年龄、学生性别
create table if not exists student(   stuid varchar(10),   stuname varchar(10),   age int,   sex varchar(2));
  • 列举
  • 功能:列举当前数据库中所有的表
  • 语法
show tables;
  • 测试
  • 描述
  • 功能:查看一张表的详细的结构信息
  • 语法:
desc  [dbname.]tbname;
  • 测试
desc student;desc bigdata.student;
  • 删除
  • 功能:删除一张不需要再使用的表
  • 语法
drop table [ if exists ] [dbname.]tbname;
  • 测试
drop table if exists student;

五、SQL分析之DML

1、创建表格

  • 创建一个商品的分类表:category
  • 分类编号:cid
  • 分类名称:cname
  • 创建语句
create table category(  cid varchar(5),  cname varchar(10));

2、插入数据

  • 功能:写入一条数据进入数据表
  • 关键字:insert
  • 语法
insert into tbname(co11,col2,col3……)  values(value1,value2,value3……);
  • 测试
insert into category(cid,cname) values('c001','电器');insert into category(cname) values('服饰');insert into category(cid,cname) values(null,'化妆品');insert into category values('c002','书籍');insert into category values(null,'蔬菜');
  • 查询某张表的所有内容
select * from category;
  • 注意事项
  • 所给定的列的名称必须与后面的值一一对应
  • 给定值的时候,除了数值类型或者null,其他类型必须加上单引号
  • 给定的值不能超过创建表时定义的长度
  • 如果要给表中的每一列都赋值,就可以不写列名

3、更新数据

  • 功能:修改数据表中的数据
  • 关键字:update
  • 语法
update 表的名称 set col1 = newValue,col2 = newValue …… [where 条件];
  • 测试
  • 需求1:将服饰的分类id更改为c003
update  category set  cid = 'c003';
  • 上面不能满足我们的需求,因为更改了其他不需要更改的数据
  • 解决:加上where 条件
  • 只有满足where条件的数据才会被更改
  • 没有指定where条件,就更改所有数据
  • 需求2:将服饰的分类id更改为c004
update category set cid = 'c004' where cname = '服饰';
  • 需求3:将化妆品的分类id更改为c001,并且将分类名称更改为化妆
update category set cid='c001',cname='化妆' where cname = '化妆品';
  • 需求4:将所有 c003的分类名称更改为笔记本
update category set cname = '笔记本' where cid = 'c003';
  • 注意:
  • 更改的列的新的值必须与列的类型相符
  • 新的值不能超过这一列的长度

4、删除数据

  • 功能:删除数据表中的数据
  • 关键字:delete
  • 语法
delete from 表的名称  [where 条件];
  • 如果不加where条件,会删除整张表所有的数据
  • where 条件:符合条件的数据将会被删除
  • 需求1:删除所有分类名称为笔记本的分类数据
delete from category where cname = '笔记本';
  • 需求2:删除分类id不为c001的分类的数据
delete from category where cid != 'c001';
  • 清空表中所有的数据
  • delete:用于删除表中的数据,一行一行删除
delete from category;
  • truncate:用于清空整张表的数据
truncate category;
  • 区别
  • delete:DML命令,一条一条删除
  • truncate:DDL命令,类似于将整张表删除,然后重新创建一张一样的空表

六、SQL分析之DQL

1、准备数据

  • 创建测试数据库
drop database if exists bigdata;create database bigdata;use bigdata;
  • 创建商品表
create table product( pid int, pname varchar(20), price double, category_id varchar(32));
  • 插入商品测试数据
INSERT INTO product(pid,pname,price,category_id) VALUES(1,'联想',5000,'c001');INSERT INTO product(pid,pname,price,category_id) VALUES(2,'海尔',3000,'c001');INSERT INTO product(pid,pname,price,category_id) VALUES(3,'雷神',5000,'c001');INSERT INTO product(pid,pname,price,category_id) VALUES(4,'杰克琼斯',800,'c002');INSERT INTO product(pid,pname,price,category_id) VALUES(5,'真维斯',200,'c002');INSERT INTO product(pid,pname,price,category_id) VALUES(6,'花花公子',440,'c002');INSERT INTO product(pid,pname,price,category_id) VALUES(7,'劲霸',2000,'c002');INSERT INTO product(pid,pname,price,category_id) VALUES(8,'香奈儿',800,'c003');INSERT INTO product(pid,pname,price,category_id) VALUES(9,'相宜本草',200,'c003');INSERT INTO product(pid,pname,price,category_id) VALUES(10,'面霸',5,'c003');INSERT INTO product(pid,pname,price,category_id) VALUES(11,'好想你枣',56,'c004');INSERT INTO product(pid,pname,price,category_id) VALUES(12,'香飘飘奶茶',1,'c005');INSERT INTO product(pid,pname,price,category_id) VALUES(13,'海澜之家',1,'c002');
  • 创建商品分类类:categroy
create table category(  category_id varchar(10),  category_name varchar(100));
  • 插入商品分类测试数据
insert into category values('c001','电脑');insert into category values('c002','服装');insert into category values('c003','化妆品');insert into category values('c004','吃的');insert into category values('c005','喝的');

2、基本语法

  • 功能:实现对于数据表中的数据的查询、统计分析、处理
  • 关键字:select
  • 语法
select 1 from 2 where 3 group by 4 having 5 order by 6 limit 7;
  • 1:用于决定查询的结果中有哪些列,给定哪些列,结果就会显示这些列
  • 写列的名字,多列用逗号隔开
  • *号代表所有的列
  • 2:用于表示查询哪张表,给定表的名字
  • 3:条件查询,只有满足条件的数据才会被返回
  • 不满足条件的数据会被过滤掉,不会在结果中显示
  • 符合where条件的行才会在结果中显示
  • 4:用于实现分组的,将多条数据按照某一列或者多列进行分组,划分到同一组中
  • 用于实现统计分析
  • 语法:group by col
  • 5:用于实现分组后的条件过滤
  • 功能类似于where
  • 满足having后的条件就会出现在结果中
  • 不满足条件就会被过滤掉
  • 与where的区别
  • where:分组之前过滤
  • having:分组之后过滤
  • 6:用于实现将查询的结果按照某一列或者多列进行排序
  • order by col [ asc | desc]
  • asc:升序排序
  • desc:降序排序
  • 如果不指定,默认是升序排序
  • 7:用于实现分页输出

3、简单查询

  • 查询所有的商品信息
select * from product;
  • 查询所有的商品名称和价格
select pname,price from product;
  • 查询所有的商品名称和价格,结果的列的名称分别为商品和价格
select pname as '商品', price as '价格' from product;
  • as:用于给列或者表取别名
  • 查询所有商品的价格,并去掉重复价格
  • 查询所有商品价格
  • 去掉重复价格
select distinct price from product;
  • distinct:用于对列值进行去重
  • 将所有商品的价格+10元显示
select price as '价格' , price + 10 as '新价格' from product;
  • 直接对数值类型的列进行运算
  • 加:+
  • 减:-
  • 乘:*
  • 除:/

4、条件查询:where

  • 功能:对于数据行的过滤
  • 查询商品名称为“花花公子”的商品所有信息
select * from product where pname = '花花公子';
  • 查询价格为800商品
select * from product where price = 800;
  • 查询价格不是800的所有商品
select * from  product where  price != 800;
  • 查询商品价格大于60元的所有商品信息
select * from product where price > 60;
  • 等于:=
  • 不等于:!=
  • 小于:<
  • 大于:>
  • 小于等于:<=
  • 大于等于:>=
  • 查询商品价格在200到1000之间所有商品
select * from product where price >= 200 and price <= 1000;select * from product where price between 200 and 1000;
  • and:并列关系,两个条件都要满足
  • 查询商品价格是200或800的所有商品
select * from product where price = 200 or price = 800;
  • or:或者关系,两个条件满足其中一个即可
  • 查询含有’霸’字的所有商品
select * from product where pname like '%霸%';
  • %:任意多个字符
  • 查询以’香’开头的所有商品
select * from product where pname like '香%';
  • 查询第二个字为’想’的所有商品
select * from  product where pname like '_想%';
  • _:表示一个字符
  • 查询没有分类的商品
insert into product values(14,'weiC 100',9.9,null);
select * from product where category_id is null;
  • 查询有分类的商品
select * from product where category_id is not null;

5、聚合查询

  • 聚合函数
  • 函数:MySQL为你定义好的功能,你只要调用这个命令就可以实现聚合功能
  • MYSQL默认为我们提供的常见的聚合函数
  • count(colname):统计某一列的行数,统计个数,null不参与统计
  • sum(colname):计算某一列的所有值的和,只能对数值类型求和,如果不是数值,结果为0
  • max(colname):计算某一列的所有值中的最大值
  • min(colname):计算某一列的所有值中的最小值
  • avg(colname):计算某一列的平均值
  • 查询商品的总条数
select count(pid) as '总个数' from product;
  • 查询价格大于200商品的总条数
select count(pid) as '大于200的商品个数' from product where price > 200;
  • 查询分类为’c001’的所有商品价格的总和
select sum(price) as totalPrice from product where category_id = 'c001';
  • 查询分类为’c002’所有商品的平均价格
select avg(price) as '平均价格' from product where category_id = 'c002';
  • 查询商品的最大价格和最小价格
select max(price) as '最大价格',min(price) as '最小价格' from product;

6、分组查询:gourp by

  • 关键字:group by col …… having
  • 功能:按照某些列进行分组,对分组后的数据进行处理,一般都会搭配聚合函数使用
  • 统计各个分类商品的个数
  • 分析过程
  • 结果长什么样?
category_id			个数c001				3c002				5c003				3c004				2c005				1
  • 按照什么分组?
  • 按照category_id进行分组
  • 统计每组商品的个数
  • count
select category_id,count(*) as '个数' from product group by category_id;
  • 统计查询每种分类中的商品的最大价格和最小价格
  • 分析
  • 结果长什么样?
  • 三列:分类的id 最大价格 最小价格
  • 按照分类的id进行分组
  • 统计每个分组内部的最大价格和最小价格
select      category_id,    max(price) as maxprice,    min(price) as minprice   from     product  group by     category_id;
  • 统计各个分类商品的个数,且只显示个数大于1的数据
select category_id,count(*) as '个数' from product group by category_id;
  • 需要对分组后的结果再进行行的过滤
  • where:实现对数据行的过滤,指定条件
  • 这个需求中不能使用where
  • 因为where会在group by之前执行,而个数是在分组之后才产生的列
  • having:实现对数据行的过滤,指定条件,写法与where一致
  • 用于分组之后结果数据的过滤
  • 对分组以后的 结果进行过滤
  • 什么时候用where,什么时候用having
  • 你要过滤的条件是分组之前就存在的,还是分组以后才产生的
select category_id,count(*) as '个数' from product group by category_id having count(*) > 1;

7、排序查询:order by

  • 关键字:order by col…… 【 asc | desc】
  • 功能:将结果按照某些列进行升序或者 降序的排序来显示
  • 默认是升序
  • asc:升序
  • desc:降序
  • 查询所有商品的信息,并按照价格降序排序
select * from product order by  price desc;
  • 查询所有商品的信息,并按照价格排序(降序),如果价格相同,以分类排序(降序)
select * from product order by price desc,category_id desc;
  • 统计各个分类商品的个数 ,并按照个数降序排序
select category_id,count(*) as '个数' from product group by category_id;
select category_id,count(*) as '个数' from product group by category_id order by count(*) desc;

8、分页查询:limit

  • 关键字:limit
  • 功能:限制输出的结果
  • 语法:limit M,N
  • M:你想从第M+1条开始显示
  • N:显示N条
  • 显示第一条到第三条
  • M:0
  • N:3
  • 显示第9条到第10条
  • M:8
  • N:2
  • 如果从第一条开始,M为0,可以省略不写
  • limit N
  • 查询product表的前5条记录
select * from product limit 0,5;select * from product limit 5;
  • 查询product表的第4条和第5条记录
select * from product limit 3,2;
  • 查询商品个数最多的分类的前三名
  • 查询所有商品分类的商品个数
select category_id,count(*) as numb  from product group by category_id;
  • 对上一步做排序
select category_id,count(*) as numb  from product group by category_id order by numb desc;
  • limit选择前三名
select category_id,count(*) as numb  from product group by category_id order by numb desc limit 3;

9、结果保存

  • 语法
insert into 表的名称   select……
  • 功能:将一条select语句运行的结果写入一张表中
  • 注意:结果表的列一定要与Select语句的结果的列要匹配
  • 列的名称可以不一样
  • 但是列的类型和个数必须一一对应
  • 统计各个分类商品的个数 ,并按照个数降序排序,并将结果进行保存
select  category_id,  count(*) as numbfrom  productgroup by  category_idorder by  numb desc;
--创建一张表用于存储分析的结果create table result (  cid varchar(100),  numb int);
--将分析的结果存储在这张表中insert into resultselect  category_id,  count(*) as numbfrom  productgroup by  category_idorder by  numb desc;

七、多表关系与查询

1、多表关系

  • 电商数据库
  • 用户表
  • 用户id、用户名称、用户手机……
  • 商品表
  • 商品id、商品名称、商品价格、库存、尺寸……
  • 订单表
  • 订单id、用户id、商品id、总金额、支付方式
  • 员工数据库
  • 员工表
  • 员工id、员工姓名、员工性别、年龄、部门id……
  • 部门表
  • 部门id、部门名称、部门位置、部门领导……
  • 员工和部门之间的关系
  • 员工属于某一个部门
  • 表与表之间通过某些列来实现关联,表现数据之间的关系

2、join

  • 功能:通过两张表之间关联的列,实现将两张表的列进行合并
  • 关键字:A join B on 条件
  • 语法
select 查询的两张表的哪些列  from A表  join  B表  on 关联条件;
  • 本质:通过某种列的关系,将两张表的列进行了关联
  • 需求1:查询每个商品的名称以及所属分类的名称
  • 分析结果长什么样?
商品名称			分类名称联想					电脑……weiC 100			 吃的
  • 问题:商品名称 属于商品表,分类名称属于分类表
  • 关系:分类id:categor_id
  • 查询
--将商品表与分类表通过分类id进行关联,并显示两张表的所有列select   a.*,   b.*from   product as a join category as b on a.category_id = b.category_id;
select  a.pname,  b.category_namefrom  product a join category b on a.category_id = b.category_id;
  • 需求2:统计每个分类名称对应的商品个数
select  b.category_name,  count(*) as numbfrom  product a join category b on a.category_id = b.category_idgroup by  b.category_name;
  • 需求3:统计除了吃的分类以外的所有分类的商品个数,并显示个数最多的前三个分类
select    b.category_name,   count(*) as numbfrom    product a join category b on a.category_id = b.category_idwhere   b.category_name != '吃的'group by   b.category_nameorder by   numb desclimit 3;
  • 分类
  • inner join:内连接,inner可以省略
  • 关联条件中,两张表都有这个值,结果就有
  • 类似于集合中两个集合的交集
  • left outer join:左外连接,outer可以省略
  • 关联条件中,左表中有,结果就有
  • 类似于集合中左表的全集
select  a.pname,  b.category_namefrom  product a left join category b on a.category_id = b.category_id;
  • 左表是product,右表是category
  • 如果product表中有一条数据的category_id是c006,而category中没有
  • 结果有
  • right outer join:右外连接,outer可以省略
  • 关联条件中,右表中有,结果就有
  • 类似于集合中右表的全集
select  a.pname,  b.category_namefrom  product a right join category b on a.category_id = b.category_id;
  • 左表是product,右表是category
  • 如果category表中有一条数据的category_id是c006,而product中没有
  • 结果有
  • full join:全连接
  • 关联条件中,两张表任意一边有,结果就有
  • 类似于集合中的两张表全集

3、子查询

  • 功能:在select语句中嵌套select语句
  • 需求1:查询化妆品这个分类对应的所有商品信息
  • 分析结果长什么样?
  • 所有商品信息:product
  • 条件:化妆品这个分类对应的商品
  • 化妆品:category
  • 解决:先获取化妆品对应的分类id,然后根据分类id到商品表中查询这个分类id对应的商品
select category_id from category where category_name = '化妆品';select * from product where category_id = 'c003';

|

select * from product where category_id = (select category_id from category where category_name = '化妆品');
  • 先执行内层的SQL语句
  • 然后执行外层的SQL语句
  • 需求2:查询相宜本草对应的分类的名称
  • 结果:显示分类的 名称:category
  • 条件:相宜本草 pname:product
--先查询相宜本草对应的分类idselect category_id from product where pname = '相宜本草';--根据分类id到分类表中查询分类的名称select category_name from category where category_id = 'c003';|select category_name from category where category_id = (select category_id from product where pname = '相宜本草');
  • join与子查询的应用场景
  • 如果你的查询结果包含多张表的列
  • join
  • 如果你的查询结果只有一张表的列,条件来自于别的表
  • 子查询