当前位置: 首页 > article >正文

SQL语句及其应用(中)(DQL语句之单表查询)

SQL语句的定义:

概述:

全称叫 Structured Query Language, 结构化查询语言, 主要是实现 用户(程序员) 和 数据库软件(例如: MySQL, Oracle)之间交互用的.

分类:

DDL: 数据定义语言, 主要是操作 数据库, 数据表, 字段, 进行: 增删改查(CURD)
涉及到的关键字: create, drop, alter, show
DML: 数据操作语言, 主要是操作 表数据, 进行: 增删改(CDU) -> 统称为 更新语句.
涉及到的关键字: insert, delete, update
DQL: 数据查询语言, 主要是操作 表数据, 进行: 查询操作®
涉及到的关键字: select, from, where
DCL: 数据控制语言, 主要是 创建用户, 设置权限, 隔离级别等.

通用语法:

  1. SQL语句可以写一行, 也可以写多行, 最后用 分号 结尾.
  2. SQL语句不区分大小写, 为了阅读方便, 建议关键字大写, 其它都小写.
  3. 注释写法:
    /* 多行注释的文本 */
    # 单行注释
    – 单行注释

二, 数据类型的定义

概述:

就是用来限定某列值的范围的, 必须是: 整数, 小数, 字符串, 日期…

常用的数据类型:

  • 整型: int
  • 浮点型: float, double, decimal
  • 日期型: datetime
  • 字符串型: varchar(长度)

三, 约束的定义

概述;

在数据类型的基础上, 进一步对该列值做 限定.

(常用的)分类:

