Skip to content

##现需要查询 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