MySQL数据库-DQL(单表查询)

单表查询

数据准备

查询语法

查询全部

条件查询 (where)

查询条件分类

条件查询的语法

聚合函数查询

聚合函数介绍

聚合函数分类

聚合函数语法

案例学习 

排序查询 (order by)

注意

排序语法

案例学习 

分组查询 (group by)

语法

分页查询 (limit)

语法


数据准备

-- 创建db1数据库
CREATE DATABASE db1;

-- 使用db1数据库
USE db1;

-- 创建数据表
CREATE TABLE product(
	id INT,				-- 商品编号
	NAME VARCHAR(20),	-- 商品名称
	price DOUBLE,		-- 商品价格
	brand VARCHAR(10),	-- 商品品牌
	stock INT,			-- 商品库存
	insert_time DATE    -- 添加时间
);

-- 添加数据
INSERT INTO product VALUES (1,'华为手机',3999,'华为',23,'2088-03-10'),
(2,'小米手机',2999,'小米',30,'2088-05-15'),
(3,'苹果手机',5999,'苹果',18,'2088-08-20'),
(4,'华为电脑',6999,'华为',14,'2088-06-16'),
(5,'小米电脑',4999,'小米',26,'2088-07-08'),
(6,'苹果电脑',8999,'苹果',15,'2088-10-25'),
(7,'联想电脑',7999,'联想',NULL,'2088-11-11');

创建了一个db1的数据库,其中含有product表如下所示: 

查询语法

select
    字段列表
from
    表名列表
where
    条件列表
group by
    分组字段
having
    分组之的条件 (分组之后不能使用where,只能使用having
order by
    排序
limit
    分页限定

查询全部

(1)查询全部表的数据

SELECT * FROM 表名;

SELECT * FROM product;

(2)查询指定字段的表数据

SELECT  列名1,列名2... FROM 表名;

例如:查询name,price,brand这三列的数据

SELECT name,price,brand FROM product;

(3)去除重复查询

SELECT DISTINCT 列名,列名... FROM 表名;

例如:查询品牌,去除重复

SELECT DISTINCT brand FROM product;

(4)计算列的值(四则运算)

SELECT 列名1[ 运算符 ], 列名2[ 运算符 ] FROM 表名;

例如:价格都上涨1000,库存增加10部。

SELECT price+1000, stock+10 FROM product;

观察上面的数据,显然最右下角的数据有问题!是NULL!

需要处理

SELECT price+1000,IFNULL(stock,0)+10 FROM product;

 

(5)起别名查询

上述的案例,这样子查询出来的结果明显不美观,而且有问题,所以这里可以在显示出来的时候给它取一个别名。

SELECT 列名1 AS 别名1, 列名2 AS 别名2 FROM 表名;

SELECT price+1000 AS price_new,IFNULL(stock,0)+10 AS stock_new FROM product;

条件查询 (where)

查询条件分类

符号功能
>大于
<小于
>=大于等于
<=小于等于
=等于
<> 或 !=不等于
BETWEEN ... AND ...在某个范围之内(都包含)
IN(...)多选一
LIKE 占位符模糊查询 _单个任意字符 %多个任意字符
IS NULL是NULL
IS NOT NULL不是NULL
AND 或 &&并且
OR 或 ||或者
NOT 或 !非,不是

条件查询的语法

SELECT 列名列表 FROM 表名 WHERE 条件;

如下述案例: 

(1)查询库存大于20的商品信息

SELECT * FROM product WHERE stock > 20;

(2)查询品牌为华为的商品信息 

SELECT * FROM product WHERE brand='华为';

 (3)查询金额在4000 ~ 6000之间的商品信息

SELECT * FROM product WHERE price >= 4000 AND price <= 6000;
SELECT * FROM product WHERE price BETWEEN 4000 AND 6000;

between..and 也是可以实现的!(数值在...与...之间)

(4)查询库存为14、30、23的商品信息 

SELECT * FROM product WHERE stock=14 OR stock=30 OR stock=23;
SELECT * FROM product WHERE stock IN(14,30,23);

IN(...) 也可以实现

(5)查询库存为null的商品信息

SELECT * FROM product WHERE stock IS NULL;

(6)查询库存不为null的商品信息

SELECT * FROM product WHERE stock IS NOT NULL;

(7)查询名称以小米为开头的商品信息

SELECT * FROM product WHERE NAME LIKE '小米%';

(8)查询名称第二个字的商品信息

SELECT * FROM product WHERE NAME LIKE '_为%';

(9)查询名称为四个字符的商品信息

SELECT * FROM product WHERE NAME LIKE '____';

注:上述代码是有四个“_” ,表示有四个字符。

(10)查询名称中包含电脑的商品信息

SELECT * FROM product WHERE NAME LIKE '%电脑%';

聚合函数查询

聚合函数介绍

将一列数据作为一个整体,进行纵向的计算

聚合函数分类

函数名功能
count(列名)统计数量(一般选用不为null的列)
max(列名)最大值
min(列名)最小值
sum(列名)求和
avg(列名)平均值

聚合函数语法

SELECT 函数名(列名) FROM 表名 [WHERE 条件];

案例学习 

(1)计算product表中总记录条数

SELECT COUNT(*) FROM product;

(2)获取最高价格

SELECT MAX(price) FROM product;

 

(3)获取最高价格的商品名称 (有难度)

SELECT NAME,price FROM product 
		WHERE price = (
			SELECT MAX(price) 
			FROM product
			);

(4)获取最低库存

SELECT MIN(stock) FROM product;

(5)获取最低库存的商品名称 (有难度)

SELECT NAME,stock FROM product 
		WHERE stock = (
			SELECT MIN(stock) 
			FROM product
			);

(6)获取总库存数量

SELECT SUM(stock) FROM product;

(7)获取品牌为苹果的总库存数量

SELECT SUM(stock) FROM product WHERE brand='苹果';

(8)获取品牌为小米的平均商品价格

SELECT AVG(price) FROM product WHERE brand='小米';

排序查询 (order by)

注意

多个排序条件,当前边的条件值一样时,才会判断第二条件

关键词功能
ORDER BY 列名1 排序方式1,列名2 排序方式2对指定列排序,ASC升序(默认的) DESC降序

排序语法

注意:不一定要使用 where 

SELECT 列名 FROM 表名 [WHERE 条件] ORDER BY 列名1 排序方式1,列名2 排序方式2...;

案例学习 

(1)按照库存升序排序

SELECT * FROM product ORDER BY stock ASC;

(2)查询名称中包含手机的商品信息。按照金额降序排序

SELECT * FROM product WHERE NAME LIKE '%手机%' ORDER BY price DESC;

(3)按照金额升序排序,如果金额相同,按照库存降序排列

SELECT * FROM product ORDER BY price ASC,stock DESC;

-- 注意没有 where 之前写的时候一不小心用了

分组查询 (group by)

数据进行分组 ,数据-group by - 后面的东西。

不论是分组,还是排序,有条件一定要先过滤,虽然最后的结果是一样的,但是效率不同!

语法

SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式];