单表约束:
  • primary key 主键约束, 特点: 非空, 唯一, 一般结合 auto_increment(自动增长, 自增)一起使用.`
  • not null 非空约束, 即: 该列值不能为null, 但是可以 重复.
  • unique 唯一约束, 即: 该列值必须不重复, 但是可以 为空.
  • default 默认约束, 等价于Python的 缺省参数.
多表约束:
  • foreign key 外键约束

四, DQL语句(数据查寻语言)

DQL: 数据查询语言, 主要是操作 表数据, 进行: 查询操作®
涉及到的关键字: select, from, where

单表查询

(1) 单表查询 -> 简单查询
格式
# 单表查询, 完整查询格式如下:
select[distinct] 列名1 as 别名, 列名2 as 别名, ...
from数据表名
where组前筛选
group by分组字段
having组后筛选
order by排序字段 [asc| desc]	
limit起始索引, 数据条数;
案例
案例需求

单表查询 -> 简单查询

实现思路
  1. 创建商品表.
  2. 添加表数据.
  3. 查看表数据.
  4. 需求1: 查询所有的商品信息.
  5. 需求2: 查看商品名 和 商品价格.
  6. 扩展: 起别名: 列名, 表名都可以起别名.
  7. 格式: 列名 as 别名 或者 表名 as 别名, 其中 as 可以省略不写.
  8. 需求3: 查看结果是表达式, 将所有的商品价格+ 10, 进行展示.
# 1. 创建商品表.
create table product
(pid 		int primary key auto_increment, # 商品id, 主键pname		varchar(20), 	# 商品名price		double, 		# 商品单价category	varchar(32)		# 商品的分类id
);# 2. 添加数据表.
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'杰克琼斯',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'真维斯',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'相宜本草',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海澜之家',1,'c002');# 3. 查看表数据.
# 4. 需求1: 查询所有的商品信息
select * from product;
select pid, pname, pricem category_id from product;	# 效果同上.# 5. 需求2: 查看商品名 和 商品价格.
select pname, price from product;
# 6. 扩展: 起别名: 列名, 表名都可以起别名.
# 7. 格式: 列名 as 别名 或者 表名 as 别名, 其中 as 可以省略不写.
select pname as 商品名, price 商品价格 from product as p;# 8. 需求3: 查看结果是表达式, 将所有的商品价格+10, 进行展示.
select pname, price + 10 from product;
select pname, price + 10 as price from product;
(2)单表查询 -> 条件查询 -> 比较运算符
格式:
select 列名1, 列名2... from 数据表名 where 条件;
案例
案例需求

单表查询 -> 条件查询 -> 比较运算符

实现思路
  1. 创建商品表.
  2. 添加表数据.
  3. 查看表数据.
  4. 需求1: 查询所有的商品信息.
  5. 需求2: 查看商品名 和 商品价格.
  6. 格式 : select 列名1, 列名2… from 数据列表 where 条件;
  7. 场景1: 比较运算符, >, >=, <, <=, =, !=, <>
  8. 需求1: 查询商品名称为"花花公子"的商品所有信息:
  9. 需求2: 查询价格为800商品.
  10. 需求3: 查询价格不是800的所有商品.
  11. 需求4: 查询商品价格大于60元的所有商品信息.
  12. 需求5: 查询商品价格小于等于800元的所有商品信息.
# 1. 创建商品表.
create table product
(pid 		int primary key auto_increment, # 商品id, 主键pname		varchar(20), 	# 商品名price		double, 		# 商品单价category	varchar(32)		# 商品的分类id
);# 2. 添加数据表.
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'杰克琼斯',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'真维斯',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'相宜本草',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海澜之家',1,'c002');
# 3. 查看表数据.
# 4. 需求1: 查询所有的商品信息
select * from  product;
select pid, pname, pricem category_id from product;	# 效果同上.# 5. 需求2: 查看商品名 和 商品价格.
select pname, price from product;# 6. 格式: select 列名1, 列明2... from 数据表名 where 条件;
# 7. 场景1: 比较运算符, >, >=, <, <=, =, !=, <>.
# 8. 需求1: 查询商品名称为"花花公子"的商品所有信息.
select * from product where pname = '花花公子';# 9. 需求2: 查询价格为800商品.
select * from product where price = 800;# 10. 需求3: 查询价格不是800的所有商品.
select * from product where price != 800;
select * from product where price <> 800;		# 效果同上# 11. 需求4: 查询商品价格大于60元的所有商品信息.
select * from product where price > 60;# 12. 需求5: 查询商品价格小于等于800元的所有商品信息.
select * from product where price <= 800;
(3)单表查询 -> 条件查询 -> 逻辑运算符和范围查询
案例需求
  1. 创建商品表.
  2. 添加表数据.
  3. 查看表数据.
  4. 需求1: 查询所有的商品信息.
  5. 需求2: 查看商品名 和 商品价格.
  6. 格式 : select 列名1, 列名2… from 数据列表 where 条件;
  7. 场景2: 范围查询. between 值1 and 值2 -> 适用于连续的区间, in (值1, 值2…) -> 适用于 固定值的判断.
  8. 场景3: 逻辑运算符. and, or, not
  9. 需求6: 查询商品价格在200到800之间所有商品.
  10. 需求7: 查询商品价格是200或800的所有商品.
  11. 需求8: 查询价格不是800的所有商品.
# 1. 创建商品表.
create table product
(pid 		int primary key auto_increment, # 商品id, 主键pname		varchar(20), 	# 商品名price		double, 		# 商品单价category	varchar(32)		# 商品的分类id
);# 2. 添加数据表.
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'杰克琼斯',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'真维斯',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'相宜本草',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海澜之家',1,'c002');
# 3. 查看表数据.
# 4. 需求1: 查询所有的商品信息
select * from  product;
select pid, pname, pricem category_id from product;	# 效果同上.# 5. 需求2: 查看商品名 和 商品价格.
select pname, price from product;# 6. 场景2: 范围查询.	between 值1 and 值2 -> 适用于连续的区间,		in (值1, 值2...) -> 适用于 固定值的判断.
# 7. 场景3: 逻辑运算符. and, or, not
# 8. 需求6: 查询商品价格在200到800之间所有商品.
select * from product where price between 200 and 800;	# 包左包右.
select * from product where price price >= 200 and price <= 800;# 9. 需求7: 查询商品价格是200或800的所有商品.
select * from product where price in (200, 800);
select * from product where price = 200 or price = 800;# 10. 需求8: 查询价格不是800的所有商品.
select * from product where price != 800;
select * from product where not price = 800;
select * from product where price not in (800);
(4)单表查询 -> 条件判断 -> 模糊查询和非空判断
案例需求

单表查询 -> 条件判断 -> 模糊查询和非空判断

实现思路
  1. 创建商品表.
  2. 添加表数据.
  3. 查看表数据.
  4. 需求1: 查询所有的商品信息.
  5. 需求2: 查看商品名 和 商品价格.
  6. 场景4: 模糊查询. 字段名 like ‘_内容%’ _ 代表任意的1个字符 ; %代表任意的多个字符, 至少0个 , 至多无所谓.
  7. 需求9: 查询以’香’开头的所有商品.
  8. 需求10: 查询第二个字为’想’的所有商品.
  9. 场景5: 非空查询. is null, is not null, 不能用 = 来判断空.
  10. 需求11: 查询没有分类的商品.
  11. 需求12: 查询有分类的商品.
# 1. 创建商品表.
create table product
(pid 		int primary key auto_increment, # 商品id, 主键pname		varchar(20), 	# 商品名price		double, 		# 商品单价category	varchar(32)		# 商品的分类id
);# 2. 添加数据表.
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'杰克琼斯',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'真维斯',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'相宜本草',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海澜之家',1,'c002');
# 3. 查看表数据.
# 4. 需求1: 查询所有的商品信息
select * from  product;
select pid, pname, pricem category_id from product;	# 效果同上.# 5. 需求2: 查看商品名 和 商品价格.
select pname, price from product;
# 6. 场景4: 模糊查询. 字段名 like '_内容%'		_ 代表任意的1个字符; %代表任意的多个字符, 至少0个, 至多无所谓.
# 7. 需求9:查询以'香'开头的所有商品.
select * from product where pname like '香%';
# 8. 需求10: 查询第二个字为'想'的所有商品.
select * from product where pname like '想%';
select * from product where pname like '想';		# 只能查出 *想 两个字的, 不符合题设.# 9. 场景5: 非空查询.	is null, is not nunll, 	不能用=来判断空.
# 10. 需求11: 查询没有分类的商品.
select * from product where category_id = null;		# 不报错, 但是没有结果.
select * from product where category_id is null;	# 正确的, 判空操作.# 11. 需求12: 查询有分类的商品.
select * from product where category_id is not null;	# 正确的, 非空判断操作. 
(5)单表查询 -> 排序查询
格式:
select * from 表名 order by 排序的字段1 [asc | desc], 排序的字段2 [asc | desc], ...;

解释: 1. ascending: 升序, descending: 降序.
解释: 2. 默认是升序, 所以asc可以省略不写.

案例
  1. 创建商品表.
  2. 添加表数据.
  3. 查看表数据.
  4. 需求1: 查询所有的商品信息.
  5. 需求2: 查看商品名 和 商品价格.
  6. 需求1: 根据价格降序排列.
  7. 需求2: 根据价格降序排列, 价格一样的情况下, 根据分类降序排列.
# 1. 创建商品表.
create table product
(pid 		int primary key auto_increment, # 商品id, 主键pname		varchar(20), 	# 商品名price		double, 		# 商品单价category	varchar(32)		# 商品的分类id
);# 2. 添加数据表.
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'杰克琼斯',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'真维斯',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'相宜本草',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海澜之家',1,'c002');
# 3. 查看表数据.
# 4. 需求1: 查询所有的商品信息
select * from  product;
select pid, pname, pricem category_id from product;	# 效果同上.# 5. 需求2: 查看商品名 和 商品价格.
select pname, price from product;
# 6. 需求1: 根据价格降序排列.
select * from product order by price;		# 默认是: 升序.
select * from product order by price asc;	# 效果同上.
select * from product order by price desc;	# 价格降序排列.# 7. 需求2: 根据价格降序排列, 价格一样的情况下, 根据分类降序排列.
select * from product order by price desc, category_id desc;
(6) 单表查询 -> 聚合查询
定义
概述:

聚合查询是对表中的某列表数据做操作.

常用的聚合函数:
  • count() 统计某列值的个数, 只统计非空值. 一般用于统计 表中数据的总条数.
  • sum() 求和
  • max() 求最大值
  • min() 求最小值
  • avg() 求平均值
扩展: count(*), count(1), count(列)的区别是什么
区别1: 是否统计空值
  • count(列): 只统计该列的非空值.
  • count(1), count(*): 统计所有数据, 包括空值.
区别2: 效率问题

count(主键列) > count(1) > count(*) > count(普通列)

案例
案例需求

单表查询 -> 聚合查询

实现思路
  1. 创建商品表.
  2. 添加表数据.
  3. 查看表数据.
  4. 需求1: 查询所有的商品信息.
  5. 需求2: 查看商品名 和 商品价格.
  6. 需求1: 查询商品的总条数.
  7. 需求2: 查询价格大于200商品的总条数.
  8. 需求3: 查询分类为’c001’的所有商品价格的总和.
  9. 需求4: 查询分类为’c002’的所有商品的平均价格.
  10. 需求5:查询商品的`最大价格和最小价格 扩展: ctrl + alt + 字母L 代码格式化.
