MySQL(3)

news/2024/10/22 0:25:56/

聚合与进阶

  • 1. 聚合
    • 1.count——不统计null
    • 2. group by
    • 3. group_concat
  • 2. where vs having
  • 3. 聚合中的坑
  • 4. 常见函数及操作总结
    • 1. 明文存储
    • 2. MD5()——密文存储
    • 3. 关系分解
      • 1. 创建表格orders,并拆解为orders,products,users
      • 2. 表格之间创建连接
      • 3. inner join & outer join
      • 4. 查看每单产品的总销售额及销量
      • 5. 查看每个用户消费金额
      • 6. generate column
      • 7. 找出价格最便宜的产品对应的名字
      • 8. in,any,all

1. 聚合

1.count——不统计null

--5条记录
SELECT COUNT(*) AS product_count
FROMproducts;--4条记录(image_url有1条是null)
SELECT COUNT(image_url) 
FROMproducts;

2. group by

SELECT sales_status, COUNT(*)
FROMproducts
GROUP BY sales_status;

在这里插入图片描述

3. group_concat

SELECT GROUP_CONCAT(DISTINCT `name`), sales_status, COUNT(*)
FROMproducts
GROUP BY sales_status;

结果对比2
在这里插入图片描述
加入分隔符“>>>”

SELECT GROUP_CONCAT(DISTINCT `name`ORDER BY priceSEPARATOR '>>>'),sales_status,COUNT(*)
FROMproducts
GROUP BY sales_status;

在这里插入图片描述

2. where vs having

常见查询语句

Select Column1, Column2,
From Table1, Table2,
(Where) Condition1 and Condition2 or Condition3(Group By) Column name
(Having) Condition
(order by) Sorting
(limit)
  • having可以单独出现,一般和group by同时出现
  • 单独使用也可以运行,但性能较差,一般更常用where
    再看一个例子
CREATE TABLE IF NOT EXISTS  t2 (i INT,d1 DECIMAL(60 , 30 ),d2 DECIMAL(60 , 30 )
);INSERT INTO t2 VALUES
(2,0.00,0.00),(2,-13.20,0.00),
(2,59.60,46.40),(2,30.40,30.40);SELECT *
FROMt2;SELECT i, SUM(d1) AS a, SUM(d2) AS b
FROMt2
GROUP BY i;

结果如下
在这里插入图片描述

若加入having

SELECT i, SUM(d1) AS a, SUM(d2) AS b
FROMt2
GROUP BY i
HAVING a <> b;

则返回的是一个空的查询结果,因为a==b

若用where语句

SELECT i, SUM(d1) AS a, SUM(d2) AS b
FROMt2
WHEREa <> b
GROUP BY i
;

则会报错,因为t2表中没有a,b

3. 聚合中的坑

  • 在使用max(),min()这类函数时,想根据值得的大小输出相应的名称大小可能是不对的,名字和值可能对不上,例如
SELECT `name`, MAX(price)
FROMproducts;

在这里插入图片描述
我们知道,实际价格88元对应的商品名称应该为“夏日缤纷桶”

更加合适的写法应该是

SELECT ANY_VALUE(`name`), MAX(price)
FROMproducts;

即取出来的"name"为任意值

4. 常见函数及操作总结

-- 将字符串大写、小写
SELECT upper('hello');
SELECT lower('HesdDi');-- 从右边取2个
SELECT right('hello', 2);-- 从左边取2个
SELECT left('hello', 2);-- substring(字符串,第几个开始,取几个)
SELECT substring('important', 3, 5);-- 长度,包括空格
SELECT length('   ad f   ');-- 删除左边、右边空格
SELECT ltrim('   ad f   ');
SELECT rtrim('   ad f   ');

1. 明文存储

SELECT user_id
FROMusers
WHEREuser_name = 'youzi'AND passwd = 'you123';

2. MD5()——密文存储

杂凑函数,结果不可逆

  1. 加密
  2. 完整性校验
SELECT MD5('test');

在这里插入图片描述
网络安全,多个层次加密
设计一个文件数据库=>名称不一样,内容一样,可通过MD5

3. 关系分解

  • 为什么要用多张表单存储信息?
  1. 冗余
  2. 修改异常
  3. 删除异常

例子:创建orders表格,为orders表格添加列,将orders表格中的user_name作为users表格中的user_name,将orders表格中的product_name作为products表格中的product_name,将orders表格中的unit_price作为products表格中的price,整个过程中,我们需要关注3个表格:orders,products,users

1. 创建表格orders,并拆解为orders,products,users