(1)按照品牌分组,获取每组商品的总金额

SELECT brand,SUM(price) FROM product GROUP BY brand;

(2)对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额

SELECT brand,SUM(price) FROM product WHERE price > 4000 GROUP BY brand;

与上述的案例类似,加了一个where price > 4000 的条件。

(3)对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的

SELECT brand,SUM(price) AS getSum FROM product 
		WHERE price > 4000 
		GROUP BY brand 
		HAVING getSum > 7000;

 

注意:

这里分组完之后,还需要条件过滤,(只显示金额大于7000的)就不能使用 WHERE 了!只能使用HAVING!

(4)对金额大于4000元的商品,按照品牌分组,获取每组商品的总金额,只显示总金额大于7000元的、并按照总金额的升序排列

SELECT brand,SUM(price) AS getSum FROM product 
		WHERE price > 4000 
		GROUP BY brand 
		HAVING getSum > 7000 
		ORDER BY getSum ASC; 

分页查询 (limit)

语法

-- 标准语法
SELECT 列名 FROM 表名

        [WHERE 条件]

        [GROUP BY 分组列名]

        [HAVING 分组后条件过滤]

        [ORDER BY 排序列名 排序方式]

        LIMIT 开始索引,查询条数;

公式:开始索引 = (当前页码-1) * 每页显示的条数

(1)每页显示3条数据

SELECT * FROM product LIMIT 0,3;  -- 第一页 开始索引=(1-1) * 3
SELECT * FROM product LIMIT 3,3;  -- 第二页 开始索引=(2-1) * 3
SELECT * FROM product LIMIT 6,3;  -- 第三页 开始索引=(3-1) * 3

 

posted @ 2022-02-15 00:56  金鳞踏雨  阅读(39)  评论(0)    收藏  举报  来源