# 1. 创建商品表.
create table product
(pid 		int primary key auto_increment, # 商品id, 主键pname		varchar(20), 	# 商品名price		double, 		# 商品单价category	varchar(32)		# 商品的分类id
);# 2. 添加数据表.
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'杰克琼斯',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'真维斯',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'相宜本草',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海澜之家',1,'c002');
# 3. 查看表数据.
# 4. 需求1: 查询所有的商品信息
select * from  product;
select pid, pname, pricem category_id from product;	# 效果同上.# 5. 需求2: 查看商品名 和 商品价格.
select pname, price from product;# 6. 需求1: 查询商品的总条数.
select count(pid) as total_cnt from product;
select count(category_id) as total_cnt from product;
select count(*) as total_cnt from product;
select count(1) as total_cnt from product;# 7. 需求2: 查询价格大于200商品的总条数.
select count(pid) as total_cnt from product where price > 200;# 8. 需求3: 查询分类为'c001'的所有商品价格的总和.
select sum(price) as total_price from product where category_id = 'c001'# 9. 需求4: 查询分类为'c002'的所有商品的平均价格.
select avg(price) as avg_price from product where category_id = 'c002';# 10. 需求5: 查询商品的最大价格和最小价格		扩展: ctrl + alt + 字母L 代码格式化.
selectmax(price) as max_price,min(price) as min_price
fromproduct;
(6) 单表查询 -> 分组查询
图解