use dal_learning;
CREATE TABLE orders (PRIMARY KEY (order_id),order_id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(100) DEFAULT NULL,order_no VARCHAR(100) DEFAULT NULL,user_name VARCHAR(100) NOT NULL,product_name VARCHAR(100) NOT NULL,order_status ENUM('CART', 'DRAFT', 'NEW', 'IN_PROCESS', 'COMPLETED', 'FAILED') DEFAULT 'CART',create_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间'
);  select * from orders;-- orders中添加列
alter table orders 
add column 
unite_price 
decimal(9,2) null default 0.0 
after product_name;alter table orders 
add column 
quantity 
int not null default 0 after unite_price;select * from orders;insert into orders
(order_no,user_name,product_name,unite_price,quantity)
values
('KFC123','jiao','香辣鸡腿堡人气套餐A',36,1),
('KFC321','jiao','海苔岩烧大鸡腿饭套餐A2',37,2),
('KFC234','jane','夏日缤纷桶',88,1),
('KFC567','peizi','超值全家桶',85,3),
('KFC890','feng','新奥尔良烤鸡腿堡人气套餐B',36,2),
('KFC890','xiaowan','超级塔可午餐套餐',29,1);--  UPDATE order_noselect * from orders;create table users(
primary key(user_id),
user_id int(11) not null auto_increment,
user_name  varchar(255) default null
) select distinct user_name from orders;select * from users;create table product_info as(select product_name from orders);
select * from product_info;create table products(
PRIMARY KEY (product_id),
product_id int(11) NOT NULL AUTO_INCREMENT,name varchar(100) DEFAULT NULL, -- detail text DEFAULT NULL,image_url varchar(255) DEFAULT NULL,sales_status enum('NEW','DEPRECATED') DEFAULT 'NEW',price  DECIMAL(9,2)  DEFAULT NULL,create_date datetime
) select distinct product_name,unite_price as price from orders;select * from products;
select * from users;
select * from orders;

2. 表格之间创建连接

alter table orders drop column product_name;
alter table orders drop column user_name;SET SQL_SAFE_UPDATES = 0; -- 1175报错,取消主键保护
update orders,users
set orders.user_id = users.user_id
where orders.user_name = users.user_name;update orders,products
set orders.product_id = products.product_id
where orders.product_name = products.product_name;alter table orders add column product_id int(11) not null after product_name;
alter table orders add column user_id int(11) not null after user_name;alter table orders 
add constraint FK_ORDER_USER FOREIGN KEY(user_id)
REFERENCES users(user_id)
on DELETE CASCADE;alter table orders 
add constraint FK_ORDER_PRODUCT FOREIGN KEY(product_id)
REFERENCES products(product_id)
on DELETE CASCADE;DELETE from `dal_learning`.`products`
WHERE (product_id = 5);
select * from orders;insert into products(product_name,price) values("老北京鸡肉卷",15);
select * from products; 

3. inner join & outer join

-- inner join
SELECT user_name, product_name, unite_price, quantity
FROMorders,users,products
WHEREorders.user_id = users.user_idAND orders.product_id = products.product_id;SELECT user_name, product_name, unite_price, quantity
FROMordersJOIN(users, products) ON (orders.user_id = users.user_idAND orders.product_id = products.product_id);-- left join
SELECT products.product_id, product_name, order_id
FROMproductsLEFT JOINorders ON products.product_id = orders.product_id;SELECT products.product_id, product_name, order_id
FROMordersRIGHT JOINproducts ON products.product_id = orders.product_id;-- left join union right join --> full join
-- 先插入一条数据,区分union all 和 union
insert into products(product_name,price) values("炸酱面",15);SELECT price
FROMproducts
WHEREprice > 50 
UNION SELECT price
FROMproducts
WHEREprice < 36;SELECT price
FROMproducts
WHEREprice > 50 
UNION ALL SELECT price
FROMproducts
WHEREprice < 36;-- 哪款产品没人买过?
SELECT products.product_id,product_name,order_id,orders.product_id
FROMproductsLEFT JOINorders ON products.product_id = orders.product_id
WHEREorders.order_id IS NULL;-- using 
SELECT *
FROMordersLEFT JOINproducts USING (product_id);

4. 查看每单产品的总销售额及销量

SELECT products.product_id,products.product_name,SUM(unite_price * quantity) AS sales_amount,COUNT(orders.order_id),SUM(quantity)
FROMproductsLEFT JOINorders ON products.product_id = orders.product_id
GROUP BY products.product_name , products.product_id; 

5. 查看每个用户消费金额

SELECT user_name, SUM(unite_price * quantity) AS sales_amount
FROMusersLEFT JOINorders ON users.user_id = orders.user_id
GROUP BY user_name;

