千万级mysql数据查询_Mysql千万级数据查询总结

CREATE TABLE `mall_goods` (

`goods_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '商品ID',

`cat_id` INT(11) NOT NULL DEFAULT '0' COMMENT '分类id',

`price` TINYINT(3) NOT NULL DEFAULT '0' COMMENT '商品价格',

`state` TINYINT(3) DEFAULT '1' COMMENT '状态(1:有效,0:无效)',

PRIMARY KEY (`goods_id`),

KEY `icatid` (`cat_id`)

) ENGINE=INNODB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8

CREATE TABLE `mall_category` (

`cat_id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '分类id',

`cat_name` VARCHAR(50) DEFAULT NULL COMMENT '名称',

PRIMARY KEY (`cat_id`)

) ENGINE=INNODB AUTO_INCREMENT=107 DEFAULT CHARSET=utf8

查询的五种子句

where(条件查询)、having(筛选)、group by(分组)、order by(排序)、limit(限制结果)

1. where

比较运算符

> , < ,= , != (< >),>= , <=

in(v1,v2..vn)

between v1 and v2 在v1至v2之间(包含v1,v2)

IS NULL: 当列的值是 NULL,此运算符返回 true。

IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。

<=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。

逻辑运算符

not ( ! ) 逻辑非

or ( || ) 逻辑或

and ( && ) 逻辑与

模糊查询

2. group by需与统计函数(聚合函数)一起使用才有

#每类最大价格

SELECT a.goods_id, a.cat_id, MAX(a.price) AS price, a.state FROM mall_goods AS a GROUP BY a.cat_id

#每类最小价格

SELECT a.goods_id, a.cat_id, MIN(a.price) AS price, a.state FROM mall_goods AS a GROUP BY a.cat_id

#每类分组总价格

SELECT a.goods_id, a.cat_id, SUM(a.price) AS price, a.state FROM mall_goods AS a GROUP BY a.cat_id

#每类平均价格

SELECT a.goods_id, a.cat_id, AVG(a.price) AS price, a.state FROM mall_goods AS a GROUP BY a.cat_id

#每类有几个价格值

SELECT a.goods_id, a.cat_id, COUNT(a.price) AS price, a.state FROM mall_goods AS a GROUP BY a.cat_id

3. having与where类似,可以筛选数据,where后的表达式怎么写,having后就怎么写where针对表中的列发挥作用,查询数据having对查询结果中的列发挥作用,筛选据,having在group by后面,having可以用聚合函数。

#查询价格大于95的价格

SELECT a.goods_id,a.cat_id,a.price,a.state FROM mall_goods AS a HAVING a.price>95

还在研究待续。。。

4. order by默认升序排列,desc 降序排列,asc升序排列,与默认一样。

5. limit x,n

mysql子查询

1. where型子查询

#不用order by 来查询最新商品

SELECT a.goods_id,a.cat_id,a.price,a.state FROM mall_goods AS a WHERE a.goods_id = (SELECT MAX(goods_id) FROM mall_goods);

#不用order by 来查询分类下的最新商品

select a.goods_id,a.cat_id,a.price,a.state FROM mall_goods AS a where a.goods_id in (select max(goods_id) from mall_goods group by cat_id);

2. from型子查询(把内层的查询结果供外层再次查询)

#查询分类下价格最高的两个商品。

#方式1

SELECT a.goods_id,a.cat_id,a.price,a.state FROM mall_goods AS a

WHERE (SELECT COUNT(b.goods_id) FROM mall_goods AS b WHERE b.cat_id = a.cat_id AND b.price > a.price ) <2

ORDER BY a.cat_id,a.price DESC;

#方式2

SELECT a.goods_id,a.cat_id,a.price,a.state FROM mall_goods AS a

LEFT JOIN mall_goods AS b

ON a.cat_id = b.cat_id AND a.price < b.price

GROUP BY a.goods_id,a.cat_id,a.price

HAVING COUNT(b.goods_id) < 2

ORDER BY a.cat_id,a.price DESC;

3. exists型子查询(把外层查询结果拿到内层,看内层的查询是否成立)

#查询哪些栏目下有商品

SELECT cat_id,cat_name FROM mall_category AS b WHERE EXISTS(SELECT a.goods_id,a.cat_id,a.price,a.state FROM mall_goods AS a WHERE a.cat_id = b.cat_id);

union的用法

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

注意【UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同】。

默认地,UNION 操作符选取不同的值。如果允许重复的值,请使用 UNION ALL。

左连接,右连接,内连接

1、左连接

以左表为准,去右表找数据,如果没有匹配的数据,则以null补空位,所以输出结果数>=左表原数据数

2、右连接

a left join b 等价于 b right join a

3、内连接

查询结果是左右连接的交集,【即左右连接的结果去除null项后的并集(去除了重复项)】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值