在这里插入图片描述

分组查询定义
概述:

简单理解为, 根据分组字段, 把表数据 化整为零, 然后基于每一个分组后的每个部分, 进行对应的聚合运算.

格式:
select1,2, ... from 数据表名 where 组前筛选 group by 分组字段 having 组后筛选;
细节
  1. 分组查询 一般要结合 聚合函数一起使用, 且根据谁分组, 就根据谁查询.
  2. 组前筛选用where, 组后筛选用having.
  3. where 和 having的区别是什么?
  • where: 组前筛选, 后边不能跟聚合函数.
  • having: 组后筛选, 后边可以跟聚合函数.
  1. 分组查询的查询列 只能出现 分组字段, 聚合函数.
  2. 如果只分组, 没有写聚合, 可以理解为是:基于分组字段, 进行去重查询.
案例
案例需求
  1. 创建商品表.
  2. 添加表数据.
  3. 查看表数据.
  4. 需求1: 查询所有的商品信息.
  5. 需求2: 查看商品名 和 商品价格.
  6. 需求1: 统计各个分类商品的个数.
  7. 需求2: 统计各个分类商品的个数, 且只显示个数大于1的信息.
  8. 需求3: 演示 如果只分组, 没有写聚合, 可以理解为是: 基于分组字段, 进行去重查询.
  9. 还可以通过 distinct 关键字来实现去重.
  10. 此时是: 按照category_id 和 price作为整体, 然后去重.