6. generate column

alter table orders 
add column sales_amount decimal(9,2) as (unite_price * quantity) 
after quantity;select * from orders;

7. 找出价格最便宜的产品对应的名字

SELECT *
FROMproducts
WHEREprice = (SELECT MIN(price)FROMproducts);

8. in,any,all

  • in:定项内
  • any:与子查询返回的任何值比较为True时,返回True
  • some:any的别名,较少使用
  • all:与子查询返回的所有值比较为True时,返回True
  1. 找出下架的商品信息
update products            
set sales_status = "DEPRECATED"
where product_name = "老北京鸡肉卷";update products            
set sales_status = "DEPRECATED"
where product_name = "夏日缤纷桶";SELECT *
FROMproducts
WHEREsales_status IN (SELECT sales_statusFROMproductsWHEREsales_status = 'DEPRECATED');
  1. 输出价格比定价高的商品相关信息
SELECT products.product_id, products.product_name, products.price
FROMproducts
WHEREprice < ALL (SELECT unite_priceFROMorders,productsWHEREproducts.product_id = orders.product_id);

http://www.ppmy.cn/news/189304.html

相关文章

数据访问层DAL的再次重构_3(转载)

原文链接 接着数据访问层DAL的再次重构_2_模块的自定义设置节我们继续实现&#xff0c;到这里&#xff0c;开始后台编码&#xff0c;经历了建立数据库、建表、存储过程、web.config的自定义配置节点后&#xff0c;我们来实现数据访问层的编码。 首先&#xff1a;用OOP方式来映射…

2021IAAA北京理工大学面向任意目标检测的动态锚点学习(DAL)

面向任意目标检测的动态锚点学习 摘要&#xff1a;面向任意的目标广泛地出现在自然场景、航空照片、遥感图像等中&#xff0c;因此面向任意的目标检测得到了广泛的关注。目前许多旋转探测器使用大量不同方向的锚点来实现与地面真实框的空间对齐。然后应用交叉-并集(IoU)对正、…

asp.net mvc 简单项目框架的搭建过程(一)对Bll层和Dal层进行充分解耦

学习asp.net 已经有近三个月的时间了&#xff0c;在asp.net mvc上花的时间最多&#xff0c;但个人真是有些菜&#xff0c;不得不说&#xff0c;asp.net mvc的水真的还是蛮深的。目前在公司实习&#xff0c;也见过公司几个项目的代码了。对项目的代码始终停留在一知半解的地步&a…

携程开源数据库访问框架Ctrip DAL

声明&#xff1a;本文为CSDN原创投稿文章&#xff0c;未经许可&#xff0c;禁止任何形式的转载。 作者&#xff1a;赫杰辉&#xff0c;携程技术中心框架研发部。 责编&#xff1a;钱曙光&#xff0c;关注架构和算法领域&#xff0c;寻求报道或者投稿请发邮件qianshgcsdn.net&am…

数据访问层DAL的再次重构_3

接着数据访问层DAL的再次重构_2_模块的自定义设置节我们继续实现&#xff0c;到这里&#xff0c;开始后台编码&#xff0c;经历了建立数据库、建表、存储过程、web.config的自定义配置节点后&#xff0c;我们来实现数据访问层的编码。 首先&#xff1a;用OOP方式来映射后台的表…

用C#实现对MSSqlServer数据库的增删改查---DAL层

说明&#xff1a;本人完成的工作是对传感器--超声波物位计进行硬件集成&#xff0c;上位机通过串口接收传感器数据并将其存到数据库中&#xff1b;在DAL层实现对数据库的增删改查&#xff0c;其中包含两个数据表分别是WaterLevelSet表和WaterLevelRecord表&#xff0c;以下代码…

C#中三层架构UI、BLL、DAL、Model详解

三层架构分为&#xff1a;表现层&#xff08;UI&#xff09;、业务逻辑层&#xff08;BLL&#xff09;、数据访问层&#xff08;DAL&#xff09;再加上实体类库&#xff08;Model&#xff09; 转载请注明出自朱朱家园https://blog.csdn.net/zhgl7688 1、实体类库&#xff08;…

笔记(css3)-动画

目录 语法转换平移旋转缩放复合属性的顺序问题 过渡动画帧动画 案例案例1-热点图dot(缩放)案例2-热点图dot(缩放)案例3-开红包(旋转) 问题问题1-transform不起作用问题2 - 过渡动画不起效果 语法 转换 css3中的转换允许我们对元素进行旋转、缩放、移动或倾斜。它分为2D转换 或…