##现需要查询 Tom 这个客户在 2023 年每月的消费金额(按月份正序显示),示例如下:
sql
drop table if exists `trade` ;
CREATE TABLE `trade` (
`t_id` int(11) NOT NULL,
`t_time` TIMESTAMP NOT NULL,
`t_cus` int(16) NOT NULL,
`t_type` int(2) NOT NULL,
`t_amount` double NOT NULL,
PRIMARY KEY (`t_id`));
INSERT INTO trade VALUES(1,'2022-01-19 03:14:08',101,1,45);
INSERT INTO trade VALUES(2,'2023-02-15 11:22:11',101,1,23.6);
INSERT INTO trade VALUES(3,'2023-03-19 05:33:22',102,0,350);
INSERT INTO trade VALUES(4,'2023-03-21 06:44:09',103,1,16.9);
INSERT INTO trade VALUES(5,'2023-02-21 08:44:09',101,1,26.9);
INSERT INTO trade VALUES(6,'2023-07-07 07:11:45',101,1,1200);
INSERT INTO trade VALUES(7,'2023-07-19 06:04:32',102,1,132.5);
INSERT INTO trade VALUES(8,'2023-09-19 11:23:11',101,1,130.6);
INSERT INTO trade VALUES(9,'2023-10-19 04:32:30',103,1,110);
drop table if exists `customer` ;
CREATE TABLE `customer` (
`c_id` int(11) NOT NULL,
`c_name` varchar(20) NOT NULL,
PRIMARY KEY (`c_id`));
INSERT INTO customer VALUES(101,'Tom');
INSERT INTO customer VALUES(102,'Ross');
INSERT INTO customer VALUES(103,'Juile');
INSERT INTO customer VALUES(104,'Niki');
-------------------------------------------------------------------
select date_format(t_time,'%Y-%m'),sum(t_amount) from trade t where
t_cus=101 and year(t_time)=2023 and t_type=1
GROUP BY date_format(t_time,'%Y-%m')
请查询该酒店从6月12日开始连续入住多晚的客户信息?
sql
-- 请查询该酒店从6月12日开始连续入住多晚的客户信息?
-- 要求输出:客户id、房间号、房间类型、连续入住天数(按照入住天数升序排序)
-- 条件 连续入住 即为 入住天数大于1 按照入住天数 升序排序
drop table if exists `guestroom_tb` ;
CREATE TABLE `guestroom_tb` (
`room_id` int(11) NOT NULL,
`room_type` varchar(16) NOT NULL,
`room_price` int(11) NOT NULL,
PRIMARY KEY (`room_id`));
INSERT INTO guestroom_tb VALUES(1001,'商务标准房',165);
INSERT INTO guestroom_tb VALUES(1002,'家庭套房',376);
INSERT INTO guestroom_tb VALUES(1003,'商务单人房',100);
INSERT INTO guestroom_tb VALUES(1004,'商务单人房',100);
INSERT INTO guestroom_tb VALUES(1005,'商务标准房',165);
INSERT INTO guestroom_tb VALUES(1006,'商务单人房',100);
INSERT INTO guestroom_tb VALUES(1007,'商务标准房',165);
INSERT INTO guestroom_tb VALUES(1008,'家庭套房',365);
INSERT INTO guestroom_tb VALUES(1009,'商务标准房',165);
drop table if exists `checkin_tb` ;
CREATE TABLE `checkin_tb` (
`info_id` int(11) NOT NULL,
`room_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`` datetime NOT NULL,
`checkout_time` datetime NOT NULL,
PRIMARY KEY (`info_id`));
INSERT INTO checkin_tb VALUES(1,1001,201,'2022-06-12 15:00:00','2022-06-13 09:00:00');
INSERT INTO checkin_tb VALUES(2,1001,202,'2022-06-12 15:00:00','2022-06-13 09:00:00');
INSERT INTO checkin_tb VALUES(3,1003,203,'2022-06-12 14:00:00','2022-06-14 08:00:00');
INSERT INTO checkin_tb VALUES(4,1004,204,'2022-06-12 15:00:00','2022-06-13 11:00:00');
INSERT INTO checkin_tb VALUES(5,1007,205,'2022-06-12 16:00:00','2022-06-15 12:00:00');
INSERT INTO checkin_tb VALUES(6,1008,206,'2022-06-12 19:00:00','2022-06-13 12:00:00');
INSERT INTO checkin_tb VALUES(7,1008,207,'2022-06-12 19:00:00','2022-06-13 12:00:00');
INSERT INTO checkin_tb VALUES(8,1009,208,'2022-06-12 20:00:00','2022-06-16 09:00:00');
INSERT INTO checkin_tb VALUES(9,1009,208,'2022-08-12 20:00:00','2022-08-16 09:00:00');
---------------------------------------------------------
select
*
from
(
SELECT
user_id,
tb.room_id,
t.room_type,
DATEDIFF(tb.checkout_time, tb.checkin_time) days
from
checkin_tb tb
left join guestroom_tb t on tb.room_id = t.room_id
where
tb.checkin_time >= '2022-06-12 00:00:00'
order by
days asc, tb.room_id asc, tb.user_id desc
) tq
where
tq.days > 1
sql 行专列
sql
CREATE TABLE public.t_score (
id int4 NOT NULL,
stu_name varchar(255),
subject varchar(255) ,
score numeric(20,2),
CONSTRAINT t_score_pkey PRIMARY KEY (id)
)
;
select
t.stu_name ,
sum( case when t.subject='chinese' then t.score else 0 end) as chinese,
sum( case when t.subject='math' then t.score else 0 end) as math
from t_score t GROUP BY t.stu_name
mysql 数据导出为 csv
sql
-- my.cnf or my.ini 设置如下
-- secure-file-priv="D:/tmp"
SELECT id
FROM idms_user
WHERE id>100001
LIMIT 1000
INTO OUTFILE 'd:/tmp/datatest.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY ''
LINES TERMINATED BY '\n';
统计用户 每天的登录次数
sql
select
t.id '用户id',
t.name '用户名称',
q.login_time '日期',
q.login_size '登录次数'
from
sys_tuser t
inner join (
select
t2.userid,
date_format(t2.login_time, '%Y-%m-%d') login_time ,
count(1) login_size
from
sys_login_log t2
group by
t2.userid ,
date_format(t2.login_time, '%Y-%m-%d') ) q on
t.id = q.userid;
postgres 修改字符集
## 修改字符集Wie中文
update pg_database set (encoding, datctype, datcollate)=(6, 'zh_CN.UTF-8','zh_CN.UTF-8') where datname = 'test1';
## 创建模板库
CREATE DATABASE test3 WITH TEMPLATE test1 OWNER postgres;
## 查询数据库 字符集编码信息
select datname,datcollate,datctype from pg_database where datname = 'test';
查询客户名称 订单号 订单总金额
CREATE TABLE cust
( cust_id
varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, cust_name
varchar(255) COLLATE utf8mb4_bin DEFAULT NULL ) ; CREATE TABLE orders
( order_id
varchar(255) COLLATE utf8mb4_bin NOT NULL, cust_id
varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, PRIMARY KEY (order_id
) ); CREATE TABLE order_items
( id
int(11) NOT NULL, order_id
int(11) DEFAULT NULL, price
decimal(10,2) DEFAULT NULL, totalCount
int(11) DEFAULT NULL, PRIMARY KEY (id
) ) ;
sql
SELECT c.cust_name,o.order_id ,sum(t.price*t.totalCount ) totalAmount from cust c INNER JOIN orders o
SELECT c.cust_name,o.order_id ,sum(t.price*t.totalCount ) totalAmount from cust c INNER JOIN orders o
on c.cust_id=o.cust_id
left join order_items t
on o.order_id=t.order_id
group by c.cust_name,o.order_id;
统计每个部门加班时长最长的人的信息
sql
CREATE TABLE overtime_table (
employee_name VARCHAR(50) NOT NULL,
department VARCHAR(50) NOT NULL,
hours INT NOT NULL,
PRIMARY KEY (employee_name , department)
);
INSERT INTO `overtime_table` (`employee_name`, `department`, `hours`) VALUES ('周网', '质检部', 12);
INSERT INTO `overtime_table` (`employee_name`, `department`, `hours`) VALUES ('孙倩', '研发部', 23);
INSERT INTO `overtime_table` (`employee_name`, `department`, `hours`) VALUES ('孙晔', '行政部', 4);
INSERT INTO `overtime_table` (`employee_name`, `department`, `hours`) VALUES ('张三', '研发部', 10);
INSERT INTO `overtime_table` (`employee_name`, `department`, `hours`) VALUES ('李四', '销售部', 20);
INSERT INTO `overtime_table` (`employee_name`, `department`, `hours`) VALUES ('王五', '销售部', 13);
INSERT INTO `overtime_table` (`employee_name`, `department`, `hours`) VALUES ('王行', '行政部', 4);
INSERT INTO `overtime_table` (`employee_name`, `department`, `hours`) VALUES ('赵六', '后勤部', 5);
sql
-- 方式1 通过join 的方式
select employee_name,department,hours from overtime_table t INNER JOIN
(
select department dpt,max(hours) max_hour from overtime_table
group by department
) t2
on t.department = t2.dpt
where t.hours = t2.max_hour;
-- 方式2 子查询
SELECT
department,
employee_name,
hours
FROM
overtime_table AS ot1
WHERE
hours = (
SELECT
MAX(hours)
FROM
overtime_table AS ot2
WHERE
ot2.department = ot1.department
);
-- 窗口函数 mysql 8 pg
WITH RankedOvertime AS (
SELECT
employee_name,
department,
hours,
RANK() OVER (PARTITION BY department ORDER BY hours DESC) AS rank
FROM
overtime_table
)
SELECT
department,
employee_name,
hours
FROM
RankedOvertime
WHERE
rank = 1;
-- with
with t as (
select department,max(hours) hours from overtime_table GROUP BY department
)
select q.* from overtime_table q inner join t
on q.department = t.department
and q.hours =t.hours
-- 这个方案 要求 每个人的加班时间都不相同
select * from (
SELECT t.*, row_number() over (PARTITION by department order by hours desc) rn FROM `overtime_table` t
)
q
where q.rn=1;
统计 三个工作日内到期的数据 不包含当天的,也就是说从明天开始计算3天
sql
CREATE TABLE `tx_holidays` (
`id` int(11) NOT NULL,
`date` date DEFAULT NULL,
`flag` int(11) DEFAULT NULL comment "1 节假日 0 工作日",
PRIMARY KEY (`id`)
)
CREATE TABLE `tx_draft` (
`id` int(11) NOT NULL,
`code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
`amount` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
`due_date` date DEFAULT NULL COMMENT '到期日' ,
PRIMARY KEY (`id`) USING BTREE
)
sql
SELECT
*
FROM
tx_draft t2
WHERE
t2.due_date > CURRENT_DATE ( )
AND t2.due_date <= ( -- 查询 从当前日期的后一天开始 计算 第三天的日期
SELECT date FROM tx_holidays t WHERE t.flag = 0 AND t.date > CURRENT_DATE ( ) -- 只要 下面的2数之和 为3 则是三个工作日
ORDER BY
t.date
LIMIT 2,
1
)
统计 多个机器节点上的 每个进程的 运行时间
数据准备
sql
create table Activity(
machine_id int COMMENT '机器id',
process_id int COMMENT '进程id',,
activity_type varchar(10) COMMENT 'start开始时间 end 结束时间',,
ts bigint COMMENT '时间',
);
INSERT INTO `activity` VALUES (0, 0, 'start', 0.712);
INSERT INTO `activity` VALUES (0, 0, 'end', 1.52);
INSERT INTO `activity` VALUES (0, 1, 'start', 3.14);
INSERT INTO `activity` VALUES (0, 1, 'end', 4.12);
INSERT INTO `activity` VALUES (1, 0, 'start', 0.55);
INSERT INTO `activity` VALUES (1, 0, 'end', 1.55);
INSERT INTO `activity` VALUES (1, 1, 'start', 0.43);
INSERT INTO `activity` VALUES (1, 1, 'end', 1.42);
INSERT INTO `activity` VALUES (2, 0, 'start', 4.1);
INSERT INTO `activity` VALUES (2, 0, 'end', 4.512);
INSERT INTO `activity` VALUES (2, 1, 'start', 2.5);
INSERT INTO `activity` VALUES (2, 1, 'end', 5);
统计 每个节点的每个进程话费时间
sql
select machine_id ,process_id ,
sum(IF(activity_type='start',-ts,ts))
from Activity group by machine_id ,process_id
统计 每个节点的每个进程话费时间
sql
select q.machine_id,sum(running_ms) from
(
select machine_id ,process_id ,
sum(IF(activity_type='start',-ts,ts)) running_ms
from Activity group by machine_id ,process_id
) q
GROUP BY machine_id
统计 所有节点的平均运行时间
sql
select q.machine_id,ROUND(sum(running_ms)/count(process_id),3) process_time from
(
select machine_id ,process_id ,
sum(IF(activity_type='start',-ts,ts)) running_ms
from Activity group by machine_id ,process_id
) q
GROUP BY machine_id
查询账户余额
sql
DROP table if exists tb_account;
DROP table if exists tb_sub_account;
CREATE table tb_account(
id int PRIMARY key,
account_no varchar(100) COMMENT '账户号',
acccount_type int COMMENT '账户类型 1 活期账户 2 保证金账户 3 贷款账户 4 定期账户',
client_id int COMMENT '客户id'
);
create table tb_sub_account(
id int PRIMARY key,
account_id int COMMENT '账户主表id',
pay_type int COMMENT '1 进账 2 支出',
amount DECIMAL(22,2) COMMENT '金额'
);
INSERT INTO `niuke`.`tb_account` (`id`, `account_no`, `acccount_type`, `client_id`) VALUES (1, '1-001', 1, 1);
INSERT INTO `niuke`.`tb_account` (`id`, `account_no`, `acccount_type`, `client_id`) VALUES (2, '1-002', 2, 1);
INSERT INTO `niuke`.`tb_account` (`id`, `account_no`, `acccount_type`, `client_id`) VALUES (3, '1-003', 1, 2);
INSERT INTO `niuke`.`tb_account` (`id`, `account_no`, `acccount_type`, `client_id`) VALUES (4, '1-004', 1, 3);
INSERT INTO `niuke`.`tb_sub_account` (`id`, `account_id`, `pay_type`, `amount`) VALUES (1, 1, 2, 1000.00);
INSERT INTO `niuke`.`tb_sub_account` (`id`, `account_id`, `pay_type`, `amount`) VALUES (2, 1, 1, 10000.00);
INSERT INTO `niuke`.`tb_sub_account` (`id`, `account_id`, `pay_type`, `amount`) VALUES (3, 1, 2, 2300.00);
INSERT INTO `niuke`.`tb_sub_account` (`id`, `account_id`, `pay_type`, `amount`) VALUES (4, 1, 1, 4560.00);
INSERT INTO `niuke`.`tb_sub_account` (`id`, `account_id`, `pay_type`, `amount`) VALUES (5, 2, 1, 10000.01);
INSERT INTO `niuke`.`tb_sub_account` (`id`, `account_id`, `pay_type`, `amount`) VALUES (6, 2, 2, 200.00);
sql
-- 查询 客户1 的 活期账户 保证金账户 贷款账户 定期账户 的余额
select account_id,
SUM(IF(t.pay_type=1,t.amount,0)) - SUM(IF(t.pay_type=2,t.amount,0)) as balance
from tb_sub_account t where t.account_id in(
select id from tb_account where client_id=1
)
GROUP BY account_id
-- 完整 sql
select acc.client_id,
case when acc.acccount_type=1 then '活期账户'
when acc.acccount_type=2 then '保证金账户'
when acc.acccount_type=3 then '贷款账户'
when acc.acccount_type=4 then '定期账户' else '' end as '账户类型' ,
acc.account_no ,sub.balance from tb_account acc
INNER JOIN (
select account_id,
SUM(IF(t.pay_type=1,t.amount,0)) - SUM(IF(t.pay_type=2,t.amount,0)) as balance
from tb_sub_account t where t.account_id in(
select id from tb_account where client_id=1
)
GROUP BY account_id
) sub
on acc.id=sub.account_id
-- -- 查询 客户1 的活期账户的 收 支 情况
select account_id,
sum(case when t.pay_type=1 then t.amount else 0 end ) as '收',
sum(case when t.pay_type=2 then t.amount else 0 end ) as '支',
(sum(case when t.pay_type=1 then t.amount else 0 end ) - sum(case when t.pay_type=2 then t.amount else 0 end )) as '余额'
from tb_sub_account t where account_id=1
GROUP BY account_id
-- 查询 客户1 的活期账户的情况 收 支
select t.account_no , q.* from tb_account t
inner join (
select account_id,
sum(case when t.pay_type=1 then t.amount else 0 end ) as '收',
sum(case when t.pay_type=2 then t.amount else 0 end ) as '支',
(sum(case when t.pay_type=1 then t.amount else 0 end ) - sum(case when t.pay_type=2 then t.amount else 0 end )) as '余额'
from tb_sub_account t where account_id= (select id from tb_account where client_id=1 and acccount_type=1)
GROUP BY account_id
) q
on t.id = q.account_id
统计 独立uv
sql
CREATE TABLE `visit_log` (
`id` int(11) NOT NULL,
`userid` int(11) DEFAULT NULL,
`url` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
`visit_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
INSERT INTO `niuke`.`visit_log` (`id`, `userid`, `url`, `visit_time`) VALUES (1, 1, 'https://wx.zsxq.com/group/48418884588288', '2025-04-29 10:59:51');
INSERT INTO `niuke`.`visit_log` (`id`, `userid`, `url`, `visit_time`) VALUES (2, 2, 'https://www.bilibili.com/', '2025-04-29 11:00:07');
INSERT INTO `niuke`.`visit_log` (`id`, `userid`, `url`, `visit_time`) VALUES (3, 1, 'https://www.bilibili.com/', '2025-04-29 09:00:13');
INSERT INTO `niuke`.`visit_log` (`id`, `userid`, `url`, `visit_time`) VALUES (4, 1, 'https://www.bilibili.com/', '2025-04-29 08:00:22');
INSERT INTO `niuke`.`visit_log` (`id`, `userid`, `url`, `visit_time`) VALUES (5, 12, 'https://www.douyin.com/', '2025-04-29 07:12:32');
INSERT INTO `niuke`.`visit_log` (`id`, `userid`, `url`, `visit_time`) VALUES (6, 2, 'https://inftab.com/amazon/', '2025-04-29 09:08:42');
INSERT INTO `niuke`.`visit_log` (`id`, `userid`, `url`, `visit_time`) VALUES (7, 1, 'https://inftab.com/amazon/', '2025-04-29 10:29:52');
INSERT INTO `niuke`.`visit_log` (`id`, `userid`, `url`, `visit_time`) VALUES (8, 3, 'https://s.click.taobao.com/1ilLlvt?pid=mm_50570328_39070332_145428725&__bucket__=1_3&union_biz_trans=%7B%22shunt%22%3A%224406_12_1_3%22%7D', '2025-04-29 08:14:02');
INSERT INTO `niuke`.`visit_log` (`id`, `userid`, `url`, `visit_time`) VALUES (9, 1, 'https://s.click.taobao.com/1ilLlvt?pid=mm_50570328_39070332_145428725&__bucket__=1_3&union_biz_trans=%7B%22shunt%22%3A%224406_12_1_3%22%7D', '2025-04-29 11:01:15');
INSERT INTO `niuke`.`visit_log` (`id`, `userid`, `url`, `visit_time`) VALUES (10, 1, 'https://www.dangdang.com/?from=P-319540-infinity&_ddclickunion=P-319540-infinity|ad_type=0|sys_id=1#dd_refer=', '2025-04-29 09:56:25');
INSERT INTO `niuke`.`visit_log` (`id`, `userid`, `url`, `visit_time`) VALUES (11, 12, 'https://www.bilibili.com/', '2025-04-28 11:11:30');
INSERT INTO `niuke`.`visit_log` (`id`, `userid`, `url`, `visit_time`) VALUES (12, 3, 'https://inftab.com/amazon/', '2025-04-29 11:19:02');
-- 统计 每个url 的 当日访客数
select url ,count(distinct userid) totalSize from visit_log WHERE DATE_FORMAT(visit_time,'%Y-%m-%d')='2025-04-28' GROUP BY url
-- 按日统计
select date(visit_time) ,count(*) '访问次数' from visit_log GROUP BY date(visit_time)
-- 统计日活
select date(visit_time) , count(distinct userid) '日活' from visit_log GROUP BY date(visit_time)
统计 班级 的平均成绩
sql
CREATE TABLE `t_score` (
`stu_id` int(11) NOT NULL,
`stu_class` int(11) DEFAULT NULL,
`score` decimal(22,2) DEFAULT NULL,
PRIMARY KEY (`stu_id`)
)
-- 统计 班级平均分在 60分一下的 班级 和成绩
select stu_class, avg(score) from t_score
GROUP BY stu_class
having avg(score)<60
统计 成绩
sql
create table t_class(
class_id int PRIMARY KEY,
class_name VARCHAR(100)
);
create table t_student(
stu_id int PRIMARY KEY,
stu_name VARCHAR(100),
class_id int
);
create table t_course(
course_id int PRIMARY KEY,
course_name VARCHAR(100)
);
create table t_score(
id int PRIMARY KEY,
stu_id int ,
course_id int,
score decimal(20,2)
);
INSERT into t_class (class_id,class_name) VALUES (1,'1班'),
(2,'2班'),(3,'3班')
INSERT into t_course (course_id,course_name) VALUES (1,'chinsee'),
(2,'math'),(3,'english')
INSERT into t_student (stu_id,stu_name,class_id) VALUES (1,'admin',1),
(2,'admin2',1),(3,'admin3',1),
(4,'admin4',1)
INSERT into t_student (stu_id,stu_name,class_id) VALUES (5,'we',2),
(6,'admin23',2),(7,'adm21212in3',2),
(8,'admin413223424',2),(9,'adminroot',2)
求出每个班级每一个科目的平均分
sql
select c.class_id ,co.course_id,AVG(s.score) from t_score s join t_course co on s.course_id = co.course_id
join t_student stu on s.stu_id = stu.stu_id
join t_class c
on stu.class_id = c.class_id
GROUP BY c.class_id , co.course_id