# 1. 创建数据表.
create table product
(pid			int primary key auto_increment,	# 商品id, 主键pname		varchar(20),	# 商品名price		double, 		# 商品单价category	varchar(32)		# 商品的分类id
);
# 2. 添加数据表.
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'杰克琼斯',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'真维斯',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'相宜本草',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海澜之家',1,'c002');	# 3. 查看数据表.
# 4. 需求1: 查询所有的商品信息.
select * from product;
select pid, pname, pricem, category_id from product; # 效果同上.# 5. 需求2: 查看商品名 和 商品价格.
select panme, price from product;
# 6. 需求1: 统计各个各个分类商品的个数.
select category_id, count(*) as total_cnt from product group by category_id;# 7. 需求2: 统计各个分类商品的个数, 且只显示个数大于1的信息.
selectcategory_id,count(*) as total_cnt
fromproduct
group bycategory_id		# 根据商品类别分组.
havingtotal_cnt > 1;	# 组后筛选# 8. 需求3: 演示 如果只分组, 没有写聚合, 可以理解为是: 基于分组字段, 进行去重查询.
select category_id from product group by category_id;
select category_id from product group by category_id;	# 9. 还可以通过 distinct 关键字来实现去重.
select distinct category_id from product;# 10. 此时是: 按照category_id 和 price 作为整体, 然后去重.
select distinct category_id, price from product;
select category_id, price from product group by category_id, price;	# 效果同上.
(7)单表查询 -> 分页查询
分页查询的定义
概述:

分页查询 = 每次从数据表中查询出固定条数的数据, 一方面可以降低服务器的压力, 另一方面可以降低浏览器的压力, 且可以提高用户的体验.

格式:
limit 起始索引, 数据条数;
细节:
  1. 表中每条数据都有自己的索引, 且索引是从0开始的.
  2. 如果是从索引0开始获取数据的, 则索引0可以省略不写.
  3. 要学好分页, 掌握如下的几个参数计算规则即可:
  • 数据总条数: count() 函数
  • 每页的数据条数: 产品经理, 项目经理, 你…
  • 每页的起始索引: (当前的页数 - 1) * 每页的数据条数
  • 总页数: (数据总条数 + 每页的数据条数 - 1) // 每页的数据条数
  •   		(13 + 5 - 1) // 5 = 17 // 5 = 3 页(14 + 5 - 1) // 5 = 18 // 5 = 3 页(15 + 5 - 1) // 5 = 19 // 5 = 3 页(16 + 5 - 1) // 5 = 20 // 5 = 4 页
    
案例
案例需求

单表查询 -> 分页查询

实现思路
  1. 创建商品表.
  2. 添加表数据.
  3. 查看表数据.
  4. 需求1: 查询所有的商品信息.
  5. 需求2: 查看商品名 和 商品价格.
  6. 需求1: 5条/页.
  7. 需求2: 3条/页.
# 1. 创建商品表.
create table product
(pid			int primary key auto_increment,	# 商品id, 主键pname		varchar(20),	# 商品名price		double,			# 商品单价category	varchar(32)		# 商品的分类id
)
# 2. 添加数据表.
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'联想',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海尔',3000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'雷神',5000,'c001');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'杰克琼斯',800,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'真维斯',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'花花公子',440,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'劲霸',2000,'c002');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香奈儿',800,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'相宜本草',200, null);
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'面霸',5,'c003');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'好想你枣',56,'c004');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'香飘飘奶茶',1,'c005');
INSERT INTO product(pid,pname,price,category_id) VALUES(null,'海澜之家',1,'c002');	# 3. 查看数据表.
# 4. 需求1: 查询所有的商品信息.
select * from product;
select pid, pname, pricem, category_id from product; # 效果同上.# 5. 需求2: 查看商品名 和 商品价格.
select panme, price from product;
# 6. 需求1: 统计各个各个分类商品的个数.
select category_id, count(*) as total_cnt from product group by category_id;# 7. 需求1: 5条/页.
select * from product limit 5;		# 第1页, 从索引0开始, 获取5条.
select * from product limit 0, 5;	# 第1页, 从索引0开始, 获取5条, 效果同上.
select * from product limit 5, 5;	# 第2页, 从索引5开始, 获取5条.# 8. 需求2: 3条/页.
select * from product limit 0, 3;	# 第1页, 从索引0开始, 获取3条.
select * from product limit 3, 3;	# 第2页, 从索引3开始, 获取3条.
select * from product limit 6, 3;	# 第3页, 从索引6开始, 获取3条.
select * from product limit 9, 3;	# 第4页, 从索引9开始, 获取3条.
select * from product limit 12, 3;	# 第5页, 从索引12开始, 获取3条.

五, 总结

  • Q1: 单表查询的格式?

select[distinct]1 as 别名,2 as 别名
from数据列表
where 组前筛选
group by分组字段
having组后筛选
order by排序字段 [asc | desc]
limit起始索引, 数据条数;

相关文章:

SQL语句及其应用(中)(DQL语句之单表查询)

SQL语句的定义: 概述: 全称叫 Structured Query Language, 结构化查询语言, 主要是实现 用户(程序员) 和 数据库软件(例如: MySQL, Oracle)之间交互用的. 分类: DDL: 数据定义语言, 主要是操作 数据库, 数据表, 字段, 进行: 增删改查(CURD) 涉及到的关键字: create, drop, …...

如何下载主流网站的视频和音频?(支持100+网站视频下载)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、安装与升级1. 安装2. 升级到最新版3. 验证安装二、基础下载命令1. 下载视频/音频/图片2. 指定下载目录3. 自定义文件名4. 基本下载场景三、高级下载控制1. 查看视频信息(清晰度/格式)2. 选择特定清晰度下载3. 下载…...

算法题(111):k与迷宫

审题&#xff1a; 本题需要我们寻找迷宫中的所有出口&#xff0c;若有出口需要输出距离最近的出口的距离&#xff0c;若没有就输出-1 时间复杂度&#xff1a;由于边距为1&#xff0c;我们本题采用bfs算法&#xff0c;在最坏的情况下我们需要遍历所有位置&#xff0c;时间复杂度…...

WinForm真入门-简介

WinForm 简介 ‌WinForm‌&#xff08;Windows Forms&#xff09;是微软基于 ‌.NET Framework‌ 构建的桌面应用程序开发框架&#xff0c;专注于快速创建具有图形用户界面&#xff08;GUI&#xff09;的 Windows 客户端程序‌。其核心以 ‌窗体&#xff08;Form&#xff09;‌…...

Java 求两个 List 集合的交集和差集

目录 一、求两个 List 的交集(一)使用 Java 8 Stream API(二)运行结果(三)技术亮点(四)适用场景二、求两个 List 的差集(一)使用 Java 8 Stream API(二)运行结果(三)技术亮点(四)适用场景三、使用传统迭代方法(一)求交集(二)求差集(三)运行结果(四)技术…...

Redis-常用命令

目录 1、Redis数据结构 2、命令简介 2.1、通用命令 DEL EXISTS EXPIRE 2.2、String命令 SET和GET MSET和MGET INCR和INCRBY和DECY SETNX SETEX 2.3、Key的层级结构 2.4、Hash命令 HSET和HGET HMSET和HMGET HGETALL HKEYS和HVALS HINCRBY HSETNX 2.5、List命…...

树莓派5智能家居中控:HomeAssistant全配置指南

一、硬件选型与系统架构 1.1 树莓派5的硬件优势 2023年发布的树莓派5采用Broadcom BCM2712处理器&#xff08;4核Cortex-A76架构&#xff09;&#xff0c;相比前代产品具有三大突破性改进&#xff1a; 接口升级&#xff1a;首次支持PCIe 2.0接口&#xff0c;可扩展万兆网卡或…...

从虚拟现实到可持续设计:唐婉歆的多维创新之旅

随着线上线下融合逐渐成为全球家居与建材行业的发展趋势,全球市场对高品质、个性化家居和建材产品的需求稳步攀升,也对设计师提出更高的要求。在这一背景下,设计师唐婉歆将以产品设计师的身份,正式加入跨国企业AmCan 美加集团,投身于备受行业瞩目的系列设计项目。她将负责Showr…...

scala基础学习-类(1.定义类)

文章目录 类&#xff0c;对象定义类构造定义方法重写方法私有默认参数 类&#xff0c;对象 scala定义类的关键字是:class 使用类实例化对象使用关键字:new 定义类 class Point(var x: Int, var y: Int) {def move(dx: Int, dy: Int): Unit {x x dxy y dy}override def…...

音视频 四 看书的笔记 MediaPlayerService

Binder机制看这里 Binde机智 这是一个分割符 Binder机智 分割(goutou) Binder机制 MediaPlayerService多媒体框架中一个非常重要的服务。MediaPlayerService 我原称之为链接之王 图片来源 MediaPlayer 是客户端 C/S 中的CMediaPlayerService MediaPlayerService::Client 是服…...

vmware 创建win10 系统,虚拟机NAT网络设置

虚拟机设置&#xff1a; 物理机本机创建桥接&#xff1a; 如何创建桥接&#xff0c;请自行脑补~...

Python CSV 数据分析:问题排查与解决全记录

Python CSV 数据分析&#xff1a;问题排查与解决全记录 前段时间&#xff0c;我接到一个任务&#xff0c;需要对公司的销售数据进行分析。这些数据存储在 CSV 文件里&#xff0c;本想着用 Python 处理起来会很轻松&#xff0c;结果却状况百出。下面&#xff0c;就跟大家讲讲我…...

RabbitMQ高级特性--发送方确认

目录 1. confirm确认模式 1.配置RabbitMQ 2.设置确认回调逻辑并发送消息 2.Return退回模式 1.配置RabbitMQ 2.设置返回回调逻辑并发送消息 在使用RabbitMQ的时候, 可以通过消息持久化来解决因为服务器的异常崩溃而导致的消息丢失, 但是还有⼀个问题, 当消息的生产者将消息发送出…...

【初阶数据结构】线性表之双链表

文章目录 目录 一、双链表的概念 二、双链表的实现 1.初始化 2.尾插 3.头插 4.打印 5.判断双链表是否为空 6.尾删 7.头删 8.查找 9.在指定的位置之后插入数据 10.删除指定位置的数据 11.销毁 三、完整源码 总结 一、双链表的概念 链表的结构非常多样&#xff0…...

java网盘项目 目前 文件有分享表 文件夹也要创建分享表吗

java网盘项目 目前 文件有分享表 文件夹也要创建分享表吗 根据网盘系统的典型设计模式及搜索结果中的最佳实践&#xff0c;建议为文件夹创建独立的分享表。以下是具体分析及实施建议&#xff1a; 一、需要独立文件夹分享表的核心原因 权限控制差异 文件分享&#xff1a;通常基…...

智能路由系统-信息泄露漏洞挖掘

1.漏洞描述&#xff1a; Secnet-智能路由系统 actpt_5g.data 信息泄露&#xff0c;攻击者可利用此漏洞收集敏感信息&#xff0c;从而为下一步攻击做准备。 2.fofa搜索语句 title"安网-智能路由系统" || title"智能路由系统" || title"安网科技-智能…...

表格图表切换,图表无法展示问题复盘

项目背景 103项目CPC卡使用模块在原有的表格展示数据的基础之上&#xff0c;增加环状饼图图表展示&#xff0c;采用tab切换的方式实现 问题描述 图表无法设置宽高&#xff0c;导致饼图无法渲染 具体代码 // 入口页<el-tabs type"card" class"cts_flex_t…...

css 实现闪烁光标

要实现闪烁光标&#xff08;比如文本输入框内常见的闪烁效果&#xff09;&#xff0c;可以使用 CSS 动画。下面是一个简单的方法&#xff1a; 代码示例 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta n…...

AI赋能python数据处理、分析与预测操作流程

以数据集预测鱼类种类(Species)开展以下研究。数据格式如下: 以下是一个系统的分析思路及推荐的机器学习算法: 1. 数据预处理与探索性分析 缺失值与异常值处理: 检查数据完整性(如Roach类中Weight=0的记录需修正或删除)。 通过箱线图或Z-Score检测异常值,判断是否需…...

基于74LS192的十进制两位数正向计时器(proteus仿真)

在数字电路设计中&#xff0c;计时器是一个非常常见的应用。今天&#xff0c;我将分享一个基于 74LS192 双向计数器 的十进制两位数正向计时器电路设计。这个电路可以实现从 00 到 99 的十进制正向计数&#xff0c;并通过两个七段数码管显示结果。 最终效果如图&#xff1a; 各…...

#C8# UVM中的factory机制 #S8.5# 对factory机制的重载进一步思考(二)

今天我们反思,然后总结。 一 先看代码 `timescale 1ns/1ps module tb_top;class Base;function void print(int a);$display("Base: int = %0d", a);endfunction endclassclass Sub extends Base;function void print(string s);$display("Sub: string = %s&…...

算法-前缀和与差分

一、前缀和&#xff08;Prefix Sum&#xff09; 1. 核心思想 前缀和是一种预处理数组的方法&#xff0c;通过预先计算并存储数组的前缀和&#xff0c;使得后续的区间和查询可以在**O(1)**时间内完成。 2. 定义 给定数组 nums&#xff0c;前缀和数组 prefixSum 的每个元素 p…...

React(六)React过渡动画-CSS编写方式

React过渡动画 react-transition-group介绍 在开发中&#xff0c;我们想要给一个组件的显示和消失添加某种过渡动画&#xff0c;提高用户体验→可通过react-transition-group实现。React曾为开发者提供过动画插件 react-addons-css-transition-group&#xff0c;后由社区维护…...

第十五章:Python的Pandas库详解及常见用法

在数据分析领域&#xff0c;Python的Pandas库是一个不可或缺的工具。它提供了高效的数据结构和数据分析工具&#xff0c;使得数据处理变得简单而直观。本文将详细介绍Pandas库的基本功能、常见用法&#xff0c;并通过示例代码演示如何使用Pandas进行数据处理。最后&#xff0c;…...

Python自动化模块:开启高效编程新时代

一、写在前面 在数字化时代&#xff0c;自动化技术已成为提高效率、降低成本的关键手段。Python 作为一种简洁、高效且功能强大的编程语言&#xff0c;凭借其丰富的库和框架&#xff0c;在自动化领域占据了举足轻重的地位&#xff0c;成为众多开发者的首选工具之一。从简单的文…...

【蓝桥杯速成】| 15.完全背包

题目&#xff1a;携带研究材料 问题描述 52. 携带研究材料&#xff08;第七期模拟笔试&#xff09; 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会&#xff0c;以展示自己的最新研究成果。他需要带一些研究材料&#xff0c;但是他的行李箱空间有限。这些研…...

C++:allocator类(动态数组续)

1.为什么需要 allocator&#xff1f; 在 C 中&#xff0c;动态内存管理通常通过 new 和 delete 完成&#xff1a; int* p new int; // 分配内存 构造对象 delete p; // 析构对象 释放内存 但 new 和 delete 有两个问题&#xff1a; 耦合性&#xff1a;将内…...

libva基础

Libva&#xff08;Lib Video Acceleration&#xff09;是一个开源的库&#xff0c;实现了 **VA-API**&#xff08;Video Acceleration API&#xff09;&#xff0c;旨在为视频处理提供跨平台的硬件加速支持。 1、核心功能与作用 硬件加速抽象层&#xff1a;Libva 作为中间层&…...

【C++20】format格式化输出

C20 format格式化输出 在C20之前&#xff0c;格式化能力都依赖于三方格式化库FMT&#xff0c; 而C20 标准委员会终于在C标准库引入了格式化功能&#xff0c;从使用方式和风格来看其实就是FMT库转正了 直接使用 包含<format.h>头文件既可以直接使用&#xff0c;类似pyt…...

c++游戏开发第一期

以后我将要发c游戏开发的教程&#xff0c;可能更得比较慢。&#xff08;目测几个星期一更&#xff09;。 今天先讲个配置编译器。 我用的是Visual studio 2022和EasyX。 安装studio&#xff1a; 首先找到下载链接&#xff08;点我&#xff09;下拉找到下面图片的东西。 下完…...